13-springcloud gateway集成nacos实现负载均衡

网关作为访问系统的入口,负载均衡是必选项而不是可选项,本文介绍gateway与nacos集成,实现负载均衡的过程。关于springcloud gateway的基本用法,同学可以看看上篇文章: 12-使用gateway作为网关。

0、环境

  • jdk:1.8
  • springboot:2.4.2
  • nacos:2.0.3

1、项目结构

整体的项目目录结构如下:

13-springcloud gateway集成nacos实现负载均衡_第1张图片
部署的时候,service-1我会部署两份,用来模拟多实例微服务的调用。

2、gateway服务实现

请求过程:客户端发请求,请求到达gateway,gateway识别请求并处理,再按照负载均衡算法选择一个服务转发请求。

下面先实现gateway服务。

2.1、引入依赖



<dependency>
   <groupId>com.alibaba.cloudgroupId>
   <artifactId>spring-cloud-starter-gatewayartifactId>
   <version>3.0.1version>
dependency>

<dependency>
   <groupId>com.alibaba.cloudgroupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
   <version>2021.1version>
dependency>


<dependency>
   <groupId>org.springframework.cloudgroupId>
   <artifactId>spring-cloud-starter-loadbalancerartifactId>
   <version>3.0.1version>
dependency>

2.2、application.yml

正如我们设想的一样,要使用nacos作为注册中心,肯定要配置服务发现,全量配置代码如下:

server:
  port: 9080

spring:
  application:
    name: gateway

  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.99:8848
        namespace: dev
        group: group1
        cluster-name: Claster-A
        service: gateway
    gateway:
      discovery:
        locator:
          enabled: true

      routes:
        - id: 001
          uri: lb://service-1    #匹配后端提供服务的路由地址,注意lb开头,表示启用负责均衡
          predicates:
            - Path=/sample/service1/say/**         # 断言,路径相匹配的进行路由
          filters:
            - StripPrefix=2


关键的两个配置,一个是配置了nacos服务注册与发现的服务地址,另一个配置了网关转发的相关参数,注意,uri的配置是“lb”开头,代表了可以负载均衡,与普通的uri写法不同。

3、service-1的实现

3.1、引入依赖

只需要引入nacos服务发现的依赖,代码如下:

<dependency>
   <groupId>com.alibaba.cloudgroupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
   <version>2021.1version>
dependency>

3.2、application.yml

service-1的实现与gateway基本相同,不同的是,service-1不需要配置网关转发的相关配置。application.yml配置文件如下:

server:
  port: 9081

spring:
  application:
    name: service-1

  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.99:8848
        namespace: dev
        group: group1
        cluster-name: Claster-A
		service: service-1

2.3、controller实现

这个就不多少说了,写个controller即可,代码如下:

@RestController
@RequestMapping("/say")
public class SomethingToSay {

    @GetMapping("/hello")
    public String sayHello() {
        return "Server " + port + ": hello";
    }

    @GetMapping("/hi")
    public String sayHi() {
        return "Server " + port + ": hi";
    }

    @GetMapping("/ohh")
    public String sayOhh() {
        return "Server " + port + ": ohh";
    }
	
	@Value("${server.port}")
    private Integer port;
}

3、测试

由于service-1需要启动两份,所以先利用idea的Run/Debug Configurations功能,复制一份调试配置,再覆盖端口配置参数即可,见下图:
13-springcloud gateway集成nacos实现负载均衡_第2张图片

此时,service-1就有两个实例了,分别启动三个服务,再看看nacos的服务注册列表,当然,前提是三个服务都正常启动。如下图:
13-springcloud gateway集成nacos实现负载均衡_第3张图片

3.1、发请求

现在万事俱备,就差发射了,咱们利用apifox发个请求试试,看负载均衡的效果:
13-springcloud gateway集成nacos实现负载均衡_第4张图片
当我连续点击发送请求时,端口号会发生变化,也就是说我们的请求分别落在了两个服务实例上。
OK,就到这里吧。

你可能感兴趣的:(微服务,spring,cloud,gateway,负载均衡)