springcloud gateway
1 为什么需要网关
传统的单体架构中只有一个服务开放给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,那么作为客户端如何去调用这些微服务呢?如果没有网关的存在,只能在本地记录每个微服务的调用地址。
无网关的微服务架构往往存在以下问题:
客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性。
认证复杂,每个服务都需要独立认证。
存在跨域请求,在一定场景下处理相对复杂。
2 网关的基本功能?
网关是所有微服务的门户,路由转发仅仅是最基本的功能,除此之外还有其他的一些功能,比如:认证、鉴权、熔断、限流、日志监控等等.........
3 为什么选择Spring cloud Gateway?
在1.x版本中都是采用的Zuul网关;但在2.x版本中,zuul的升级一直跳票,Spring Cloud最后自己研发了一个网关替代Zuul,那就是Spring Cloud Gateway。
肯定选择亲儿子Spring Cloud Gateway,它的很多思想都是借鉴zuul,所谓青出于蓝而胜于蓝,功能和性能肯定是优于zuul,不然Spring Cloud 为嘛要发布它?
Spring Cloud Gateway 基于Spring Boot 2.x、Spring WebFlux和[Project Reactor构建
4 Spring Cloud Gateway几个必知的术语?
路由(route):gateway的基本构建模块。它由ID、目标URI、断言集合和过滤器集合组成。如果聚合断言结果为真,则匹配到该路由。
断言(Predicate ):参照Java8的新特性Predicate,允许开发人员匹配HTTP请求中的任何内容,比如头或参数。
过滤器(filter):可以在返回请求之前或之后修改请求和响应的内容。
5 什么是断言
Predicate来自于java8的接口。Predicate接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。
可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。
Spring Cloud Gateway内置了许多Predict,这些Predict的源码在org.springframework.cloud.gateway.handler.predicate包中。
spring: cloud: gateway: ## 路由 routes: ## id只要唯一即可,名称任意 - id: gateway-provider_1 uri: http://localhost:9024 ## 配置断言 predicates: ## Path Route Predicate Factory断言,满足/gateway/provider/**这个请求路径的都会被路由到http://localhost:9024这个uri中 - Path=/gateway/provider/** ## Weight Route Predicate Factory,同一分组按照权重进行分配流量,这里分配了80% ## 第一个group1是分组名,第二个参数是权重 - Weight=group1, 8 ## id必须唯一 - id: gateway-provider_2 ## 路由转发的uri uri: http://localhost:9025 ## 配置断言 predicates: ## Path Route Predicate Factory断言,满足/gateway/provider/**这个请求路径的都会被路由到http://localhost:9024这个uri中 - Path=/gateway/provider/** ## Weight Route Predicate Factory,同一分组按照权重进行分配流量,这里分配了20% ## 第一个group1是分组名,第二个参数是权重 - Weight=group1, 2
routes下就是配置的路由策略,各个组件如下:
id:路由的唯一id,名称任意
uri:路由转发的uri
predicates:断言配置,可以配置多个
Spring Cloud Gateway中的断言命名都是有规范的,格式:xxxRoutePredicateFactory。
比如权重的断言:WeightRoutePredicateFactory,那么配置时直接取前面的Weight。
默认的路由转发如果路由到了两个,则是的按照配置先后顺序转发,上面都配置了路径:Path=/gateway/provider/**,如果没有配置权重,则肯定是转发到http://localhost:9024。
但是既然配置配置了权重并且相同的分组,则按照权重比例进行分配流量。
6 什么是过滤器
7 如何实现动态路由
8 如何自定义全局异常