GVKun编程网logo

spring-cloud 学习四 服务网关(springcloud服务网关有什么作用)

29

本文将带您了解关于spring-cloud学习四服务网关的新内容,同时我们还将为您解释springcloud服务网关有什么作用的相关知识,另外,我们还将为您提供关于SpringCloud(13)服务网

本文将带您了解关于spring-cloud 学习四 服务网关的新内容,同时我们还将为您解释springcloud服务网关有什么作用的相关知识,另外,我们还将为您提供关于Spring Cloud (13) 服务网关-路由配置、Spring Cloud (14) 服务网关 - 过滤器、Spring Cloud 2.x之服务网关 Zuul过滤器、Spring Cloud Gateway 服务网关的实用信息。

本文目录一览:

spring-cloud 学习四 服务网关(springcloud服务网关有什么作用)

spring-cloud 学习四 服务网关(springcloud服务网关有什么作用)

  API Gateway

  服务网关在微服务中是一个很重要的组成部分,通过服务网关可以统一向外提供REST API,例如 / 映射到后端应用 /api/user 映射到 user service,  /api/comment 映射到comment service,在spring cloud中通过集成zuul来实现这个 gateway,他提供一下功能

    • Authentication
    • Insights
    • Stress Testing
    • Canary Testing
    • Dynamic Routing
    • Service Migration
    • Load Shedding
    • Security
    • Static Response handling
    • Active/Active traffic management

  

  我们使用两个服务,我们以user-provider-service来进行测试

  我们访问http://localhost:8081/users 可以看到如下输出,8081 就是user-provider-service服务的端口

 
[{"id":"1","name":"陈七","tel":null},{"id":"2","name":"王六","tel":null}]

  

  建一个api-gateway module

  pom文件

  

<parent>
        <groupId>com.dh.cloud</groupId>
        <artifactId>spring-cloud-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>


    <dependencies>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-sidecar</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
        </dependency>

    </dependencies>
View Code

 

 启动类

 

@SpringBootApplication
@EnableSidecar
public class AppGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(AppGatewayApplication.class, args);
    }

}
View Code

 

application.yml

server:
  port: 10000

sidecar:
  port: 8000

endpoints:
  restart:
    enabled: true
  shutdown:
    enabled: true
  health:
    sensitive: false

eureka:
  instance:
    hostname: gateway
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
View Code

 

bootstrap.yml

  

spring:
  application:
    name: api-gateway
  cloud:
    config:
      uri: http://localhost:8888
encrypt:
  failOnError: false
View Code

 

 

这里使用的都是默认配置,运行代码

访问http://localhost:10000/user-provider-service/users,10000为gateway的端口

看到输出

[{"id":"1","name":"陈七","tel":null},{"id":"2","name":"王六","tel":null}]

和直接访问服务一致,到此zuul一个简单的演示就完成了

 

Spring Cloud (13) 服务网关-路由配置

Spring Cloud (13) 服务网关-路由配置

