zoukankan      html  css  js  c++  java
  • 微服务SpringCloud之GateWay服务化和过滤器

    Spring Cloud Gateway 提供了一种默认转发的能力,只要将 Spring Cloud Gateway 注册到服务中心,Spring Cloud Gateway 默认就会代理服务中心的所有服务。

    一、服务网关注册到注册中心

    这里服务和注册中心使用前面博客中的EurekaServer和EurekaClient。服务网关注册到注册中心只需引入依赖包和增加配置。

    1.引入依赖包spring-cloud-starter-netflix-eureka-client

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

    2.在application.yml中增加配置

    server:
      port: 8081
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8088/eureka/
    logging:
      level:
        org.springframework.cloud.gateway: debug
    spring:
      application:
        name: SpringCloudGatewayDemo
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true
          routes:
    #       - id: method_route
    #         uri: http://www.cnblogs.com
    #         predicates:
    #          - Method=GET
    #          - Path=/5ishare/{segment}
          - id: query_route
            uri: http://www.cnblogs.com

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

    3.测试

    依次启动EurekaServer、EurekaClient、SpringCloudGatewayDemo。在浏览器输入http://localhost:8088/,如图一注册中心有SPRING-CLOUD-PRODUCER、SPRINGCLOUDGATEWAYDEMO两个应用。

    输入http://localhost:9003/hello?name=cuiyw,EurekaClient显示正常。

     将 Spring Cloud Gateway 注册到服务中心之后,网关会自动代理所有的在注册中心的服务,访问这些服务的语法为:http://网关地址:端口/服务中心注册 serviceId/具体的url。

    输入http://localhost:8081/SPRING-CLOUD-PRODUCER/hello?name=cuiyw时页面显示EurekaClient的内容。

     二、过滤器

    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 做一些具体的路由配置,下面我们做一些简单的介绍。

    我们以 AddRequestParameter GatewayFilter 来演示一下,如何在项目中使用 GatewayFilter,AddRequestParameter GatewayFilter 可以在请求中添加指定参数。

    1、修改EurekaClient

    如下图所示,启动了两个EurekaClient客户端,为了区分,在一个客户端实例增加了两个!!。

    2.增加Filter配置

    server:
      port: 8081
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8088/eureka/
    logging:
      level:
        org.springframework.cloud.gateway: debug
    spring:
      application:
        name: SpringCloudGatewayDemo
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true
          routes:
           - id: add_request_parameter_route
             uri: lb://spring-cloud-producer
             filters:
             - AddRequestParameter=name, cuiyw
             predicates:
                - Method=GET
    #       - id: method_route
    #         uri: http://www.cnblogs.com
    #         predicates:
    #          - Method=GET
    #          - Path=/5ishare/{segment}
           - id: query_route
             uri: http://www.cnblogs.com
             predicates:
              - Query=name,cuiyw
              - RemoteAddr=192.168.0.1/16
    #       - id: cookie_route
    #         uri: http://www.cnblogs.com
    #         predicates:
    #           - Cookie=name,cuiyw
    #           - Header=X-Request-Id, d+
    #       - id: time_route
    #         uri: http://www.cnblogs.com
    #         predicates:
    #          -After=2019-11-03T10:20:06+08:00[Asia/Shanghai]
    #          - Before=2019-11-03T10:55:06+08:00[Asia/Shanghai]
    #          - Between=2019-11-03T11:01:06+08:00[Asia/Shanghai], 2019-11-03T11:05:06+08:00[Asia/Shanghai]
    #      - id: neo_route
    #        uri: http://www.cnblogs.com
    #        predicates:
    #          - Path=/5ishare
    
    #      - id: header_route
    #        uri: http://ityouknow.com
    #        predicates:
    #        - Header=X-Request-Id, d+
    #      - id: host_route
    #        uri: http://ityouknow.com
    #        predicates:
    #        - Host=**.ityouknow.com
    
    #      - id: host_route
    #        uri: http://ityouknow.com
    #        predicates:
    #        - Path=/foo/{segment}
    #      - id: query_route
    #        uri: http://ityouknow.com
    #        predicates:
    #         - Query=keep, pu.
    #      - id: remoteaddr_route
    #        uri: http://ityouknow.com
    #        predicates:
    #        - RemoteAddr=192.168.126.218/24
    View Code

    上面配置文件增加了add_request_parameter_route路由,该路由作用是在spring-cloud-producer服务的get请求url增加参数,类似在url的问号后面增加key=value键值对name=cuiyw.

    3.测试

    重启EurekaClient和GateWay,在浏览器中输入http://localhost:8081/hello,则交替出现如下两个页面的结果,实现了服务化路由转发。

     

  • 相关阅读:
    计算机视觉、机器学习相关领域论文和源代码大集合【转载】
    一试真伪:可以在12306上选择上中下卧铺吗
    给企业研发人员列一张数学清单【转载】
    向“生物力学之父”冯元桢先生学习什么?【转载】
    热消融影像引导
    Computer assisted surgery
    ASM, AAM
    Linux 下编译安装MySQL
    Linux下搭建FTP服务器
    自己瞎捣腾的Win7下Linux安装之路-----理论篇
  • 原文地址:https://www.cnblogs.com/5ishare/p/11831586.html
Copyright © 2011-2022 走看看