1、gateway基本概念

是什么?
Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。
能干什么?
微服务的入口。2、gateway服务网关 - 图1gateway与zuul的区别?

  1. - Gateway是基于`异步非阻塞模型`上进行开发的,性能方面不需要担心。
  2. - gateway具有动态路由、Predicate(断言)和Filter(过滤器)特点,支持WebSocket,并且与Spring紧密集成拥有更好的开发体。
  3. - zuul为阻塞性框架;Gateway基于WebFlux+Netty 非阻塞+函数式框架

2、gateway三大核心概念

路由——目标方法
路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
断言(Predicate)——匹配条件
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
过滤器(Filter)——拦截器,拦截条件
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

3、gateway的工作流程

2、gateway服务网关 - 图2
step1:客户端向Spring Cloud GateWay 发出请求,然后再GateWay Handler Mapping中找到与请求相匹配的路由,将其发送到GateWay Web Handler。
step2:Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑中,然后返回。
step3:过滤器Filter和过滤器Fliter之间用虚线分开表明过滤器可能会在发送代理请求之前或者之后执行业务逻辑。

4、gateway的具体搭建

在gateway网关的yml文件中配置微服务项目的业务逻辑:

  1. cloud:
  2. gateway:
  3. routes:
  4. #新增网关配置1,配置微服务端8001select方法
  5. - id: payment8001_get #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  6. uri: http://localhost:8001 #匹配后提供服务的路由地址
  7. predicates:
  8. - Path=/payment/get/** # 断言,路径相匹配的进行路由

不通过网关访问微服务端:http://localhost:8001/payment/select/1
通过网关访问微服务端:http://localhost:9527/payment/select/1

5、gateway路由配置方式

方法1:通过yml文件配置

  1. #新增网关配置1,配置微服务端8001的select方法
  2. - id: querySinglePayment #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  3. uri: http://localhost:8001 #匹配后提供服务的路由地址
  4. predicates:
  5. - Path=/payment/select/** # 断言,路径相匹配的进行路由

方法2:编码方式,创建一个配置类,注入RouteLocator,添加@Bean组件

  1. @Configuration
  2. public class GateWayConfig {
  3. @Bean
  4. public RouteLocator routeLocator(RouteLocatorBuilder routeLocatorBuilder){
  5. RouteLocatorBuilder.Builder route= routeLocatorBuilder.routes();
  6. "getPort"-对应微服务端的方法名、"/port"对应微服务端的请求地址,"http://localhost:8001/port"表示匹配后的路由地址
  7. RouteLocator build = route.route("getPort", r -> r.path("/port").uri("http://localhost:8001/port")).build();
  8. return build;
  9. }
  10. }

6、gateway通过微服务名实现动态路由

通过网关实现多个微服务器的负载均衡。
修改gateway的yml配置文件:
step1:开启从注册中心动态创建路由功能,对服务名路由。
step2:#匹配后提供服务的路由地址url修改为微服务名称。
image.png

7、Predicate 断言

匹配断言,若为true,则执行路由;若为false,则不执行路由。
image.png
例如After Route Predicate 表示匹配在指定日期时间之后发生的请求,匹配成功,则执行路由,匹配不成功,则不执行。
image.png

8、Filter过滤器

使用过滤器,可以在请求被路由前或者后对请求进行修改。
一般自定义Filter类,实现 GlobalFilter,Ordered接口,自定义Filter拦截器。