spring cloud 之 Gateway
网关旨在为微服务架构提供一种简单而有效的统一的API路由管理方式
在微服务架构中,不同的微服务可以有不同的网络地址,各个微服务之间通过互相调用完成用户请求,客户端可能通过调用N个微服务的接口完成一个用户请求
存在的问题:
- 客户端多次请求不同的微服务,增加客户端的复杂性
- 认证复杂,每个服务都要进行认证
- http请求不同服务次数增加,性能不高
网关就是系统的入口,封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、缓存、负载均衡、流量管控、路由转发等
在目前的网关解决方案里,有Nginx+ Lua、Netflix Zuul 、Spring Cloud Gateway等等
1、Gateway的搭建
- 注入依赖
-
<dependencies> <!--引入gateway 网关--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!-- eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
注意:不能加 web这个文件,否则你会很开心,如果需要动态配置的话,需要添加eureka坐标
-
- 启动类需要添加eureka注解
- 编写配置类
- 1.静态编写配置类
-
server: port: 80 spring: application: name: api-gateway-server cloud: # 网关配置 gateway: # 路由配置:转发规则 routes: #集合。 # id: 唯一标识。默认是一个UUID # uri: 转发路径 # predicates: 条件,用于请求网关路径的匹配规则 # filters:配置局部过滤器的 - id: gateway-provider # 静态路由 uri: http://localhost:8001/ predicates: - Path=/goods/**
-
- 动态编写配置 从Eureka中动态获取
-
-
1 server: 2 port: 80 3 4 spring: 5 application: 6 name: api-gateway-server 7 8 cloud: 9 # 网关配置 10 gateway: 11 # 路由配置:转发规则 12 routes: #集合。 13 # id: 唯一标识。默认是一个UUID 14 # uri: 转发路径 15 # predicates: 条件,用于请求网关路径的匹配规则 16 # filters:配置局部过滤器的 17 - id: gateway-provider 18 # 静态路由 19 uri: http://localhost:8001/ 20 predicates: 21 - Path=/goods/** 22 eureka: 23 instance: 24 hostname: localhost 25 client: 26 service-url: 27 defaultZone: http://eureka-server:10086/eureka
-
-
- 1.静态编写配置类
微服务名称配置
1 # 微服务名称配置 2 discovery: 3 4 locator: 5 6 enabled: true # 设置为true 请求路径前可以添加微服务名称 7 lower-case-service-id: true # 允许为小写
解决服务过多可能存在的路径冲突问题
http://localhost:10010/eureka-consumer/order/goods/1
2、Gateway过滤器
Gateway支持过滤器功能,对请求或者响应进行拦截
pre 过滤器,在转发之前执行,可以做参数校验、权限校验、流量监控、日志输出、协议转换等。
post 过滤器,在响应之前执行,可以做响应内容、响应头的修改,日志的输出,流量监控等。
Gateway 还提供了两种类型过滤器
局部过滤器配置方式:
1 server: 2 port: 80 3 spring: 4 application: 5 name: api-gateway-server 6 cloud: 7 # 网关配置 8 gateway: 9 # 路由配置:转发规则 10 routes: #集合。 11 # id: 唯一标识。默认是一个UUID 12 # uri: 转发路径 13 # predicates: 条件,用于请求网关路径的匹配规则 14 # filters:配置局部过滤器的 15 16 - id: gateway-provider 17 # 静态路由 18 # uri: http://localhost:8001/ 19 # 动态路由 20 uri: lb://GATEWAY-PROVIDER 21 predicates: 22 - Path=/goods/** 23 filters: 24 - AddRequestParameter=username,zhangsan 25 #该过滤器会在请求同上添加请求参数
这个参数后端可以直接接受到
全局过滤器配置
定义类实现GlobalFilter和Ordered接口
重写方法
添加注解 ,注入ioc容器
1 @Component 2 public class MyFilter implements GlobalFilter, Ordered { 3 @Override 4 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { 5 6 System.out.println("自定义全局过滤器执行了~~~"); 7 8 return chain.filter(exchange);//放行 9 } 10 11 /** 12 * 过滤器排序 13 * @return 数值越小 越先执行 14 */ 15 @Override 16 public int getOrder() { 17 return 0; 18 } 19 }