SpringCloud-网关 Gateway

这篇具有很好参考价值的文章主要介绍了SpringCloud-网关 Gateway。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、网关初识

  官方地址:SpringCloud Gateway
  网关统一了服务的入口,可以方便实现对众多服务接口进行管控,对访问服务的身份认证,防报文重放与防数据篡改,功能调用的业务鉴权,响应数据的脱敏,流量与并发控制,甚至基于API调用的计量或者计费等等。更通俗理解,网关可以看成是路由转发以及过滤器的共同作用,路由转发接受一切外界的请求,然后转发到后端的微服务中;而过滤器在服务网关中可以完成一系列的横切功能,比如权限校验,限流以及监控等。
SpringCloud-网关 Gateway
  在SpringCloud的官网中则指出其提供了一个在SpringMVC之上构建API网关的库。SpringCloudGateway旨在提供一种简单而有效的方法来路由到API,并为API提供横切关注点,比如:安全性、监控/度量和弹性。
  SpringCloud Gateway在特性方面,官网中也给出了说明:

-基于Spring Framework 5、Project Reactor和Spring Boot 2.0构建
-能够在任何请求属性上匹配路由,即动态路由
-断言和过滤器对于路由是特定的
-路径重写
-请求速率限制

二、网关的使用

1.创建项目并引入依赖

<!--引入gateway网关依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2.编写网关配置

  本文当中继续使用之前的商品和用户服务模块,这里给出相关配置信息:

server:
  port: 9000
spring:
  application:
    name: PRODUCT
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka #指定服务注册中心的地址
-------------------------------------------------------------------------------------
server:
  port: 8999
spring:
  application:
    name: USER
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka #指定服务注册中心的地址

  网关的配置如下:

server:
  port: 8989