传统路由配置

  所谓传统路由配置方式就是在不依赖于服务发现机制情况下,通过在配置文件中具体制定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由。没有Eureka服务治理框架帮助的时候,我们需要根据服务实例的数量采用不同方式的配置来实现路由规则:

  单实例配置:通过一组zuul.routes.<route>.path与zuul.routes.<route>.url参数的方式配置:

    zuul.routes.david-feign.path=/david-feign/**

    zuul.routes.user-service.url=http://localhost:8764/

  该配置实现了对符合/david-feign/**规则的请求转发到http://localhost:8764/地址的路由规则。比如当有一个请求http://localhost:8769/david-feign/hello 发送到API网关上,由于/david-feign/可以匹配path规则,所以API网关会转发请求到localhost:8764/hello地址

  多实例配置:通过一组zuul.routes.<route>.path与zuul.routes<route>.serviceId参数对的方式配置:

    zuul.routes.david-feign.path=/david-feign/**

    zuul.routes.david-feign.serviceId=david-feign

    ribbon.eureka.enable=false

    david-feign.ribbon.listOfServers=http://localhost:8080,http://localhost:8081/

  该配置实现了对符合/david-feign/**规则的请求转发路径到localhost:8080和localhost:8081两个实例地址的路由规则。它的配置方式与服务路由的配置方式一样,都采用了zuul.routes.<route>.path与zuul.routes.<route>.serviceId参数对的映射方式,只是这里的serviceId十由用户手工命名的服务名称,配合<serviceId>.ribbon.listOfServers参数实现服务与实例的维护。由于存在多个实例,API网关在进行路由转发时需要实现负载均衡策略,于是这里还需要Spring Cloud Ribbon的配合,由于在Spring Cloud Zuul中自带了对Ribbon的依赖,所以我们只需要做一些配置即可,比如上面实例中关于Ribbon的各个配置,他们的具体作用如下:

    ribbon.eureka.enable:由于zuul.routes.<route>.serviceId指定的是服务名称,默认情况下Ribbon会根据服务发现机制来获取配置服务名对应的实例清单。但是该示例并没有整合类似Eureka之类的服务治理框架,所以需要将该参数设置为false,不然配置的serviceId是获取不到对应实例清单的。

    david-feign.ribbon.listOfServers:该参数内容与zuul.routes.<route>.serviceId的配置相对应,开头的david-feign对应了serviceId的值,这两个参数的配置相当于在该应用内部手工维护了服务与实例的对应关系。

不论是但实例还是多实例的配置方式,我们都需要为每一对映射关系指定一个名称,也就是上面配置中的route,每一个route就对应了一条路由规则。每条路由规则都需要通过path属性来定义一个用来匹配客户端请求的路径表达式,并通过url或serviceId属性来指定请求表达式映射具体实例地址或服务名。

 

服务路由配置

  Spring Cloud Zuul通过与Spring Cloud Eureka整合,实现了对服务实例的自动化维护,所以在使用服务路由配置的时候,我们不需要向传统路由配置方式那样为serviceId去指定具体的服务实例地址,只需要通过一组zuul.routes.<route>.path与zuul.routes.<route>.serviceId参数对的方式配置即可。

比如下面的示例,它实现了对符合/david-feign/**规则的请求路径转发到名为david-feign的服务实例上去的路由规则,其中<route>可以指定为任意的路由名称。

  zuul.routes.api-a.path=/api-a/**

  zuul.routes.api-a.serviceId=david-feign

可以直接 拦截api-a的请求 去david-feign处理,对于上面这种还有一种更简单的方式:zuul.routes.<serviceId>=<path>:

  zuul.routes.david-feign=/api-a/**

 

http://localhost:8769/api-a/test

 

传统路由的映射方式比较直观而且容易理解,API网关直接根据请求的URL路径找到最匹配的path表达式,直接转发给该表达式对应的url货对应的servieId下配置的实例地址,以实现外部请求的路由。那么当采用path与serviceID以服务路由方式实现时候,没有配置任何实例地址的情况下,外部请求经过API网关的时候,它是如何被解析并转发服务具体实例的呢?

 

在Spring Cloud Netflix中,Zuul巧妙的整合了Eureka来实现面向服务的路由,实际上,我们可以直接将API网关也看做是Eureka服务治理下的一个普通微服务。他除了会讲自己注册到Eureka服务注册中心之外,也会从注册中心获取所有的服务以及他们的实例清单。所以在eureka的帮助下,API网关服务本身就已经维护了系统中所有serviceId与实例地址的映射关系。当有外部请求到大API网关的时候,根据请求的url路径找到最佳匹配的path规则,API网关就可以知道要将该请求路由到那个具体的serviceId上去。由于在API网关中已经知道serviceId对应服务实例的地址清单,那么只需要通过Ribbon的负载均衡策略,直接在这些清单中选择一个具体的实例进行转发就能完成路由工作了。

 

Spring Cloud (14) 服务网关 - 过滤器

Spring Cloud (14) 服务网关 - 过滤器

Spring Cloud Zuul 作为网关所具备的最基本的功能:路由,还具备另外一个核心的功能:过滤器。

过滤器

  通过 Spring Cloud Zuul 实现的路由功能,我们的微服务可以通过统一的 API 网关入口被客户端访问到了。但是他们的访问权限往往都需要一定的限制,系统并不会将所有的微服务接口都对他们开放。所以使用过滤器构建一个独立的服务来完成权限拦截。

 

新建 AuthFilter.java 继承 ZuulFilter 并重写 4 个方法:

public class AuthFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        Object accessToken = request.getParameter("accessToken");
        if(accessToken == null){
            System.out.println("没有权限验证");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            return null;
        }

        return null;
    }
}

filterType: 过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。这里定义为 pre,代表请求在路由之前执行。

filterOrder: 过滤器的执行顺序,当请求在一个阶段中存在多个过滤器时,需要根据该方法对所有请求都会生效。实际运用中我么可以利用该函数来指定过滤器的有效范围。

shouldFilter: 判断过滤器是否需要被执行,实际运用中可以利用这个函数指定过滤器的范围。

run:过滤器的具体逻辑,ctx.setSendZuulResponse (false) 使 zuul 过滤该请求,不对其进行路由,然后通过 setResponseStatusCode 设置了返回的状态吗,也可以通过 ctx.setResponseBody (body) 对其返回内容进行编辑等。

当自定义了过滤器后,还没有生效,需要为其创建具体的 bean 才能启动该过滤器,比如,在启动类中增加:

@EnableZuulProxy
@SpringCloudApplication
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

    @Bean
    public AuthFilter authFilter(){
        return new AuthFilter();
    }
}

重启 gateway 项目,

http://localhost:8769/api-a/test 显示 401

http://localhost:8769/api-a/test?accessToken=david 可以正常显示

 

Spring Cloud 2.x之服务网关 Zuul过滤器

Spring Cloud 2.x之服务网关 Zuul过滤器

  • Spring Cloud 2.x之整合工作流Activiti

  • IT工作?咋样的IT工作才是一个好工作?

  • Java开发5年,如何继续提升技术实力?

作者:Yibo

来源:https://www.cnblogs.com/chenweida/p/9025546.html

1、filter的作用

Spring Cloud 2.x系列之网关zuul入门(一)

Spring Cloud 2.x系列之网关zuul入门(二)

Spring Cloud 2.x系列之网关zuul入门(三)

      已经可以实现请求的路由功能,所有微服务应用提供的接口就可以通过统一的 API 网关入口被客户端访问到了。但是每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会将所有的微服务接口都对它们开放。然而目前的服务路由并没有限制权限这样的功能,所有请求都会被毫无保留地转发到具体的应用并返回结果。为了实现对客户端请求的安全校验和权限控制,最简单和粗暴的方法就是为每个微服务应用都实现一套用于校验签名和鉴别权限的过滤器或拦截器。但是这样的做法并不可取,它会增加日后的系统维护难度,因为同一个系统中的各种校验逻辑很多情况下都是大致相同或类似的,这样的实现方式会使得相似的校验逻辑代码被分散到了各个微服务中去,冗余代码的出现是我们不希望看到的。所以,比较好的做法是将这些校验逻辑剥离出去,构建出一个独立的鉴权服务。在完成了剥离之后,有不少开发者会直接在微服务应用中通过调用鉴权服务来实现校验,但是这样的做法仅仅只是解决了鉴权逻辑的分离,并没有在本质上将这部分不属于业余的逻辑拆分出原有的微服务应用,冗余的拦截器或过滤器依然会存在。对于这样的问题,更好的做法是通过前置的网关服务来完成这些非业务性质的校验。由于网关服务的加入,外部客户端访问我们的系统已经有了统一入口,既然这些校验与具体业务无关,那何不在请求到达的时候就完成校验和过滤,而不是转发后再过滤而导致更长的请求延迟。同时,通过在网关中完成校验和过滤,微服务应用端就可以去除各种复杂的过滤器和拦截器了,这使得微服务应用的接口开发和测试复杂度也得到了相应的降低。为了在 API 网关中实现对客户端请求的校验,需要使用到 Spring Cloud Zuul 的另外一个核心功能:过滤器。

       Zuul 允许开发者在 API 网关上通过定义过滤器来实现对请求的拦截与过滤,实现的方法非常简单。


2、Filter 的生命周期有 4 个,分别是 PRE、ROUTING、POST和ERROR,整个生命周期可以用下图来表示

Zuul 大部分功能都是通过过滤器来实现的,这些过滤器类型对应于请求的典型生命周期。

     PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

    ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用 Apache HttpClient 或 Netfilx Ribbon 请求微服务。

     POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

      ERROR:在其他阶段发生错误时执行该过滤器。 除了默认的过滤器类型,Zuul 还允许我们创建自定义的过滤器类型。例如,我们可以定制一种 STATIC 类型的过滤器,直接在 Zuul 中生成响应,而不将请求转发到后端的微服务。


3、Zuul 中默认实现的 Filter

类型 顺序 过滤器 功能
pre -3 ServletDetectionFilter 标记处理 Servlet 的类型
pre -2 Servlet30WrapperFilter 包装 HttpServletRequest 请求
pre -1 FormBodyWrapperFilter 包装请求体
route 1 DebugFilter 标记调试标志
route 5 PreDecorationFilter 处理请求上下文供后续使用
route 10 RibbonRoutingFilter serviceId 请求转发
route 100 SimpleHostRoutingFilter url 请求转发
route 500 SendForwardFilter forward 请求转发
post 0 SendErrorFilter 处理有错误的请求响应
post 1000 SendResponseFilter 处理正常的请求响应


4、禁用指定的 Filter

可以在 application.yml 中配置需要禁用的 filter,格式为

zuul.<SimpleClassName>.<filterType>.disable=true。

比如要禁用      org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter

就设置

zuul:
 SendResponseFilter:
   post:
     disable: true


5、自定义 Filter

       假设有这样一个场景,因为服务网关应对的是外部的所有请求,为了避免产生安全隐患,需要对请求做一定的限制,比如请求中含有 Token 便让请求继续往下走,如果请求不带 Token 就直接返回并给出提示。

       首先自定义一个 Filter,继承 ZuulFilter 抽象类,在 run() 方法中验证参数是否含有 Token,具体如下:

public class TokenFilter extends ZuulFilter {

   /**
    * 过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。
    * 这里定义为pre,代表会在请求被路由之前执行。
    *
    * @return
    */
   @Override
   public String filterType() {
       return "pre";
   }

   /**
    * filter执行顺序,通过数字指定。
    * 数字越大,优先级越低。
    *
    * @return
    */
   @Override
   public int filterOrder() {
       return 0;
   }

   /**
    * 判断该过滤器是否需要被执行。这里我们直接返回了true,因此该过滤器对所有请求都会生效。
    * 实际运用中我们可以利用该函数来指定过滤器的有效范围。
    *
    * @return
    */
   @Override
   public boolean shouldFilter() {
       return true;
   }

   /**
    * 过滤器的具体逻辑
    *
    * @return
    */
   @Override
   public Object run() {
       RequestContext ctx = RequestContext.getCurrentContext();
       HttpServletRequest request = ctx.getRequest();

       String token = request.getParameter("token");
       if (token == null || token.isEmpty()) {
           ctx.setSendZuulResponse(false);
           ctx.setResponseStatusCode(401);
           ctx.setResponseBody("token is empty");
       }
       return null;
   }
}

     在上面实现的过滤器代码中,通过继承ZuulFilter抽象类并重写了下面的四个方法来实现自定义的过滤器。这四个方法分别定义了:

       filterType():过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。这里定义为pre,代表会在请求被路由之前执行。

       filterOrder():过滤器的执行顺序。当请求在一个阶段中存在多个过滤器时,需要根据该方法返回的值来依次执行。通过数字指定,数字越大,优先级越低。

       shouldFilter():判断该过滤器是否需要被执行。这里我们直接返回了true,因此该过滤器对所有请求都会生效。实际运用中我们可以利用该函数来指定过滤器的有效范围。

      run():过滤器的具体逻辑。这里我们通过ctx.setSendZuulResponse(false)令 Zuul 过滤该请求,不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码,当然我们也可以进一步优化我们的返回,比如,通过ctx.setResponseBody(body)对返回 body 内容进行编辑等。

        在实现了自定义过滤器之后,它并不会直接生效,还需要为其创建具体的 Bean 才能启动该过滤器,比如在应用主类中增加如下内容:

@EnableZuulProxy
@SpringBootApplication
public class ApiGatewayApplication {

   public static void main(String[] args) {
       SpringApplication.run(ApiGatewayApplication.class, args);
   }

   @Bean
   public TokenFilter tokenFilter() {
       return new TokenFilter();
   }
}

    在对api-gateway服务完成了上面的改造之后,可以重新启动它,并发起下面的请求,对上面定义的过滤器做一个验证:

访问 

http://localhost:14000/consumer/hello/windmt 

返回 401 错误和token is empty

访问 

http://localhost:14000/consumer/hello/windmt?token=token 

正确路由到consumer的/hello接口,并返回Hello, windmt

     可以根据自己的需要在服务网关上定义一些与业务无关的通用逻辑实现对请求的过滤和拦截,比如:签名校验、权限校验、请求限流等功能。


关注JAVA乐园获取各种IT视频


觉得本文对你有帮助!请分享给更多人

关注「JAVA乐园」,提升IT技能 


推荐阅读:

  • Dubbo多注册中心和Zookeeper服务的迁移

  • 最近有人说我欺骗消费者,今天来一波视频分享

  • 生产者-消费者模式实现

更多精彩文章,请点击下方:阅读原文


本文分享自微信公众号 - JAVA乐园(happyhuangjinjin88)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Spring Cloud Gateway 服务网关

