共同学习|Spring Cloud Alibaba一一服务网关Gateway

目录

服务网关-Gateway

环境搭建

负载均衡

Gateway Predicates

Path

After

Before

Header

Weight

GatewayFilter  Factories

StripPrefix

AddResponseHeader

自定义全局Filter


网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。在使用不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同时,网关也可以提供过滤和安全功能。大多数网关运行在OSI 7层协议的顶层--应用层。

服务网关-Gateway

        spring-cloud-Gateway是spring-cloud的一个子项目。而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已。因为zuul2.0连续跳票和zuul的性能表现的不是很理想,所以催生了spring团队开发了Gateway项目。

Gateway核心组件

  • Router(路由):路由是网关的基本单元,由ID、URL、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
  • Predicate(谓语、断言):路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等。
  • Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。

实现方式:
通过实现GlobalFilter和Ordered这两个接口中的filter(进行全局过滤)和getOrder(指定过滤器的优先级)方法

其中,FilterChain维护了一个链表,链表中存放着配置对象的链条,每次用户调用 一次chain.doFilter(request, response),链表就去取下一个配置对象,再通过配置对象 得到下一个filter,然后调用该filter,接着在filter里写的逻辑就被执行了。

环境搭建

1、导入依赖

<!--gateway中国自带一个web组件过来-->
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、yml 配置

server:
   port: 88
