Gateway是spring推出的新的网关组件用来代替Zuul网关微服务组件。Gateway使用的框架是WebFlux+Netty+Reactor实现的响应式的API网关。
注意:Gateway和Security进行集成时需要注意有很多坑,需要使用响应式的方式来进行集成配置。Security是使用的过滤器链进行安全校验的,其集成springboot(web框架是springMVC)的配置方式是使用命令式的方式进行集成的。在改成集成Gateway后,由于Gateway是使用响应式的web框架WebFlux,所以集成方式也要改成响应式的。
Gateway网关的其他功能:
1、限流
常用的限流算法:1.计数器算法 2.漏桶算法 3.令牌桶算法(漏桶算法的升级,可以使用redis作为令牌桶,gateway提供了相关的类RequestRateLimiterGatewayFilterFactory这个类,适用Redis和lua脚本实现了令牌桶的方式。具体实现逻辑在RequestRateLimiterGatewayFilterFactory类中)
2、鉴权
除登录注册、心跳检测等接口可直接放行外,其他接口需要有token才可访问,若在网关处未发现携带access_token或解析access_token无权限访问则直接拦截,此处可以集成Security进行鉴权
3、黑白名单
Gateway网关层的白名单实现原理是在过滤器内判断请求地址是否符合白名单,如果通过则跳过当前过滤器。如果有多个过滤器,则需要在每一个过滤器里边添加白名单判断。
Gateway网关配置示例及说明:
spring: application: name: gateway-server cloud: gateway: globalcors: cors-configurations: '[/**]': # 允许携带cookie allow-credentials: true # 允许跨域的源(网站域名/ip),设置*为全部 allowed-origins: - "http://localhost:8080" # 允许跨域请求里的head字段,设置*为全部 allowed-headers: "*" # 允许跨域的method, 默认为GET和OPTIONS,设置*为全部 allowed-methods: - GET - POST - DELETE - PUT - OPTIONS # 跨域允许的有效期 max-age: 3600 # 开启从注册中心动态创建路由的功能,利用微服务名进行路由 discovery: locator: enabled: true # 路由 routes: #系统服务 - id: sys-service-server # sys-service #路由名称 该名称任意写 uri: lb://sys-service-server # lb:load balance 负载均衡,后边跟要路由的地址 predicates: - Path=/sys/** # 断言,匹配路径规则 地址中包含/sys 请求会转发到系统微服务 filters: - StripPrefix=1 #转发请求到目标微服务,1代表去除一位前缀 /** 会被转发到其他微服务 # localhost:10010/sys/user /user这部分转发目标微服务