首先,引入一个场景:
在微服务架构中,每个服务都是一个可以独立开发和运行的组件,而一个完整的微服务架构由一系列独立运行的微服务组成。其中每个服务都只会完成特定领域的功能,比如订单服务提供与订单业务场景有关的功能、商品服务提供商品展示功能等。各个微服务之间通过轻量级通信机制 REST API 或者 RPC 完成通信。 微服务之后在某些层面会带来一定的影响,比如,一个用户查看一个商品的详情,对于客户端来说,可能需要调用商品服务、评论服务、库存服务、营销服务等多个服务来完成数据的渲染
在这个场景中,客户端虽然能通过调用多个服务实现数据的获取,但是会存在一 些问题,比如:
1.客户端需要发起多次请求,增加了网络通信的成本及客户端处理的复杂性。
2.服务的鉴权会分布在每个微服务中处理,客户端对于每个服务的调用都需要重复鉴权。
3.在后端的微服务架构中,可能不同的服务采用的协议不同,比如有 HTTP、RPC 等。客户端如果需要调用多个服务,需要对不同协议进行适配。
网关旨在为微服务架构提供一种简单而有效的统一的API路由管理方式
网关就是系统的入口,封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、缓存、负载均衡、流量管控、路由转发等。
今天就来学习下网关之一的Spring Cloud GateWay。
Spring Cloud GateWay是什么?
GateWay是Spring生态系统上构建的API网关服务,基于Spring5,SpringBoot2和Project Reactor等技术。旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤功能,例如:限流、熔断、重试等。SpringCloud GateWay是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
请求流程如下图所示:
在微服务中的位置如图:
网关的作用:
1.性能:API高可用,负载均衡,容错机制。
2.安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
3.日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
4.缓存:数据缓存。
5.监控:记录请求响应数据,api耗时分析,性能监控。
6.限流:流量控制,错峰流控,可以定义多种限流规则。
7.灰度:线上灰度部署,可以减小风险。
8.路由:动态路由规则。
Spring Cloud GateWay的核心概念
1.Route 路由,它是网关的基础元素,包含ID、目标URI、断言、过滤器组成,当前请求到达网关时,会通过Gateway Handler Mapping,基于断言进行路由匹配,当断言为true时,匹配到路由进行转发
2.Predicate,断言,学过java8的同学应该知道这个函数,它可以允许开发人员去匹配HTTP请求中的元素,一旦匹配为true,则表示匹配到合适的路由进行转发
3.Filter,过滤器,可以在请求发出的前后进行一些业务上的处理,比如授权、埋点、限流等。
代码部分:
1.引入gateway的依赖
<!--引入gateway 网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
配置文件配置:
cloud:
# 网关配置
gateway:
# 路由配置:转发规则
routes: #集合。
# id: 唯一标识。默认是一个UUID
# uri: 转发路径
# predicates: 条件,用于请求网关路径的匹配规则
# filters:配置局部过滤器的
- id: gateway-provider
# 静态路由
# uri: http://localhost:8001/
# 动态路由
uri: lb://GATEWAY-PROVIDER
predicates:
- Path=/goods/**
filters:
- AddRequestParameter=username,zhangsan
- id: gateway-consumer
# uri: http://localhost:9000
uri: lb://GATEWAY-CONSUMER
predicates:
- Path=/order/**
# 微服务名称配置
discovery:
locator:
enabled: true # 设置为true 请求路径前可以添加微服务名称
lower-case-service-id: true # 允许为小写
测试后,可以通过不暴露各服务的端口信息,只需要通过gateway就可以访问其他服务。
Spring Cloud Gateway 的 Filter 分为两种:
GatewayFilter 与 GlobalFilter。
GlobalFilter 会应用到所有的路由上
GatewayFilter 将应用到单个路由或者一个分组的路由上。
全局过滤主要实现 GlobalFilter,Ordered这两个接口(全局日志记录、统一网关鉴权);
局部过滤主要通过配置文件进行配置过滤某个单一的.