SpringCloud-网关 Gateway

网关Gateway

  • 一、网关初识
  • 二、网关的使用
    • 1.创建项目并引入依赖
    • 2.编写网关配置
    • 3.启动服务并测试
  • 三.查看网关路由规则列表
  • 四.路由服务的负载均衡
  • 五.断言和过滤
    • 1.断言Predicate
      • 1.1.The Path Route Predicate Factory(路径断言工厂)
      • 1.2.The After Route Predicate Factory(after路由断言工厂)
      • 1.3.The Before Route Predicate Factory(before路由断言工厂)
      • 1.4.The Between Route Predicate Factory(between路由断言工厂)
      • 1.5.The Cookie Route Predicate Factory(cookie路由断言工厂)
      • 1.6.The Header Route Predicate Factory(header路由断言工厂)
      • 1.7.The Method Route Predicate Factory(method路由断言工厂)
    • 2.过滤Filter
      • 2.1.The AddRequestHeader GatewayFilter Factory
      • 2.2.The AddRequestParameter GatewayFilter Factory
      • 2.3.The AddResponseHeader GatewayFilter Factory
      • 2.4.The PrefixPath GatewayFilter Factory
      • 2.5.The StripPrefix GatewayFilter Factory
    • 3.自定义全局Filter基础使用


一、网关初识

  官方地址:SpringCloud Gateway
  网关统一了服务的入口,可以方便实现对众多服务接口进行管控,对访问服务的身份认证,防报文重放与防数据篡改,功能调用的业务鉴权,响应数据的脱敏,流量与并发控制,甚至基于API调用的计量或者计费等等。更通俗理解,网关可以看成是路由转发以及过滤器的共同作用,路由转发接受一切外界的请求,然后转发到后端的微服务中;而过滤器在服务网关中可以完成一系列的横切功能,比如权限校验,限流以及监控等。
在这里插入图片描述
  在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界面中看到配置的服务路由规则:
在这里插入图片描述

四.路由服务的负载均衡

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

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)加服务名提供路由地址。当路径匹配之后,会从注册中心对匹配该服务名的服务进行负载均衡处理。

五.断言和过滤

  在官网中,有这么一幅图,很好的诠释了网关的工作原理:
在这里插入图片描述
在这个图中,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时,每个服务都需要做相同的事情,比如鉴权、限流、日志输出等,那我们可以统一在网关处进行处理操作。
在这里插入图片描述
在这里插入图片描述
  在官网中给出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;
    }
}

当然这里只是给出了自定义过滤器的基本使用,具体的代码实现还是要根据业务来进行编写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/21422.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型训练数据多样性的重要性

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

华为云——代码托管的使用

一、打开前后端项目 登录华为云&#xff0c;点击页面右上角的用户名——点击个人设置 2.点击代码托管的HTTPS密码管理&#xff0c;设置自己的密码 3.回到代码仓库&#xff0c;复制HTTP地址 4.打开GitHubDesktop&#xff0c;点击左上角进行仓库克隆 &#xff08;我这里已经cl…

声音合成——Foley Sound——DECASE项目——多模态智能感知与应用——论文翻译

文章目录 概述论文翻译CONDITIONAL SOUND GENERATION USING NEURAL DISCRETE TIME-FREQUENCY REPRESENTATION LEARNINGAbstractSampleRNN是啥&#xff1f; Introduction个人总结&#xff08;省流&#xff09;补充个人感想 Approach2.1 Discrete time-frequency省流总结2.1.1 Mu…

分布式系统原理

高可用是指系统无中断的执行功能的能力&#xff0c;代表了系统的可用程度&#xff0c;是进行系统设计时必须要遵守的准则之一。 而高可用的实现方案&#xff0c;无外乎就是冗余&#xff0c;就存储的高可用而言&#xff0c;问题不在于如何进行数据备份&#xff0c;而在于如何规避…

【Lychee图床】本地电脑搭建私人图床,公网远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转发自CSDN风浪越大%鱼越贵的文章&#xff1a;Lychee图床 - 本地配置属于自己的相册管理系统并远…

国潮还能怎么玩?小红书用户画像速看!

所谓“国潮”&#xff0c;概括来说就是“国风潮流”。主要有两层含义&#xff1a;其一&#xff0c;有中国文化和传统的基因&#xff1b;其二&#xff0c;能将传统文化与时下潮流相融合&#xff0c;使产品更具时尚感。在“国潮”元年之前&#xff0c;“国潮”大多指狭义上的特定…

【开发者指南】如何在MyEclipse中编辑HTML或JSP文件?(一)

MyEclipse v2022.1.0正式版下载 如果您有HTML或JSP文件要编辑&#xff0c;这里将介绍如何编辑。查找以下信息&#xff1a; 编辑源代码大纲和属性视图参数页面 该功能在MyEclipse中是可用的。 一、HTML / JSP编辑器 要编辑HTML或JSP文件&#xff0c;请执行以下操作当中的一…

Git笔记

