整合服务网关gateway
# 前言
我们在上一篇文章基于docker-compose整合seata (opens new window)完成seata的整合,解决服务间分布式事务问题。
所以我们现在还剩下一个问题,服务统一调用问题:
如下图所示,我们目前服务间远程调用都是通过nacos服务注册和服务发现实现的,这就使得我们在调用时就无需关注调用细节。 但是用户如果需要分别调用这几个服务时问题就来了,如果我们需要分别调用三个服务,就需要通过不通端口进行调用,而且服务中可能还存在人证问题,如果按照现有架构进行调用我们就必须反反复复的在不同服务调用前进行人证。而且在服务高峰期我们进行扩容,若我们使用nginx进行代理,运维人员还必须一台一台的进行配置,非常繁琐。
总结起来,目前架构还存在三大问题:
- 统一调用
- 统一人证
- 服务统一配置

所以本章我们就引入gateway解决这些问题,通过gateway将架构转换为下图所示:

# gateway创建步骤
# 添加cloud-gateway子模块
我们首先创建一个名为cloud-gateway的maven模块,如下图所示:

# 引入服务注册和gateway依赖
完成后,我们需要引入服务注册和服务发现以及gateway的依赖
<dependencies>
<!--Spring Cloud Alibaba-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--Spring Cloud Alibaba-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 编写启动类并将服务注册到注册中心
如下所示,我们创建一个GateWayApplication 的启动类,并在类上方添加服务发现和启动类的注解。
@SpringBootApplication
@EnableDiscoveryClient
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class, args);
}
}
2
3
4
5
6
7
# 编写yml配置文件指向注册中心
我们希望gateway的配置交由nacos统一获取路由配置信息,所以我们需要编写一个bootstrap.yml指向注册中心地址,如下图所示

我们在配置文件中添加下面这样一段内容
spring:
application:
name: cloud-gateway
cloud:
nacos:
# 读取配置
config:
# 注册中心地址
server-addr: ip:8848
# cloud-gateway在注册中心配置文件格式
file-extension: properties
# 命名空间id
namespace: 63f0dbe6-ac91-4a2e-a88e-82b76f8187b6
2
3
4
5
6
7
8
9
10
11
12
13
14
# 配置注册中心
我们上面指定的nacos配置地址以及格式为properties,所以我们要在命名空间id为63f0dbe6-ac91-4a2e-a88e-82b76f8187b6下面创建一条cloud-gateway.properties(PS:yml配置对格式要求很高,笔者配置过程中经常出现失误导致各种意外情况,所以这里索性就采用properties)。
配置如下所示,每个配置的含义笔者都在注释中说明不多赘述了
# 应用名称为cloud-gateway
spring.application.name=cloud-gateway
# 端口号
server.port=8090
# 将gateway注册到nacos上
spring.cloud.nacos.discovery.server-addr=ip:8848
# 命名空间
spring.cloud.nacos.discovery.namespace=63f0dbe6-ac91-4a2e-a88e-82b76f8187b6
# 组名
spring.cloud.nacos.discovery.group=DEFAULT_GROUP
# 路由id名称,必须唯一
spring.cloud.gateway.routes[0].id=product-service
# 转发的路由地址,lb//服务名表示开启负载均衡,请求时交由注册中心轮询处理
spring.cloud.gateway.routes[0].uri=lb://product-service
# 断言配置,使用path进行匹配,只要是/system/**都进行转发
spring.cloud.gateway.routes[0].predicates[0].name=Path
spring.cloud.gateway.routes[0].predicates[0].args[0]=/product/**
# 路由id名称,必须唯一
spring.cloud.gateway.routes[1].id=account-service
# 转发的路由地址
spring.cloud.gateway.routes[1].uri=lb://account-service
# 断言配置,使用path进行匹配,只要是/system/**都进行转发
spring.cloud.gateway.routes[1].predicates[0].name=Path
spring.cloud.gateway.routes[1].predicates[0].args[0]=/account/**
# 路由id名称,必须唯一
spring.cloud.gateway.routes[2].id=order-service
# 转发的路由地址
spring.cloud.gateway.routes[2].uri=lb://order-service
# 断言配置,使用path进行匹配,只要是/system/**都进行转发
spring.cloud.gateway.routes[2].predicates[0].name=Path
spring.cloud.gateway.routes[2].predicates[0].args[0]=/order/**
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 启动服务和测试
我们将项目启动,可以看到命名空间中出现了gateway的服务

然后我们就可以进行测试了,将account-service启动。

根据上文的配置,我们使用8090的gateway端口+account-service映射即可请求到account-service
# 键入8090+account-service请求的映射
C:\Users\xxx>curl http://localhost:8090/account/getByCode/demoData
# 可以看到请求成功了
{"status":100,"message":"操作成功","data":{"id":2,"accountCode":"demoData","accountName":"demoData","amount":9998.00},"success":true,"timestamp":1675494643083}
2
3
4
5
6
# 更多关于gateway
本篇简单的搭建了一个gateway,我们会在后续教程中将gateway完善,关于gateway一些核心知识可以参考笔者写的这篇文章
微服务组件Gateway核心使用小结 (opens new window)