gateway
为什么要用网关
如果不用网关
- 客户端需要发起多次请求,增加网络通信的成本以及客户端处理的复杂性
- 服务的鉴权会分布在每个微服务中处理,客户端对于每个服务的调用都需要重复鉴权。
- 可能不同服务采用不同的协议,比如HTTP RCP,客户端需要调用多个服务,需要对不同协议进行适配。
网关的作用
- 针对所有请求进行统一鉴权,限流,熔断,日志。
- 协议转换。针对多种不同协议,在网关层可以统一处理后以HTTP对外提供服务。
- 统一错误码处理。
- 请求转发,并且可以基于网关实现内外网的隔离。
在网关层进行请求拦截,获取请求中附带的用户身份信息,调用统一认证中心对请求进行身份认证,在确认了身份之后再检查是否有资源的访问权限。
网关的本质是对请求进行路由转发以及对请求前置和后置的过滤。
- 请求的转发和路由:接收客户端的所有请求,并将请求转发到后端服务中,提供统一的业务接口给客户端
- 过滤:网关会拦截所有的请求来完成一系列的横切工作,比如鉴权,限流。
配置文件
spring:
cloud:
gateway:
routes:
- id: define_filter
predicates:
- Path=/gateway/**
filters:
- name: xppDefine
args:
name: xpp
- name: RequestRateLimiter
args:
denyEmptyKey: false
emptyKeyStatus: SERVICE_UNAVAILABLE
keyResolver: '#{@ipAddressKeyResolver}'
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 2
- StripPrefix=1
uri: http://localhost:8080/say
-
id:自定义路由ID 保持唯一。
- uri:目标服务地址,支持普通URI以及lb://应用注册服务名称,后者表示从注册中心获取集群服务地址。
- predicates:路由条件,根据匹配的结果决定是否执行该请求路由。
- filters:过滤规则,包含pre和post过滤。其中StripPrefix=1,表示gateway根据该配置的值去掉URL路径的部分前缀,1表示去掉一个前缀,即在转发的目标URI中去掉gateway
gateway相关概念:
- 路由(Route):它是网关的基本组件,由ID,目标URI,predicates,filters集合组成
- 谓词(Predicate):java8进入的函数式接口,提供断言功能。可以匹配HTTP请求中的任何内容。如果Predicate集合判断结果为true,则意味着请求会被当前Router进行转发。
- 过滤器(Filter):为请求提供前置和后置过滤
当客户端发送一个请求到网关时,网关会根据一系列Predicate的匹配结果决定访问哪个Route路由,然后过滤器链进行请求的处理,过滤器链可以在请求发送到后端服务器前和后执行。
这就是网关的大体介绍了,网关可以鉴权、熔断、限流、路由转发。其实网关最重要的就是路由和谓词两部分。