目录 Git概念 git配置 git的安装 远程仓库配置 忽略跟踪文件 git指令 文件跟踪指令&#xff1a; 查看提交历史 撤消操作 远程仓库的使用 标签 分支 常见错误提示及解决方法 git patch的运用 git中branch/commit/add之间关系 Windows下Git的使用 Git概念 Git 是…

接口优化技巧汇总

1.批处理 批量思想&#xff1a;批量操作数据库&#xff0c;这个很好理解&#xff0c;我们在循环插入场景的接口中&#xff0c;可以在批处理执行完成后一次性插入或更新数据库&#xff0c;避免多次IO。 //批量入库 batchInsert();2.异步处理 异步思想&#xff1a;针对耗时比较…

Nacos-04-@RefreshScope自动刷新原理

Nacos动态刷新原理 Nacos做配置中心的时候&#xff0c;配置数据的交互模式是有服务端push推送的&#xff0c;还是客户端pull拉取的&#xff1f; 短轮询 不管服务端的配置是否发生变化&#xff0c;不停发起请求去获取配置&#xff0c;比如支付订单场景中前端JS不断轮询订单支…

mathtype公式符号显示不对

文章目录 问题解决方法结果 记录攥写论文遇到的问题及解决方法 问题 使用mathtype编辑公式过后&#xff0c;发现公式显示不对&#xff0c;出现两种问题&#xff1a; 1&#xff1a;部分符号变为方框 2&#xff1a;符号大小异常 例如&#xff1a; 解决方法 第一种&#xff1a…

【Linux 之五】 Linux中使用fdisk命令实现磁盘分区

最近由于工作的需要&#xff0c;初步研究了uboot中的fastboot实现方式。研究fastboot不可避免的需要了解磁盘分区的相关知识点&#xff0c;在linux下可以使用fdisk命令实现磁盘的分区。好了&#xff0c;下面步入正题。 1. 查看帮助信息&#xff08;fdisk --help&#xff09; …

我们详细讲讲UI自动化测试最佳设计模式POM

概念 什么是POM&#xff1f; POM是PageObjectModule&#xff08;页面对象模式&#xff09;的缩写&#xff0c;其目的是为了Web UI测试创建对象库。 在这种模式下&#xff0c;应用涉及的每一个页面应该定义为一个单独的类&#xff0c;类中应该包含此页面上的页面元素对象和处…

skywalking安全认证问题

skywalking安全认证 一、问题二、步骤2.1 skywalking-aop配置文件修改2.2 agent配置文件修改 一、问题 在springboot项目使用java-agent接入skywalking时&#xff0c;为保证两者之间的数据安全传输&#xff0c;准备加个安全认证 参考文章&#xff1a; https://www.helloworld…

亚马逊云科技使用Inf2实例运行GPT-J-6B模型

在2019年的亚马逊云科技re:Invent上&#xff0c;亚马逊云科技发布了Inferentia芯片和Inf1实例这两个基础设施。Inferentia是一种高性能机器学习推理芯片&#xff0c;由亚马逊云科技定制设计&#xff0c;其目的是提供具有成本效益的大规模低延迟预测。时隔四年&#xff0c;2023年…

java版企业电子招投标系统源码 招采系统源码 spring boot+mybatis+前后端分离实现电子招投标系统

spring bootmybatis前后端分离实现电子招投标系统 电子招投标系统解决方案 招标面向的对象为供应商库中所有符合招标要求的供应商&#xff0c;当库中的供应商有一定积累的时候&#xff0c;会节省大量引入新供应商的时间。系统自动从供应商库中筛选符合招标要求的供应商&#x…

【Mybatis】SpringBoot整合Mybatis

唠嗑部分 之前我们说了Mybatis的一些文章&#xff0c;相关文章&#xff1a; 【Mybatis】简单入门及工具类封装-一 【Mybatis】如何实现ORM映射-二 【Mybatis】Mybatis的动态SQL、缓存机制-三 【Mybatis】Mybatis处理一对多、多对多关系映射-四 这篇文章我们来说说SpringBoot如…

SpringCloud学习-实用篇03

以下内容的代码可见&#xff1a;SpringCloud_learn/day03 1.初识Docker 什么是Docker? 项目部署问题&#xff1a;大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题 依赖关系复杂&#xff0c;容易出现兼容性问题开发、测试、生产环境有差异 Do…

ADS - lesson 1. Patch antenna

Patch antenna 1. 开启 layout command line editor2. layout command line editor应用3. 画馈线4. 插入端口5. EM 冲冲冲6. 结果 1. 开启 layout command line editor ADS主界面 - Tools - App Manager… - 勾选 “layout command line editor” 然后重启软件 2. layout co…

一步一步详解LSTM网络【从RNN到LSTM到GRU等,直至attention】

一步一步详解LSTM网络【从RNN到LSTM到GRU等&#xff0c;直至attention】 0、前言1、Recurrent Neural Networks循环神经网络2、The Problem of Long-Term Dependencies长期依赖的问题3、LSTM Networks4、The Core Idea Behind LSTMs5、Step-by-Step LSTM Walk Through6、Varian…