如图所示,是spring cloud gateway 集成 Nacos 实现负载均衡的架构图,下面演示一下整个实现过程,首先准备如下项目。
- spring-cloud-gateway-nacos-provider, 提供REST服务,并将服务注册到Nacos上。
- spring-cloud-gateway-nacos-consumer, 提供网关路由,基于Nacos 服务注册中心。
spring-cloud-gateway-nacos-provider服务的构建过程如下,该项目提供REST接口,并且将该注册到Nacos服务器上。
添加相关Jar包依赖,Spring Cloud 使用的版本为 Greenwich.SR2.
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter<artifactId> <version>2.1.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web<artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-nacos-discovery<artifactId> <version>2.1.1.RELEASE</version> </dependency>
- 创建NacosController, 提供一个/say 接口
1 @RestController 2 3 Public Class NacosController { 4 5 @GetMapping("/say") 6 Public String sayHello(){ 7 return "[spring-cloud-nacos-gatewayh-provider]:sayHello"; 8 } 9 10 }
- 在application.yml 中添加服务注册地址的配置
spring: application: name: spring-cloud-nacos-gateway-provider cloud: nacos: discovery: server-addr: 192.168.216.128:8848 server: port: 8080
为了演示请求负载,将 spring-cloud-gatewa-nacos-provider 部署两份,分别开放8080 和 8081端口。 服务启动成功之后,进入Nacos Dashboard 的服务列表。
spring-cloud-gateway-nacos-consumer 作为网关,会从Nacos 上根据服务名称获取目标URI进行服务调用。
添加Jar 依赖。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter<artifactId> <version>2.1.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web<artifactId> <version>2.1.2.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-nacos-discovery<artifactId> <version>2.1.1.RELEASE</version> </dependency>
- 在application.yml 中添加如下配置。
server: port: 8888 spring: application: name: spring-cloud-nacos-gateway-consumer cloud: nacos: discovery: server-addr: 192.168.216.128.8848 gateway: discovery: locator: enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由 lowerCaseServiceId: true routes: id: nacos-gateway-provider #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: lb://apring-cloud-nacos-gateway-provider #匹配后提供服务的路由地址 predicates: - Path=/nacos/** # 断言,路径相匹配的进行路由 filters: -StripPrifix=1
关键配置如下:
- lower-case-service-id: 是否使用service-id 的小写, 默认是大写。
- spring.cloud.gateway.discovery.locator.enabled: 开启从注册中心动态创建路由的功能。
- uri: 其中配置的lb://表示从注册中心获取服务,后面的spring-cloud-nacos-gateway-provider 表示目标服务在注册中心上得服务名。
通过curl指令访问网关,如果配置成功,将会正确返回目标服务的内容。
curl http://localhost:8888/nacos/say