Spring Cloud Gateway 服务网关

学习在 Spring Cloud 中使用 Gateway 实现服务网关,包括基本使用、自动代理、 Predicate 、 Filter 等功能。

1 概述

Gateway 的主要功能如下:

  • 限流
  • 路径重写
  • 动态路由
  • 集成 Spring Cloud DiscoveryClient
  • 集成 Hystrix 断路器

和 Zuul 相比,有如下区别:

  1. Zuul 是 Netflix 公司的开源产品, Spring Cloud Gateway 是 Spring 家族中的产品,可以和 Spring 家族中的其他组件更好的融合。
  2. Zuul 不支持长连接(版本一),例如 Websocket 。
  3. Spring Cloud Gateway 支持限流。
  4. Spring Cloud Gateway 基于 Netty 来开发,实现了异步和非阻塞,占用资源更小,性能强于 Zuul 。

2 准备工作

2.1 服务注册

创建 Spring Boot 项目 gateway-client-provider ,作为我们的服务提供者,添加 Web/Eureka Client 依赖,如下:

最终的依赖如下:

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

项目创建成功后,修改 application.properties 配置文件,将 gateway-client-provider 注册到 Eureka Server 上(服务注册中心使用 Eureka Server ),如下:

# 当前服务的名称
spring.application.name=gateway-client-provider
# 当前服务的端口
server.port=7000

