网关作为访问系统的入口,负载均衡是必选项而不是可选项,本文介绍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-alibaba-nacos-discovery</artifactId>
<version>2021.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,就到这里吧。