为什么需要网关
网关功能:
- 对用户请求做身份认证、权限校验
- 将用户请求路由到微服务,并实现负载均衡
- 对用户请求做限流
网关的技术实现
在SpringCloud中网关的实现包括两种:
- gateway
- zuul
- Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能
搭建网关服务
1、创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:
<!--网关依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--nacos服务发现依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2、编写路由配置及nacos地址
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 网关路由配置
- id: user-service # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
网关是个独立的服务,因此需要配置一个端口然后要配置
配置nacos,实现服务的注册和发现
允许有多个路由配置routes,每个路由配置只能有一个路由id
uri是路由的目的地址,可以直接写死目的地址,如 uri: http://127.0.0.1:8081,但是一般不这么使用
一般使用 uri: lb://userservice 这里的 userservice 是注册在服务注册中心的服务,因此上面需要配置nacos
那我们要将哪些请求转发到 userservice服务呢?这个就需要我们配置路由断言,路由断言判断哪些请求需要进行转发,我们这边只进行了Path断言条件,实际上还有很多,我额外写了一篇博客,大家可以参考
网关原理
当我们要访问一个具体服务时,不再访问其端口,而是访问网关服务的端口,网关就会将我们的请求再转发给对应的具体服务,如下
而网关具体就通过注册中心进行远程调用,如下
过滤器
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理
其作用时机如下