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

0、环境

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

1、项目结构

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

在这里插入图片描述
部署的时候,service-1我会部署两份,用来模拟多实例微服务的调用。

2、gateway服务实现

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

下面先实现gateway服务。

2.1、引入依赖



<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-gateway</artifactId>
   <version>3.0.1</version>
</dependency>

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
   <version>2021.1</version>
</dependency>

<!--负载均衡依赖不可少-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-loadbalancer</artifactId>
   <version>3.0.1</version>
</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.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
   <version>2021.1</version>
</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功能,复制一份调试配置,再覆盖端口配置参数即可,见下图:
在这里插入图片描述

此时,service-1就有两个实例了,分别启动三个服务,再看看nacos的服务注册列表,当然,前提是三个服务都正常启动。如下图:
在这里插入图片描述

3.1、发请求

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

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