在之前的文章介绍了 Spring Cloud Gateway 的 Predict(断言),Filter(过滤器), 大家对 Spring Cloud Gateway 有初步的认识, 其中在对服务路由转发的这一块, 在之前的文章是采用硬编码的方式进行路由转发. 这篇文章以案例的形式来讲解 Spring Cloud Gateway 如何配合服务注册中心进行路由转发.
工程介绍
本案例中使用 spring boot 的版本为 2.0.3.RELEASE,spring cloud 版本为 Finchley.RELEASE. 在中涉及到了三个工程, 分别为注册中心 eureka-server, 服务提供者 service-hi, 服务网关 service-gateway, 如下:
工程名 | 端口 | 作用 |
---|---|---|
eureka-server | 8761 | 注册中心 eureka server |
service-hi | 8762 | 服务提供者 eurka client |
service-gateway | 8081 | 路由网关 eureka client |
这三个工程中, 其中 service-hi,service-gateway 向注册中心 eureka-server 注册. 用户的请求首先经过 service-gateway, 根据路径由 gateway 的 predict 去断言进到哪一个 router, router 经过各种过滤器处理后, 最后路由到具体的业务服务, 比如 service-hi. 如图:
eureka-server,service-hi 这两个工程直接复制于我的另外一篇文章 https://blog.csdn.net/forezp/article/details/81040925 , 在这就不在重复, 可以查看源码, 源码地址见文末链接. 其中, service-hi 服务对外暴露了一个 RESTFUL 接口 "/hi" 接口. 现在重点讲解 service-gateway.
gateway 工程详细介绍
在 gateway 工程中引入项目所需的依赖, 包括 eureka-client 的起步依赖和 gateway 的起步依赖, 代码如下:
- <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-gateway</artifactId>
- </dependency>
在工程的配置文件 application.YAML 中 , 指定程序的启动端口为 8081, 注册地址, gateway 的配置等信息, 配置信息如下:
- server:
- port: 8081
- spring:
- application:
- name: sc-gateway-service
- cloud:
- gateway:
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:8761/eureka/
其中, spring.cloud.gateway.discovery.locator.enabled 为 true, 表明 gateway 开启服务注册和发现的功能, 并且 spring cloud gateway 自动根据服务发现为每一个服务创建了一个 router, 这个 router 将以服务名开头的请求路径转发到对应的服务. spring.cloud.gateway.discovery.locator.lowerCaseServiceId 是将请求路径上的服务名配置为小写 (因为服务注册的时候, 向注册中心注册时将服务名转成大写的了), 比如以 / service-hi/* 的请求路径被路由转发到服务名为 service-hi 的服务上.
在浏览器上请求输入 localhost:8081/service-hi/hi?name=1323, 网页获取以下的响应:
hi 1323 ,i am from port:8762
在上面的例子中, 向 gateway-service 发送的请求时, url 必须带上服务名 service-hi 这个前缀, 才能转发到 service-hi 上, 转发之前会将 service-hi 去掉. 那么我能不能自定义请求路径呢, 毕竟根据服务名有时过于太长, 或者历史的原因不能根据服务名去路由, 需要由自定义路径并转发到具体的服务上. 答案是肯定的是可以的, 只需要修改工程的配置文件 application.YAML, 具体配置如下:
- spring:
- application:
- name: sc-gateway-server
- cloud:
- gateway:
- discovery:
- locator:
- enabled: false
- lowerCaseServiceId: true
- routes:
- - id: service-hi
- uri: lb://SERVICE-HI
- predicates:
- - Path=/demo/**
- filters:
- - StripPrefix=1
在上面的配置中, 配置了一个 Path 的 predict, 将以 / demo/** 开头的请求都会转发到 uri 为 lb://SERVICE-HI 的地址上, lb://SERVICE-HI 即 service-hi 服务的负载均衡地址, 并用 StripPrefix 的 filter 在转发之前将 / demo 去掉. 同时将 spring.cloud.gateway.discovery.locator.enabled 改为 false, 如果不改的话, 之前的 localhost:8081/service-hi/hi?name=1323 这样的请求地址也能正常访问, 因为这时为每个服务创建了 2 个 router.
在浏览器上请求 localhost:8081/demo/hi?name=1323, 浏览器返回以下的响应:
hi 1323 ,i am from port:8762
返回的结果跟我们预想的一样.
源码下载
参考资料
- juejin.im/post/5aa4ea...
- https://www.jianshu.com/p/1c942a8abe18
- juejin.im/post/5ba8da...
扫一扫, 支持下作者吧
来源: https://juejin.im/post/5c1df125f265da61590ba7d2