spring:
  application:
    name: GATEWAY

  cloud:
    gateway:
      routes:
        - id: user_route #指定路由的唯一标识
          uri: http://localhost:8999 #指定路由服务的地址
          predicates:
            - Path=/user/**  #指定路由规则
            
        - id: product_route 
          uri: http://localhost:9000
          predicates:
            - Path=/product/**  

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka #指定服务注册中心的地址

3.启动服务并测试

  在商品服务的业务层中有如下代码:

@RestController
@Slf4j
@RequestMapping("/product")
public class ProductController {

    @Value("${server.port}")
    private String port;

    @GetMapping("/find")
    public String find(){
        log.info("商品服务调用成功,端口为{}", port);
        return "服务调用成功,服务提供端口: " + port;
    }
}

在用户服务的业务层中的代码如下,在用户服务中使用OpenFeign组件调用商品服务。

@RestController
@Slf4j
@RequestMapping("/user")
public class UserController {

    @Autowired
    private ProductClient productClient;

    @GetMapping("/find")
    public String user(){
        log.info("用户服务调用成功....");
        String msg = productClient.find();
        return msg;
    }

}

  写入Gateway的启动类,然后启动相应服务,

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

服务启动之后,在浏览器中进入http://localhost:8989/user/find可以访问用户服务,进入http://localhost:8989/product/find可以访问商品服务。
  解析:一般而言,我们访问商品服务或者是用户服务,使用的访问地址是http://localhost:9000/product/find以及http://localhost:8999/user/find;但是在配置网关之后,访问商品服务时使用http://localhost:8989/product/find,但是在网关中并没有该路径,而它真正的执行过程可以理解为在网关配置文件中的断言的路由规则找到路径为/product/**,并且匹配成功,从而将http://localhost:8989替换为该路由中的uri,即http://localhost:9000,最后组装为http://localhost:8989/product/find,即可访问到正确的路径地址。而用户服务中的实现也是同种道理。当然有时候我们在一个controller业务层中可能有多个接口调用,因此在实现过程中断言中的路径规则我们写成/product/*,并加上@RequestMapping(“/product”)注解,即可匹配到product下的所有接口路径。

三.查看网关路由规则列表

  Gateway提供路由访问规则列表的web界面,但是默认是关闭的,如果想要查看服务路由规则可以在配置文件中开启:

management:
  endpoints:
    web:
      exposure:
        include: "*"   #开启所有web端点暴露

同时在该项目中加入如下依赖,提供监控功能:

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

启动服务之后在浏览器中进入http://localhost:8989/actuator/gateway/routes,即可在web界面中看到配置的服务路由规则:
SpringCloud-网关 Gateway

四.路由服务的负载均衡

  现有路由配置方式,都是基于服务地址写死的路由转发。所以我们可以对原有的路由配置进行更改,使其能够根据服务名称进行路由转发同时实现负载均衡。

server:
  port: 8989
spring:
  application:
    name: GATEWAY

  cloud:
    gateway:
      discovery:
        locator:
          enabled: true   #开启根据服务名动态获取路由
      routes:
        - id: user_route #指定路由的唯一标识
#          uri: http://localhost:8999 #指定路由服务的地址
          uri: lb://USER  #lb指代loadBalance负载均衡,USER指代服务名
          predicates:
            - Path=/user/**  #指定路由规则

        - id: product_route
#          uri: http://localhost:9000
          uri: lb://PRODUCT  #lb指代loadBalance负载均衡,PRODUCT指代服务名
          predicates:
            - Path=/product/**

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka #指定服务注册中心的地址

management:
  endpoints:
    web:
      exposure:
        include: "*"   #开启所有web端点暴露

可以发现的是,uri不再对主机和端口进行写死,而是采用了lb(LoadBalance)加服务名提供路由地址。当路径匹配之后,会从注册中心对匹配该服务名的服务进行负载均衡处理。

五.断言和过滤

  在官网中,有这么一幅图,很好的诠释了网关的工作原理:
SpringCloud-网关 Gateway
在这个图中,Gateway Handler Mapping和Gateway Web Handler就是我们所称的断言,而后续的一系列的filter就是过滤器。由图我们可以知道,当客户端向Spring Cloud Gateway发送请求的时候,如果网关处理程序映射器确定请求与路由匹配,则将其发送到网关Web处理程序。然后经过一系列的过滤器处理,最后到达服务端。

1.断言Predicate

  断言其实可以认为是网关的前置处理,当请求到达网关时,会先经过前置处理,满足断言则放行,不满足则立即返回,比如上述例子中的路径匹配就是前置处理。
  当然,在官网中给出了路由断言工厂(Route Predicate Factories),这里我们选几个断言进行介绍:

1.1.The Path Route Predicate Factory(路径断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

这个其实我们都不陌生了,就是之前一直使用的路径匹配。

1.2.The After Route Predicate Factory(after路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

这个断言的含义就是代表该路由规则必须要在指定时间之后才能生效,这里的时间使用的是java中的ZonedDateTime。

1.3.The Before Route Predicate Factory(before路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

同理,这个断言的含义就是该路由规则要在指定时间之前才能生效,时间同样是使用java中的ZonedDateTime。

1.4.The Between Route Predicate Factory(between路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

这个断言的含义代表路由规则必须要指定时间之间才能生效。

1.5.The Cookie Route Predicate Factory(cookie路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

顾名思义,这个断言的含义就是指携带指定cookie请求才能访问。

1.6.The Header Route Predicate Factory(header路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

这个断言的含义就是指请求必须要含有指定的请求头才能生效。

1.7.The Method Route Predicate Factory(method路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

这个断言是指基于请求方式的访问。

2.过滤Filter

  过滤相当于网关的后置处理,当请求满足断言的所有条件之后,会向后端服务转发,在向后端服务转发之前会经过一些过滤操作。
  路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。路由筛选器的作用域是特定路由。springcloudgateway包括许多内置的GatewayFilter工厂。而它的功能就是当我们有很多个服务时,比如下图中的user-service、order-service、product-service等服务,客户端请求各个服务的Api时,每个服务都需要做相同的事情,比如鉴权、限流、日志输出等,那我们可以统一在网关处进行处理操作。
SpringCloud-网关 Gateway
SpringCloud-网关 Gateway
  在官网中给出GatewayFilter Factories,同样,我们选出一些内置的过滤器进行介绍:

2.1.The AddRequestHeader GatewayFilter Factory

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        #添加请求头X-Request-red,值为blue
        - AddRequestHeader=X-Request-red, blue

这个过滤器的主要作用就是用来给路由对象的所有转发请求加入指定请求头信息。

2.2.The AddRequestParameter GatewayFilter Factory

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_parameter_route
        uri: https://example.org
        filters:
        - AddRequestParameter=red, blue

这个过滤器的主要作用就是用来给路由对象的所有转发请求加入指定请求参数。

2.3.The AddResponseHeader GatewayFilter Factory

spring:
  cloud:
    gateway:
      routes:
      - id: add_response_header_route
        uri: https://example.org
        filters:
        - AddResponseHeader=X-Response-Red, Blue

这个过滤器的作用就是用来给路由对象的所有转发请求的响应加入指定头部信息。

2.4.The PrefixPath GatewayFilter Factory

spring:
  cloud:
    gateway:
      routes:
      - id: prefixpath_route
        uri: https://example.org
        filters:
        - PrefixPath=/mypath

这个过滤器的含义是用来给路由对象的所有转发请求的url加入指定前缀信息,比如访问网关匹配地址/list,前缀路径是/mypath,最后转发到后端的服务地址就是url+前缀路径+地址栏路径,url/mypath/list。

2.5.The StripPrefix GatewayFilter Factory

spring:
  cloud:
    gateway:
      routes:
      - id: nameRoot
        uri: https://nameservice
        predicates:
        - Path=/name/**
        filters:
        - StripPrefix=2

这个过滤器的含义是用来给路由对象的所有转发请求的url去掉指定2个前缀,比如访问地址是/product/list,StripPrefix=1,则最终的访问地址是/list。

3.自定义全局Filter基础使用

  自定义全局Filter就是当内置的过滤器不能满足现实需求,则可以自定义过滤器来处理,当然所有请求都要经过全局Filter才能转发到后端。

@Configuration
public class CustomGlobalFilter implements GlobalFilter, Ordered {
    @Override
    //exchange封装了request和reponse
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //httprequest对象
        ServerHttpRequest request = exchange.getRequest();
        //httpresponse对象
        ServerHttpResponse response = exchange.getResponse();
        System.out.println("经过全局filter处理....");
        //放行filter
        Mono<Void> filter = chain.filter(exchange);
        System.out.println("响应回来filter处理");
        return filter;
    }

    排序,用来指定filter执行顺序,默认顺序按照自然数字进行排序,-1在所有filter之前执行
    @Override
    public int getOrder() {
        return 0;
    }
}

当然这里只是给出了自定义过滤器的基本使用,具体的代码实现还是要根据业务来进行编写。文章来源地址https://www.toymoban.com/news/detail-444017.html

到了这里,关于SpringCloud-网关 Gateway的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 04.SpringCloud网关-gateway

    Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。‘ 在SpringCloud中网关的实现包括两种: gateway zuul Zuul是基于Servlet的实

    2024年02月02日
    浏览(31)
  • SpringCloud.03.网关Gateway

    目录  网关Gateway的概念: 准备 使用 方式一 因为配置了网关所以可以直接通过gateway发送请求 方式二 修改配置前:http://localhost:8082/provider/run 方式三(动态路由) 导入配置类 Spring Cloud Gateway 是 Spring 官方基于 Spring5.0 、 SpringBoot2.0 和 Project Reactor 等技术开发的网 关 旨在为微服务

    2024年02月01日
    浏览(27)
  • springcloud-网关(gateway)

    Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API,并为其提供跨领域的关注,如:安全、监控/指标和容错 Route(路由) : 网关的基本构件。它由一个 ID 、一个目的地 URI 、一个谓词( Predicate )集合和一个过滤器( Filter )集合定义。如果集合谓词为真,则路由被

    2024年02月21日
    浏览(27)
  • springcloud Gateway网关

    地址:https://github.com/13thm/study_springcloud/tree/main/days9_Gateway Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。 Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等 prin

    2024年01月24日
    浏览(38)
  • 【SpringCloud-5】gateway网关

    网关是干啥用的就不用再说了。 sringcloud中的网关,第一代是zuul,但是性能比较差(1.x是阻塞式的,2.x是基于Netty的),然后有了第二代GateWay,基于Reactor模型 异步非阻塞。  springcloud网关就是一系列的filter,在请求到达真实服务的前后,进行拦截处理。   GateWay 核⼼逻辑:路

    2024年02月09日
    浏览(27)
  • springcloud(gateway网关)

    目录 1. gateway简介 1.1 是什么 1.2 作用 1.3 主要特征 1.4 与zuul的主要区别 1.5 主要组件 1.6 架构图 2. 开发示例 2.1 创建一个gateway模块 2.2 与nacos结合使用 2.2.1 默认规则 2.2.2 通过配置文件配置路由 2.2.3 动态路由 SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在

    2024年02月07日
    浏览(30)
  • springcloud~gateway网关

    有时间,我们在搭建微服务时,总希望拿一个比较单纯的,没有污染其它代码的项目来从头开始做,今天我们来建设一个最简单的,gateway项目,它被注册到nacos里,路由配置也存到nacos里,动态实现更新配置功能。 版本:com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2021.0

    2024年02月06日
    浏览(27)
  • 【SpringCloud学习笔记】gateway网关

    核心概念: 路由(route):路由信息由id、目标url、一组断言和一组过滤器组成。如果断言路由为真,则说明请求的 URI 和配配 断言(predicate): Java8 中的断言函数,可以配置http请求的断言条件,断言成功会对匹配的路径进行路由 过滤器(filter):过滤器分为两种类型,分

    2024年02月11日
    浏览(31)
  • 微服务网关 —— SpringCloud Gateway

    Spring Cloud Gateway 基于 Spring 5、Spring Boot 2 和 Project Reactor 等技术,是在 Spring 生态系统之上构建的 API 网关服务,Gateway 旨在提供一种简单而有效的方式来对 API 进行路由以及提供一些强大的过滤器功能,例如熔断、限流、重试等 Spring Cloud Gateway 具有如下特性: 基于 Spring Frame

    2024年02月10日
    浏览(39)
  • SpringCloud(五)Gateway 路由网关

    官网地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ 我们需要连接互联网,那么就需要将手机或是电脑连接到家里的路由器才可以,而路由器则连接光猫,光猫再通过光纤连接到互联网,也就是说,互联网方向发送过来的数据,需要经过路由器才能到达我们的设

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包