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

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)