# 服务注册中心地址
eureka.client.service-url.defaultZone=http://127.0.0.1:1111/eureka

接下来,启动 Eureka Server ,待服务注册中心启动成功后,再启动 gateway-client-provider ,两者都启动成功后,访问 http://127.0.0.1:1111 可以看到 gateway-client-provider 的注册信息。


当然 gateway-client-provider 也可以集群化部署,下面对 gateway-client-provider 进行打包,之后我们在命令行启动两个 provider 实例:

java -jar gateway-client-provider-0.0.1-SNAPSHOT.jar --server.port=7000
java -jar gateway-client-provider-0.0.1-SNAPSHOT.jar --server.port=7001

最后在 gateway-client-provider 提供 hello 和 hello2 接口,用于后续服务消费者 gateway-client-consumer 来消费,如下:

@RestController
public class ProviderController {
    @Value("${server.port}")
    Integer port; // 支持启动多个实例,做负载均衡,用端口区分

    @GetMapping("/hello")
    public String hello() {
        return "hello cxy35: " + port;
    }

    @GetMapping("/hello2")
    public String hello2(String name) {
        return "hello " + name;
    }
}

2.2 服务消费

创建 Spring Boot 项目 gateway-client-consumer ,作为我们的服务消费者,添加 Eureka Client/Gateway 依赖,如下:

最终的依赖如下:

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

项目创建成功后,新建 application.yml 配置文件,将 gateway-client-consumer 注册到 Eureka Server 上(服务注册中心使用 Eureka Server ),如下:

# 当前服务的名称
spring:
  application:
    name: gateway-client-consumer
# 当前服务的端口
server:
  port: 7002

# 服务注册中心地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:1111/eureka

接下来,启动 gateway-client-consumer ,访问 http://127.0.0.1:1111 可以看到 gateway-client-consumer 的注册信息。

3 基本使用

Spring Cloud Gateway 支持两种不同的配置方法:编码配置、 YML 配置

  • 编码配置

gateway-client-consumer 项目启动类上配置一个 RouteLocator 类型的 Bean,就可以实现请求转发,如下:

@SpringBootApplication
public class GatewayClientConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayClientConsumerApplication.class, args);
    }

    @Bean
    RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("cxy35_route", r ->
                        r.path("/get").uri("http://httpbin.org")) // 这是一个测试的地址
                .build();
    }
}

配置完成后,重启项目,访问 http://127.0.0.1:7002/get 完成测试。


  • YML 配置

注释掉上述 Java 代码,再修改 gateway-client-consumer 中的 application.yml 配置文件:

# 当前服务的名称
spring:
  application:
    name: gateway-client-consumer
  cloud:
    gateway:
      routes:
        - id: cxy35_route
          uri: http://httpbin.org # 这是一个测试的地址
          predicates:
            - Path=/get
