乐趣区

关于javascript:SpringCloud第十三篇Spring-Cloud-Gateway服务化和过滤器

1. 注册核心

1.1 筹备服务和注册核心

上篇次要解说了网关代理单个服务的应用语法,在理论的工作中,服务的互相调用都是依赖于服务中心提供的入口来应用,服务中心往往注册了很多服务,如果每个服务都须要独自配置的话,这将是一份很干燥的工作。Spring Cloud Gateway 提供了一种默认转发的能力,只有将 Spring Cloud Gateway 注册到服务中心,Spring Cloud Gateway 默认就会代理服务中心的所有服务,上面用代码演示。

在介绍 Zuul 的时候,咱们用到了 Eureka 和 producer,本次演示还是须要他们两个,将他们两个 CV 过去。(理解源码可 +WX:  haiwabbc)

1.2 服务网关注册到注册核心

上一篇用到的 gateway 也 CV 过去,在依赖文件外面退出:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

增加对 eureka 的依赖,在启动文件退出注解 @EnableEurekaClient。

批改配置文件 application.yml:

server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
logging:
  level:
    org.springframework.cloud.gateway: debug

配置阐明:

  • spring.cloud.gateway.discovery.locator.enabled:是否与服务注册于发现组件进行联合,通过 serviceId 转发到具体的服务实例。默认为 false,设为 true 便开启通过服务中心的主动依据 serviceId 创立路由的性能。
  • eureka.client.service-url.defaultZone 指定注册核心的地址,以便应用服务发现性能
  • logging.level.org.springframework.cloud.gateway 调整相 gateway 包的 log 级别,以便排查问题

批改实现后启动 gateway 我的项目,拜访注册核心地址 http://localhost:8761/ 即可看到名为 API-GATEWAY 的服务。

1.3 测试

将 gateway 注册到服务中心之后,网关会主动代理所有的在注册核心的服务,拜访这些服务的语法为:

http:// 网关地址:端口 / 服务中心注册 serviceId/ 具体的 url

比方咱们的 producer 我的项目有一个 /hello 的服务,拜访此服务的时候会返回:”hello “+name+”,producer is ready”。

比方拜访地址:http://localhost:8081/hello?name=spring,页面返回:hello spring,producer is ready。

依照下面的语法咱们通过网关来拜访,浏览器输出:http://localhost:8080/SPRING-CLOUD-PRODUCER/hello?name=spring 同样返回:hello spring,producer is ready。证实服务网关转发胜利。

咱们将我的项目 producer 复制一份为 producer1,将 /hello 服务的返回值批改为 hello spring,producer1 is ready。批改端口号为 8082,修完实现后重启,这时候拜访注册核心后盾会发现有两个名为 SPRING-CLOUD-PRODUCER 的服务。

在浏览器屡次拜访地址:http://localhost:8888/SPRING-CLOUD-PRODUCER/hello,页面交替返回以下信息:

hello spring,producer is ready。hello spring,producer1 is ready。

阐明后端服务主动进行了平衡负载。

2. 基于 Filter(过滤器) 实现的高级性能

在 Zuul 高级篇中大略介绍过 Filter 的概念。

Spring Cloud Gateway 的 Filter 的生命周期不像 Zuul 的那么丰盛,它只有两个:“pre”和“post”。

  • PRE:这种过滤器在申请被路由之前调用。咱们可利用这种过滤器实现身份验证、在集群中抉择申请的微服务、记录调试信息等。
  • POST:这种过滤器在路由到微服务当前执行。这种过滤器可用来为响应增加规范的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

Spring Cloud Gateway 的 Filter 分为两种:GatewayFilter 与 GlobalFilter。GlobalFilter 会利用到所有的路由上,而 GatewayFilter 将利用到单个路由或者一个分组的路由上。

Spring Cloud Gateway 内置了 9 种 GlobalFilter,比方 Netty Routing Filter、LoadBalancerClient Filter、Websocket Routing Filter 等,依据名字即可猜测出这些 Filter 的作者,具体大家能够参考官网内容:Global Filters

利用 GatewayFilter 能够批改申请的 Http 的申请或者响应,或者依据申请或者响应做一些非凡的限度。更多时候咱们会利用 GatewayFilter 做一些具体的路由配置,上面咱们做一些简略的介绍。

2.1 疾速上手 Filter 应用

咱们以 AddRequestParameter GatewayFilter 来演示一下,如何在我的项目中应用 GatewayFilter,AddRequestParameter GatewayFilter 能够在申请中增加指定参数。

2.1.1 配置 application.yml 示例

server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: add_request_parameter_route
          uri: http://localhost:8081
          filters:
            - AddRequestParameter=foo, bar
          predicates:
            - Method=GET
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
logging:
  level:
    org.springframework.cloud.gateway: debug

这里的 routes 手动指定了服务的转发地址,设置所有的 GET 办法都会主动增加 foo=bar,http://localhost:8081 是 producer 我的项目,咱们在此我的项目中增加一个 foo() 办法,用来接管转发中增加的参数 foo。

@RequestMapping("/foo")
public String foo(String foo) {return "hello"+foo+"!";}

批改实现后重启 gateway、producer 我的项目。拜访地址 http://localhost:8081/foo 页面返回:hello null!,阐明并没有承受到参数 foo;通过网关来调用此服务,浏览器拜访地址 http://localhost:8080/foo 页面返回:hello bar!,阐明胜利接管到参数 foo 参数的值 bar , 证实网关在转发的过程中曾经通过 filter 增加了设置的参数和值。

2.2 服务化路由转发

面咱们应用 uri 指定了一个服务转发地址,单个服务这样应用问题不大,然而咱们在注册核心往往会应用多个服务来独特撑持整个服务的应用,这个时候咱们就冀望能够将 Filter 作用到每个利用的实例上,spring cloud gateway 工了这样的性能,只须要简略配置即可。

为了测试两个服务提供者是否都被调用,咱们在 producer1 我的项目中也同样增加 foo() 办法。

@RequestMapping("/foo")
public String foo(String foo) {return "hello"+foo+"!@@@@";}

为了和 producer 中 foo() 办法有所区别,这里应用了多加了 4 个 @。同时将 gateway 我的项目配置文件中的 uri 内容批改如下:

# 格局为:lb:// 利用注册服务名
uri: lb://spring-cloud-producer

批改完之后,重新启动我的项目 gateway、producer1,浏览器拜访地址: http://localhost:8080/foo 页面交替呈现:

hello bar!
hello bar!@@@@

证实申请根据平均转发到后端服务,并且后端服务均接管到了 filter 减少的参数 foo 值。

这里其实默认应用了全局过滤器 LoadBalancerClient,当路由配置中 uri 所用的协定为 lb 时(以 uri: lb://spring-cloud-producer 为例),gateway 将应用 LoadBalancerClient 把 producer 通过 eureka 解析为理论的主机和端口,并进行负载平衡。

退出移动版