上章 “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"
}
}