一、初识 Gateway
1. 为什么需要网关
我们所有的服务可以让任何请求访问,但有些业务不是对外公开的,这就需要用网关来统一替我们筛选请求,它就像是房间的一道门,想进入房间就必须经过门。而请求想要访问微服务,就必须通过网关再到微服务。
2. 网关的作用
- 身份认证和权限校验
网关是微服务的入口,会验证用户是否有请求资格,如果没有则进行拦截
- 服务路由、负载均衡
网关不处理业务,根据拟定好的规则,将请求转发到对应的微服务中,这个过程就是路由。当对应的微服务有部署了多个,同样需要根据拟定的规则做负载均衡。
- 请求限流
请求量过高时,网关根据微服务能够接受的请求量来放行请求,避免服务压力过大。就像是红绿灯避免交通堵塞的原理类似。
在 SprignCloud 中网关的实现包括两种:
- gateway
- zuul:zuul 是基于 Servlet 实现的,属于阻塞式编程。而SpringCloudGateway 是基于 Spring5 中提供的 WebFlux, 属于响应式编程的实现,具备更好的性能。
二、入门案例
1. 创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖,如果没有统一管理版本号,需要加上<version></version>
<!--nacos服务注册发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2. 编写启动类
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
3. 路由配置及nacos地址
3.1 创建application.yml文件
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 网关路由配置(routes: 多个; route: 一个)
- id: user-service # 路由id,自定义,只要唯一即可
uri: lb://userservice # 第一种写法:路由的目标地址; lb(loadBalance)是指负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件(断言一般是布尔类型)
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
# 可以同时配置多个服务路由
- id: baidu-demo
uri: https://www.baidu.com # 第二种写法:路由的目标地址 http就是固定地址
predicates:
- Path=/baidu/** # 注意使用本服务测试需要开启下面截取path,不然拼接的路径无效
# filters:
# path断言路由的请求格式默认为uri+path,如果不需要携带path可以截取掉
# - StripPrefix=1 # 截取掉- Path中的第一级路径/baidu
# 初学期间为了方便调试与快速定位错误,可以将gateway打印日志级别调低
logging:
level:
org:
springframework:
cloud:
gateway: trace
路由的配置包括:
1.路由id:路由的唯一标示
2.路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
3.路由断言(predicates):判断路由的规则,一般是布尔类型
4.