Gateway服务网关

一.为什么需要服务网 关

               两大特性:高可用和高性能

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

上一篇:Kafka 3.x.x 入门到精通(07)——Java应用场景——SpringBoot集成


下一篇:MySQL常见问题与解决方案详述