spring:
   application:
      name: cloud-gateway
   cloud:
      nacos:
        discovery:
           server-addr: 192.168.147.288:8848   
      gateway:      # 服务网关的配警都在这里
         routes:
           - id: provider   # 路由规则的唯一标识
             uri: lb://@1-provider   # 路由的服务名称,1b指的负家均衡
             predicates:                   # 设背断言
                Path=/provider/**       # 映射的路径,把请求发送给网关后,如果请求和该Path匹配就把这个请求路由到01-provider服务中
             filters:
               - stripPrefix=1 # 截取第一个前激,就是prowider
           -id: consumer # 路由规则的唯一标识
            uri: lb://@2-consumer # 路由的服务名称,1b指的负家均衡
            predicates: # 设警断言
                Path=/consumer/** #          映射的路径,把请求发送给网关后,如果请求和该ath匹配就把这个请求路由到,01-provider服务中
            filters:
              - stripPrefix=1

3、访问

http://localhost:88/provider/hello

负载均衡

spring:
  cloud:
     gateway:
         routes:
             -id: user
              uri: lb://01-user-v2  #lb :可以实现服务的负载均衡
              predicates:
                - Path=/user/** 
             -id: feign-consumer
              uri: lb://consumer-feign
              predicates:
                - Path=/feign/**

修改默认的负载均衡策略

@Bean
public IRule rule(){
     return new RandomRule();
}

Gateway Predicates

   每一个‘Predicate’的使用,你可以理解为:‘当满足这种条件后才会被转发’,如果是多个,那就是都满足的条件下被转发。

Path

请求必须匹配断言才能为真

spring:
  cloud:
    gateway:
       routes:
          -id: feign-consumer
           uri: lb://consumer-feign
           predicates:
              - Path=/feign/**

After

指定时间之后断言才能为真

spring:
  cloud:
     gateway:
         routes:
            -id: feign-consumer
             uri: lb://consumer-feign
             predicates:
                - Path=/feign/**
                - After=2021-08-08T17:36:20.014+08:00[Asia/shanghai]

After 接收的是一个时区值,可以通过ZoneDateTime.now()获取当前时间的时区

Before

指定时间之前断言才能为真

spring:
  cloud:
     gateway:
         routes:
            -id: feign-consumer
             uri: lb://consumer-feign
             predicates:
                - Path=/feign/**
                - Before=2021-08-08T17:36:20.014+08:00[Asia/shanghai]

请求必须要携带指定的Cookie断言才能为真

spring:
  cloud:
     gateway:
         routes:
            -id: feign-consumer
             uri: lb://consumer-feign
             predicates:
                - Path=/feign/**
                # -Cookie=username,tostring  #username 是key,tostring 是value
                - Cookie=username,[A-Za-z0-9]+ #value 是正则,只要写到username的Cookie断言就为真

请求头中必须要携带指定的key/value断言才能为真

spring:
  cloud:
     gateway:
         routes:
            -id: feign-consumer
             uri: lb://consumer-feign
             predicates:
                - Path=/feign/**
                - Header=token,123 #这里也支持正则

Weight

按照权重计算,80%的流量转到8002,20%的流量转到8003

spring:
  cloud:
     gateway:
         routes:
            -id: user1
             uri: http://localhost:8002/
             predicates:
                - Path=/user/**
                - Weight=user-group,8
            -id: user2
             uri: http://localhost:8003/
             predicates:
                - Path=/user/**
                - Weight=user-group,2

GatewayFilter  Factories

路由器允许以某种方式修改传入到HTTP请求或传出到HTTP响应。路由过滤器的作用域是特定的路由。springcloud gateway包括许多内置的gatwwayFilter工厂。

StripPrefix

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

截取指定的请求,然后再路由。

AddResponseHeader

在网关中给所有响应头中添加token属性

spring:
  cloud:
     gateway:
         routes:
            -id: feign-consumer
             uri: lb://consumer-feign
             predicates:
                - Path=/feign/**
                filters:
                - AddResponseHeader=token,456

自定义全局Filter

    自定义全局Filter可以实现再路由之前的自定义的过滤,服务调用完成后的自定义响应处理,它是一个全局的作用,定义后对所有的服务都起作用。实际项目中一把把一些公共操作都统一的放在网关Filter实现。

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

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

相关文章

北斗卫星赋能,宠物定位新篇章—追踪宠物,不再是难题

北斗卫星赋能&#xff0c;宠物定位新篇章—追踪宠物&#xff0c;不再是难题 随着社会的快速发展与科技的不断进步&#xff0c;人们的生活方式也在不断改变。宠物已经成为越来越多家庭的重要成员&#xff0c;在这个宠爱宠物的时代&#xff0c;如何确保宠物的安全&#xff0c;特…

js之继承

js之继承 1、原型 prototype 和 __proto__2、原型链3、继承4、hasOwnProperty 1、原型 prototype 和 proto 每个对象都有一个__proto__属性&#xff0c;并且指向它的prototype原型对象每个构造函数都有一个prototype原型对象prototype原型对象里的constructor指向构造函数本身…

淘金优化算法GRO求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;提…

vscode与vue/react环境配置

一、下载并安装VScode 安装VScode 官网下载 二、配置node.js环境 安装node.js 官网下载 会自动配置环境变量和安装npm包(npm的作用就是对Node.js依赖的包进行管理)&#xff0c;此时可以执行 node -v 和 npm -v 分别查看node和npm的版本号&#xff1a; 配置系统变量 因为在执…

Cloudera虚拟机配置(虚拟机环境自带Hadoop、Impala等大数据处理应用)

上学期的大数据处理课程&#xff0c;笔者被分配到Impala的汇报主题。然而汇报内容如果单纯只介绍Impala的理论知识&#xff0c;实在是有些太过肤浅&#xff0c;最起码得有一些实际操作来展示一下Impala的功能。但是Impala的配置实在是有些困难与繁琐&#xff0c;于是笔者通过各…

VSCode设置成中文语言环境

1&#xff0c;打开VSCode软件&#xff0c;按快捷键【CtrlShiftP】 2&#xff0c;在弹出的搜索框中输入configure language&#xff0c;然后选择Configure Display Language 3&#xff0c;在选择框中选择zh-cn 4&#xff0c;确认重启VSCode就可以了

【基础知识】MPP架构和hadoop架构比对

架构比对 简单一句描述。 mpp架构&#xff0c;就是找一群和自己能力差不多的任一起做事&#xff0c;每个人做的事情是一致的。 hadoop架构&#xff0c;就是找一群能力差一些的人&#xff0c;但只需要他们每个人只做一部分工作。 举例说明 一个特色小饭店如何成为连锁餐饮巨…

基于JAVA springboot+mybatis智慧生活分享平台设计和实现

基于JAVA springbootmybatis智慧生活分享平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 可定制系统 欢迎点赞 收藏 …

代码随想录算法训练营第二十二天| 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

文章目录 1.二叉搜索树的最近公共祖先2.二叉搜索树中的插入操作3.删除二叉搜索树中的节点 1.二叉搜索树的最近公共祖先 因为是有序树&#xff0c;所以中间节点如果是p、q的公共祖先&#xff0c;那么一定存在p<公共祖先<q 或 q<公共祖先<p 代码如下&#xff1a; /**…

树的基本概念和结构

目录 树的概念和结构 树的相关概念 树的特点 树的表示 树的基本应用 树的概念和结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合 &#x1f4cc; 把它叫做树是因为它看起来像一棵倒挂的树&#x…

springboot集成docker快速入门demo

一、docker介绍 Docker是一个开源的应用容器引擎&#xff0c;它允许开发者将应用及其依赖打包到一个可移植的容器中。这个容器可以在任何流行的 Linux或 Windows操作系统上运行&#xff0c;并且支持虚拟化。容器是完全基于沙箱机制的&#xff0c;这意味着它们之间不会有任何接口…

一般情况下,硬件中使用Repeating Sequence出现波形很奇怪就是数据的周期频率和mcu运行的频率不一致导致的

一般情况下&#xff0c;出现波形很奇怪就是数据的周期频率和mcu运行的频率不一致导致的 把timer values 修改为0 1就好了&#xff0c;如果是0&#xff0c;0.1就不行&#xff0c;不会有下面的波形

计算机组成原理 — 存储器(2)

高速缓冲存储器 大家好呀&#xff01;我是小笙&#xff0c;由于存储器这部分章节内容较多&#xff0c;我分成二部分进行总结&#xff0c;以下是第二部分&#xff0c;希望内容对你有所帮助&#xff01; 概述 目的&#xff1a;避免CPU空等现象 原理&#xff1a;程序访问的局部…

【王道数据结构】【chapter6图】【P258t7】

试编写 利用DFS实现有向无环图的拓扑排序的算法 #include <iostream> #define maxsize 10 typedef struct node{int data;struct node *next; }node ,*pnode;pnode buynode(int x) {pnode tmp(pnode) malloc(sizeof (node));tmp->datax;tmp->next nullptr;return t…

【K8s】初识PV和PVC

​ 目录 收起 O、致谢 一、前言 二、Volume 2.1 什么是Volume 2.2 为什么要引入Volume 2.3 Volume类型有哪些 2.4 Volume如何使用 2.4.1 通过emptyDir共享数据 2.4.2 使用HostPath挂载宿主机文件 2.4.3 挂载NFS至容器 三、PV和PVC 3.1 什么是PV和PVC 3.2 为什么要引入PV和PVC 3…

Remainder Problem(根号分治)

Educational Codeforces Round 71 (Rated for Div. 2) F. Remainder Problem 题目链接 F. Remainder Problem 题意&#xff1a; 给你一个由 500000 500000 500000 个整数&#xff08;编号从 1 1 1 到 500000 500000 500000 &#xff09;组成的数组 a a a 。最初 a a a…

【JavaEE】网络原理: HTTPS协议相关内容

目录 HTTPS 是什么 HTTPS 的工作过程 对称加密 非对称加密 引入证书 理解数据签名 通过证书解决黑客攻击 HTTPS 是什么 HTTPS也是一个应用层协议, 是在HTTP协议的基础上引入了一个加密层. HTTP协议内容都是按照文本的方式明文传输的, 这就导致在传输过程中出现一些被篡…

minHash(最小哈希)和LSH(局部敏感哈希)

在数据挖掘中,有一个比较基本的问题,就是比较两个集合的相似度。关于这个问题,最笨的方法就是用一个两重循环来遍历这两个集合中的所有元素,进而统计这两个集合中相同元素的个数。但是,当这两个集合里的元素数量非常庞大时,同时又有很多个集合需要判断两两之间的相似度时…

代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

文章目录 [1.修剪二叉搜索树(https://leetcode.cn/problems/trim-a-binary-search-tree/description/)2.将有序数组转换为二叉搜索树3.把二叉搜索树转换为累加树 [1.修剪二叉搜索树(https://leetcode.cn/problems/trim-a-binary-search-tree/description/) 遇到超范围节点&…