进学阁

业精于勤荒于嬉,行成于思毁于随

0%

springboot项目中引用SpringCloudGateway

什么是网关

首先我们打开官网可以看到如下的描述:

SpringCloudGateway旨在提供一种简单而有效的方式来路由到API,并为它们提供跨领域的关注点,例如:安全性、监控/度量和弹性。

为什么要使用网关

当我们有多个服务的时候,前端需要访问服务的时候需要在前端维护好这几个服务的路径信息,这样的架构会有如下几个典型的问题:

  • 每个微服务都需要配置单独的访问域名,开通外网访问权限,每新增一个服务都需要先让运维人员配置好域名映射
  • 客户端需要维护所有微服务的访问地址,试想一下如果微服务有几十几百个呢?
  • 当服务需要对接口进行权限控制,必须要认证用户才能调用,那么所有的权限逻辑在服务端都要重新编写一套。

所以我们需要在微服务之前加一个网关服务,让所有的客户端只要访问网关,网关负责对请求进行转发;将权限校验逻辑放到网关的过滤器中,后端服务不需要再关注权限校验的代码;只需要对外提供一个可供外网访问的域名地址,新增服务后也不需要再让运维人员进行网络配置了,这样上面的架构就变成了通过网关转达到对应的服务

如何在springboot项目中引用网关

增加pom

我们从官网可以看到gateway需要的pom项,因为我们的服务都使用nacos所以需要加上nacos的pom项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>

由于springcloud2020弃用了Ribbon,因此Alibaba在2021版本nacos中删除了Ribbon的jar包,因此无法通过lb路由到指定微服务,出现了503情况。

所以只需要引入springcloud loadbalancer包即可

启动类

1
2
3
4
5
6
7
8
9
@EnableDiscoveryClient
@SpringBootApplication
public class LuckGatewayApplication {

public static void main(String[] args) {
SpringApplication.run(LuckGatewayApplication.class, args);
}

}

bootstap.yml

1
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
# Tomcat
server:
port: 1060

# Spring
spring:
application:
# 应用名称
name: luck-gateway
profiles:
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 你的nacos地址:8848
namespace: 5e81acf8-7ce3-42fe-b666-878b41d27fca
config:
# 配置中心地址
server-addr: 你的nacos地址:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
namespace: 5e81acf8-7ce3-42fe-b666-878b41d27fca

在nacos中建立网关的路由配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
cloud:
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
routes:
- id: luck-uid
uri: lb://luck-uid
predicates:
- Path=/uid/**
filters:
- StripPrefix=1

配置详解:

id: 在所有路由定义中需要唯一,不能重复
uri: lb://** lb://为固定写法,表示开启负载均衡; ** 即服务在Nacos中注册的名字
predicates:- Path=/uid/** 使用”Path Route Predicate Factory”,规则为/uid/** 的请求都还转发至微服务luck-uid中。

filters : - StripPrefix =1 若有StripPrefix过滤器时,gateway会根据StripPrefix=1所配的值(这里是1)去掉URL路径中的部分前缀(这里去掉一个前缀,即去掉lbs)