上章 “Gateway 搭建网关服务” 中,我们的 Gateway 网关路由配置中使用了写死的 uri 地址,如下:
spring: application: # 服务名称 name: gateway-demo01 # 网关路由配置 gateway: # 网关路由配置 routes: # 路由id,自定义,只要唯一集合 - id: service-order # 路由的目标地址 uri: http://localhost:8081 # 路由断言,也就是判断请求是否符合路由规则的条件 predicates: # 按照路径匹配,只要以 /order/ 开头就符合要求 - Path=/order/**
在实际生产环境中,不推荐将路由的 uri 地址写死。而且,将地址写死将会存在一些问题?如果相同服务存在多个实例,那么如何填写路由地址 uri 呢。
此时,我们可以引入 Nacos 的服务注册功能,并且实现负载均衡功能。Spring Cloud Gateway 自带负载均衡功能,它可以与服务注册中心(如 Eureka、Consul 等)集成,从而能够动态地发现服务实例并进行负载均衡。
在 pom.xml 中引入 Nacos 服务注册依赖,如下:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
改造上章节的配置文件,将绝对地址 http://localhost:8081 修改为 lb://service-order 地址,该地址表示开启了负载均衡(lb),并且通过服务名 service-order 到服务注册中心查找服务实例列表,然后通过负载均衡算法选择一个合适的实例进行调用。
配置如下:
server: # 网关端口 port: 9000 spring: application: # 服务名称 name: gateway-demo01 cloud: # nacos nacos: discovery: server-addr: localhost:8848 username: nacos password: nacos group: DEFAULT_GROUP # 网关路由配置 gateway: # 网关路由配置 routes: # 路由id,自定义,只要唯一集合 - id: service-order # 路由的目标地址,lb 就是负载均衡,后面跟服务名 # 需要集成 nacos 等服务注册中心 uri: lb://service-order # 路由断言,也就是判断请求是否符合路由规则的条件 predicates: # 按照路径匹配,只要以 /order/ 开头就符合要求 - Path=/order/**
注意:lb 表示负载均衡,全称 load balance。
启动网关服务,访问 nacos 查看服务信息,如下图:
然后,通过浏览器访问 http://localhost:9000/order/1 地址,Gateway 网关将该地址路由到 http://localhost:8081/order/1 地址,响应内容如下:
{ "id": 1, "title": "海尔冰箱335升 法式多门四开门冰箱 一级能效 风冷无霜 双变频省电 节能净味 家用大容量超薄变温 多门推荐 BCD-335WLHFD9DS9", "num": 1, "price": 2598, "userId": 1, "user": { "id": 1, "name": "张珊", "age": 27, "email": "zhangs@gmail.com" } }