Spring Cloud Gateway 提供了一种默认转发的能力, 只要将 Spring Cloud Gateway 注册到服务中心, Spring Cloud Gateway 默认就会代理服务中心的所有服务.
一, 服务网关注册到注册中心
这里服务和注册中心使用前面博客中的 EurekaServer 和 EurekaClient. 服务网关注册到注册中心只需引入依赖包和增加配置.
1. 引入依赖包 spring-cloud-starter-netflix-eureka-client
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
2. 在 application.YAML 中增加配置
- server:
- port: 8081
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:8088/eureka/
- logging:
- level:
- org.springframework.cloud.gateway: debug
- spring:
- application:
- name: SpringCloudGatewayDemo
- cloud:
- gateway:
- discovery:
- locator:
- enabled: true
- routes:
- # - id: method_route
- # uri: http://www.cnblogs.com
- # predicates:
- # - Method=GET
- # - Path=/5ishare/{segment}
- - id: query_route
- uri: http://www.cnblogs.com
spring.cloud.gateway.discovery.locator.enabled: 是否与服务注册于发现组件进行结合, 通过 serviceId 转发到具体的服务实例. 默认为 false, 设为 true 便开启通过服务中心的自动根据 serviceId 创建路由的功能.
eureka.client.service-url.defaultZone 指定注册中心的地址, 以便使用服务发现功能
logging.level.org.springframework.cloud.gateway 调整相 gateway 包的 log 级别, 以便排查问题
3. 测试
依次启动 EurekaServer,EurekaClient,SpringCloudGatewayDemo. 在浏览器输入 http://localhost:8088/ , 如图一注册中心有 SPRING-CLOUD-PRODUCER,SPRINGCLOUDGATEWAYDEMO 两个应用.
输入 http://localhost:9003/hello?name=cuiyw ,EurekaClient 显示正常.
将 Spring Cloud Gateway 注册到服务中心之后, 网关会自动代理所有的在注册中心的服务, 访问这些服务的语法为: http:// 网关地址: 端口 / 服务中心注册 serviceId / 具体的 url.
输入时页面显示 EurekaClient 的内容.
二, 过滤器
Spring Cloud Gateway 的 Filter 的生命周期不像 Zuul 的那么丰富, 它只有两个:"pre" 和 "post".
PRE: 这种过滤器在请求被路由之前调用. 我们可利用这种过滤器实现身份验证, 在集群中选择请求的微服务, 记录调试信息等.
POST: 这种过滤器在路由到微服务以后执行. 这种过滤器可用来为响应添加标准的 HTTP Header, 收集统计信息和指标, 将响应从微服务发送给客户端等.
Spring Cloud Gateway 的 Filter 分为两种: GatewayFilter 与 GlobalFilter.GlobalFilter 会应用到所有的路由上, 而 GatewayFilter 将应用到单个路由或者一个分组的路由上.
Spring Cloud Gateway 内置了 9 种 GlobalFilter, 比如 Netty Routing Filter,LoadBalancerClient Filter,websocket Routing Filter 等, 根据名字即可猜测出这些 Filter 的作用, 具体大家可以参考官网内容: Global Filters
利用 GatewayFilter 可以修改请求的 Http 的请求或者响应, 或者根据请求或者响应做一些特殊的限制. 更多时候我们会利用 GatewayFilter 做一些具体的路由配置, 下面我们做一些简单的介绍.
我们以 AddRequestParameter GatewayFilter 来演示一下, 如何在项目中使用 GatewayFilter,AddRequestParameter GatewayFilter 可以在请求中添加指定参数.
1, 修改 EurekaClient
如下图所示, 启动了两个 EurekaClient 客户端, 为了区分, 在一个客户端实例增加了两个!!.
2. 增加 Filter 配置
- server:
- port: 8081
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:8088/eureka/
- logging:
- level:
- org.springframework.cloud.gateway: debug
- spring:
- application:
- name: SpringCloudGatewayDemo
- cloud:
- gateway:
- discovery:
- locator:
- enabled: true
- routes:
- - id: add_request_parameter_route
- uri: lb://spring-cloud-producer
- filters:
- - AddRequestParameter=name, cuiyw
- predicates:
- - Method=GET
- # - id: method_route
- # uri: http://www.cnblogs.com
- # predicates:
- # - Method=GET
- # - Path=/5ishare/{segment}
- - id: query_route
- uri: http://www.cnblogs.com
- predicates:
- - Query=name,cuiyw
- - RemoteAddr=192.168.0.1/16
- # - id: cookie_route
- # uri: http://www.cnblogs.com
- # predicates:
- # - Cookie=name,cuiyw
- # - Header=X-Request-Id, \d+
- # - id: time_route
- # uri: http://www.cnblogs.com
- # predicates:
- # -After=2019-11-03T10:20:06+08:00[Asia/Shanghai]
- # - Before=2019-11-03T10:55:06+08:00[Asia/Shanghai]
- # - Between=2019-11-03T11:01:06+08:00[Asia/Shanghai], 2019-11-03T11:05:06+08:00[Asia/Shanghai]
- # - id: neo_route
- # uri: http://www.cnblogs.com
- # predicates:
- # - Path=/5ishare
- # - id: header_route
- # uri: http://ityouknow.com
- # predicates:
- # - Header=X-Request-Id, \d+
- # - id: host_route
- # uri: http://ityouknow.com
- # predicates:
- # - Host=**.ityouknow.com
- # - id: host_route
- # uri: http://ityouknow.com
- # predicates:
- # - Path=/foo/{segment}
- # - id: query_route
- # uri: http://ityouknow.com
- # predicates:
- # - Query=keep, pu.
- # - id: remoteaddr_route
- # uri: http://ityouknow.com
- # predicates:
- # - RemoteAddr=192.168.126.218/24
- View Code
上面配置文件增加了 add_request_parameter_route 路由, 该路由作用是在 spring-cloud-producer 服务的 get 请求 url 增加参数, 类似在 url 的问号后面增加 key=value 键值对 name=cuiyw.
3. 测试
重启 EurekaClient 和 GateWay, 在浏览器中输入 http://localhost:8081/hello , 则交替出现如下两个页面的结果, 实现了服务化路由转发.
来源: https://www.cnblogs.com/5ishare/p/11831586.html