# 当前服务的端口
server:
  port: 7002

# 服务注册中心地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:1111/eureka

配置完成后,重启项目,访问 http://127.0.0.1:7002/get 完成测试。

4 结合微服务使用

修改 gateway-client-consumer 中的 application.yml 配置文件:

# 当前服务的名称
spring:
  application:
    name: gateway-client-consumer
  cloud:
    gateway:
      routes:
        - id: cxy35_route
          uri: http://httpbin.org # 这是一个测试的地址
          predicates:
            - Path=/get
      discovery:
        locator:
          enabled: true # 开启自动代理
# 当前服务的端口
server:
  port: 7002

# 服务注册中心地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:1111/eureka

logging:
  level:
    org.springframework.cloud.gateway: debug

接下来,就可以通过 Gateway 访问到其他注册在 Eureka 上的服务了,如 http://127.0.0.1:7002/GATEWAY-CLIENT-PROVIDER/hello ,注意大小写问题。

5 Predicate

路由配置 Route 中的 Predicate 支持多种配置方式:

  1. 通过时间匹配: After (表示在某个时间点之前进行请求转发)/ Before (表示在某个时间点之前进行请求转发)/ Between (表示在两个时间点之间,两个时间点用 , 隔开)。
spring:
  cloud:
    gateway:
      routes:
        - id: cxy35_route2
          uri: http://httpbin.org
          predicates:
            - After=2021-01-01T01:01:01+08:00[Asia/Shanghai]
  1. 通过请求方法匹配: Method
spring:
  cloud:
    gateway:
      routes:
        - id: cxy35_route2
          uri: http://httpbin.org
          predicates:
            - Method=GET
  1. 通过请求路径匹配: Path
spring:
  cloud:
    gateway:
      routes:
        - id: cxy35_route2
          uri: http://httpbin.org
          predicates:
            - Path=/2020/01/{segment}

上述配置表示路径满足 /2020/01/ 这个规则,都会被进行转发。

  1. 通过请求参数名或值匹配: Query
spring:
  cloud:
    gateway:
      routes:
        - id: cxy35_route2
          uri: http://httpbin.org
          predicates:
            - Query=name

上述配置表示请求中一定要有 name 参数才会进行转发,否则不会进行转发。

也可以同时指定参数名和参数值,例如参数的 key 为 name , value 必须要以 java 开始:

spring:
  cloud:
    gateway:
      routes:
        - id: cxy35_route2
          uri: http://httpbin.org
          predicates:
            - Query=name,java.*
  1. 多种匹配方式组合使用。
spring:
  cloud:
    gateway:
      routes:
        - id: cxy35_route2
          uri: http://httpbin.org
          predicates:
            - After=2021-01-01T01:01:01+08:00[Asia/Shanghai]
            - Method=GET
            - Query=name,java.*

6 Filter

Spring Cloud Gateway 中的过滤器分为两大类: GatewayFilter / GlobalFilter

比如 AddRequestParameter 过滤器会在请求转发路由的时候,自动额外添加参数,如:

spring:
  cloud:
    gateway:
      routes:
        - id: cxy35_route3
          uri: lb://gateway-client-provider
          filters:
            - AddRequestParameter=name,cxy35
          predicates:
            - Method=GET

配置完成后,重启项目,访问 http://127.0.0.1:7002/hello2 完成测试。


  • Spring Cloud 教程合集(微信左下方阅读全文可直达)。
  • Spring Cloud 教程合集示例代码:https://github.com/cxy35/spring-cloud-samples
  • 本文示例代码:https://github.com/cxy35/spring-cloud-samples/tree/master/spring-cloud-gateway

扫码关注微信公众号 程序员35 ,获取最新技术干货,畅聊 #程序员的35,35的程序员# 。独立站点:https://cxy35.com

关于spring-cloud 学习四 服务网关springcloud服务网关有什么作用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Spring Cloud (13) 服务网关-路由配置、Spring Cloud (14) 服务网关 - 过滤器、Spring Cloud 2.x之服务网关 Zuul过滤器、Spring Cloud Gateway 服务网关等相关知识的信息别忘了在本站进行查找喔。

本文标签:

上一篇解决ACPI Error: No handler for Region错误(acpi error method)

下一篇Cocos2dx使用OpenGL es建三维模型遮挡问题(cocos creator opengl)