今天主要是总结的SpringCloud中的网关:由于每一个为服务的地址都有可能发生变化,无法直接对外公布这些服务的地址,基于安全和高内聚低耦合等的设计理念,我们有必要将内部系统和外部系统做一个切割
所谓服务网关:专门处理外部请求的组 件它的主要功能有:
是Netfix公司提供的网关服务
功能:
1.创建项目,添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
配置:
server:
port: 8006
spring:
application:
name: zuul
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8001/eureka
zuul:
routes:
provider: /fan/**
openFegin: /feginDemo/**
# 忽略某一类地址
ignored-patterns: /**/hello/**
#忽略某一个服务
ignored-services: provider
在启动类上添加开启网关代理
@SpringBootApplication
@EnableZuulProxy //开启网关代理
@EnableEurekaClient
public class ZuuldemoApplication {
public static void main(String[] args) {
SpringApplication.run(ZuuldemoApplication.class, args);
}
}
之后我们就可以通过:
http://localhost:8006/feginDemo/fegin/hello
访问到在feginDemo服务中的hello接口
package com.zuul.zuuldemo.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
public class PremissFilter extends ZuulFilter {
/**
* 过滤器类型,权限判断一般是pre
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 过滤器的优先级
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 是否过滤
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 核心的过滤方法逻辑
* @return 暂时这个返回值无用
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
/**
* 获取当前请求
*/
HttpServletRequest request = ctx.getRequest();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+password);
if(!"fan".equals(username) || !"123456".equals(password)){
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(7001);
ctx.setResponseBody("请求不合法");
ctx.addZuulResponseHeader("content-type", "text/html; charset=UTF-8");
}
return null;
}
}
1.创建springboot集成Gateway模块
2.配置:
server:
port: 8007
spring:
application:
name: gatewaydemo
cloud:
gateway:
routes:
- id: fan # 路由 ID,唯一
uri: lb://provider # lb:// 根据服务名称从注册中心获取服务请求地址
predicates: # 断言(判断条件)
- Path=/provider/**
discovery:
locator:
enabled: true #开启自动代理
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8001/eureka
主要有两种:
GatewayFilter:网关过滤器,需要通过 spring.cloud.routes.filters 配置在具体路由下,只作用在当前路由上或通过 spring.cloud.default-filters 配置在全局,作用在所有路由上。
GlobalFilter:全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过 GatewayFilterAdapter 包装成 GatewayFilterChain 可识别的过滤器,它为请求业务以及路由的 URI 转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。
过滤器我们之后再细说
原文:https://www.cnblogs.com/yjfb/p/12760576.html