Gateway网关
网关概述
-
网关指在微服务架构提供一种简单而有效的统一的API路由管理方式。
-
在微服务架构中,不同的微服务有不同的网络地址,各个微服务之间通过互相调用完成用户请求,客户端可能通过调用N个微服务的接口完成一个用户请求。
存在问题:
- 客户端多次请求不同的微服务,增加客户端的复杂性。
- 认证复杂,每个服务都要进行认证。
- http请求不同服务次数增加,性能不高。
-
网关就是系统的入口,封装了应用程序的内部结构,为客户提供统一服务,一些业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、缓存、负载均衡、流量监控、路由转发等 。
-
在目前的网关解决方案里,有Nginx+Lua、NetflixZuul、SpringCloud Gateway等等
Gateway静态路由(快速入门)
步骤:
-
搭建网关模块
-
引入依赖:starter-gateway
<!--引入gateway网关--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
-
编写启动类
@SpringBootApplication @EnableEurekaClient public class ApiGatewayApp { public static void main(String[] args) { SpringApplication.run(ApiGatewayApp.class,args); } }
-
编写配置文件
server: port: 80 spring: application: name: api-gateway-server cloud: gateway: routes: #集合 #id:唯一标识,默认是一个UUID #url:转发路径 #predicates:条件,用于请求网关路径的匹配规则 - id: gateway-provider uri: http://localhost:8001/ #静态路由 predicates: - Path=/goods/** #P为大写 - id: gateway-provider uri: http://localhost:9000/ #静态路由 predicates: - Path=/order/** #P为大写
-
启动测试类
Gateway动态路由
步骤 :
-
引入eureka-client配置
<!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
修改uri属性:uri: lb://服务名称
server: port: 80 spring: application: name: api-gateway-server cloud: gateway: routes: #集合 #id:唯一标识,默认是一个UUID #url:转发路径 #predicates:条件,用于请求网关路径的匹配规则 #服务方 - id: gateway-provider # uri: http://localhost:8001/ uri: lb://GATEWAY-PROVIDER #动态路由 predicates: - Path=/goods/** #消费方 - id: gateway-consumer uri: lb://GATEWAY-CONSUMER #动态路由 predicates: - Path=/order/** eureka: client: service-url: defaultZone: http://localhost:8761/eureka
Gateway微服务名称配置
server:
port: 80
spring:
application:
name: api-gateway-server
cloud:
gateway:
routes: #集合
#id:唯一标识,默认是一个UUID
#url:转发路径
#predicates:条件,用于请求网关路径的匹配规则
- id: gateway-provider
# uri: http://localhost:8001/
uri: lb://GATEWAY-PROVIDER
predicates:
- Path=/goods/**
- id: gateway-consumer
uri: lb://GATEWAY-CONSUMER
predicates:
- Path=/order/**
#微服务名称配置
discovery:
locator:
enabled: true #设置为true,请求路径前可以添加微服务名称
lower-case-service-id: true #允许为小写
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
Gateway过滤器
Gateway过滤器概述
- Gateway支持过滤器功能,对请求或响应进行拦截,完成一些通用操作
- Gateway提供两种过滤器方式:“pre” 和 “post”
- pre过滤器是在转发之前执行,可以做参数校验、权限校验、流量监控、日志输出、协议转换等
- post过滤器在响应之前执行,可以做响应内容、响应头的修改,日志的输出,流量监控等
- Gateway还提供了两种类型过滤器
- GatewayFilter:局部过滤器,针对单个路由
- GlobalFilter:全局过滤器,针对所有路由
Gateway局部过滤器
-
GatewayFilter:局部过滤器,针对单个路由
-
在SpringCloud Gateway组件中提供了大量内置的局部过滤器,对请求和响应做过滤操作
-
遵循约定大于配置的思想,只需要在配置文件配置局部过滤器名称,并为其指定对应的值,就可以让其生效
例如:
filters: - AddRequestParameter=username,password
Gateway全局过滤器
-
GlobalFilter全局过滤器,不需要在配置文件中配置,系统初始化时加载,并作用在每个路由上
-
SpringCloud Gateway 核心的功能也是通过内置的全局过滤器来完成
-
自定义全局过滤器步骤:
-
定义类实现GlobalFilter(全局过滤器)和Ordered(排序)接口
@Component public class MyFilter implements GlobalFilter,Ordered { }
-
复写方法
@Component public class MyFilter implements GlobalFilter,Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("全局过滤器执行了"); return chain.filter(exchange);//放行 } /** * 过滤器排序 * @return 数的值越小,越先执行 */ @Override public int getOrder() { return 0; } }
-
完成逻辑处理
-