一.为什么需要服务网 关
两大特性:高可用和高性能
1、高性能:采用异步的方式调用服务。
在服务的调用方式上面,网关也有一定的要求,API 网关最好是支持 I/O 异步、同步非阻塞的,如果服务是同步阻塞调用,可以理解为微服务模块之间是没有彻底解耦的,即如果A依赖B提供的API,如果B提供的服务不可用将直接影响到A不可用,除非同步服务调用在API网关层或客户端做了相应的缓存。因此为了彻底解耦,在微服务调用上更建议选择异步方式进行。而对于 API 网关需要通过底层多个细粒度的 API 组合的场景,推荐采用响应式编程模型进行而不是传统的异步回调方法组合代码,其原因除了采用回调方式导致的代码混乱外,还有就是对于 API 组合本身可能存在并行或先后调用,对于采用回调方式往往很难控制。
2、高可用
二、网关包含三大属性
路由 Route:
Route 主要由 路由id、目标uri、断言集合和过滤器集合组成,那我们简单看看这些属性到底有什么作用。
(1)id:路由标识,要求唯一,名称任意(默认值 uuid,一般不用,需要自定义)
(2)uri:请求最终被转发到的目标地址
(3)order: 路由优先级,数字越小,优先级越高
(4)predicates:断言数组,即判断条件,如果返回值是true,则转发请求到 uri 属性指定的服务中
(5)filters:过滤器数组,在请求传递过程中,对请求做一些修改或对返回做一些修改
断言 Predicate:
Predicate 来自于 Java8 的接口。Predicate 接受一个输入参数,返回一个布尔值结果。Spring Cloud Gateway 内置了许多 Predicate ,这些 Predicate 的源码在 org.springframework.cloud.gateway.handler.predicate 包中,有兴趣可以阅读一下。内置的一些断言如下图:
过滤器 filter:
1、生命周期:
PRE:前置过滤器(2)基本上都带Request单词,这种过滤器在请求被路由目标服务之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
POST:后置过滤器(4)基本上都带Response单词,这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
2、作用范围
局部过滤器: GatewayFilter:应用到单个路由或者一个分组的路由上(需要在配置文件中配置)
全局过滤器: GlobalFilter:应用到所有的路由上(无需配置,全局生效)
三、基本配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
spring:
application:
name: gateway-app
cloud:
gateway:
routes:
- id: httpbin
uri: https://httpbin.org
predicates:
# 匹配路径
- Path=/abc/**
# 匹配请求参数 \d+ 表示数字
# - Query=id,\d+
# 匹配请求方法
# - Method=GET
# 匹配请求头
# - Header=X-Request-Id, \d+
filters:
# 在请求目标uri之前,截取路径上面的占位路径的个数
- StripPrefix=1
- AddRequestHeader=token, 123456