Apache ShenYu 学习笔记一
1、简介
这是一个异步的,高性能的,跨语言的,响应式的 API 网关。
- 官网文档:Apache ShenYu 介绍 | Apache ShenYu
- 仓库地址:GitHub - apache/shenyu: Apache ShenYu is a Java native API Gateway for service proxy, protocol conversion and API governance.
2、首次体验
本次体验基本参照官方快速开始文档步骤
2.1、本地环境
- 开发工具:IDEA
- JDK:1.8
2.2、下载代码
git clone https://github.com/apache/shenyu.git
cd shenyu
mvn clean install -Dmaven.javadoc.skip=true -B -Drat.skip=true -Djacoco.skip=true -DskipITs -DskipTests
2.3、启动shenyu-admin
- IDEA打开上一步下载好的项目
- 找到
shenyu-admin
子项目,运行ShenyuAdminBootstrap
- 该项目默认使用H2数据库,首次启动会自行初始化。默认web端口为:9095,默认账号密码为:admin/123456
- 浏览器访问:http://localhost:9095 并登陆,可以看到如下界面:
2.4、启动shenyu-bootstrap
- 找到
shenyu-bootstrap
子项目,修改application.yml
中shenyu.local.enabled
的值为true
,方便本地调试。 - 运行
ShenyuBootstrapApplication
- 该项目默认端口为:9195,后面设置路由规则需要用到
2.5、测试准备
- 由于首次体验我们需要测试http接口转发,因此本地启动用于测试的web项目,提供一个待测试的接口:http://localhost:8081/test/hello 如下图:
2.6、添加路由规则
待测试的接口准备好了,接下来我们需要在
ShenYu
中添加路由规则,我直接通过终端发送请求如下:
curl --location --request POST 'http://localhost:9195/shenyu/plugin/selectorAndRules' \
--header 'Content-Type: application/json' \
--header 'localKey: 123456' \
--data-raw '{"pluginName": "divide","selectorHandler": "[{\"upstreamUrl\":\"127.0.0.1:8081\"}]","conditionDataList": [{"paramType": "uri","operator": "match","paramValue": "/**"}],"ruleDataList": [{"ruleHandler": "{\"loadBalance\":\"random\"}","conditionDataList": [{"paramType": "uri","operator": "match","paramValue": "/**"}]}]
}'
2.7、测试转发
根据上面的映射规则,我们直接访问: http://localhost:9195/test/hello ,结果如下:
至此,首次体验已经完成。接下来,我想继续了解下本项目。
3、转发实现流程探究
以下的探究基于上面2.x体验流程
3.1、单一职责插件
通过官方文档:插件扩展 | Apache ShenYu ,可以看到如下内容:
结合2.6添加路由规则中涉及的plugin:divide
,于是本次探究我们围绕divide
插件展开
3.2、divide插件
-
在
shenyu
项目下,可以看到一个子模块shenyu-plugin
,点开后可以看到该模块下已经提供了众多插件实现 -
点开
shenyu-plugin-divdie
,可以看到DividePlugin
类,该类继承自org.apache.shenyu.plugin.base.AbstractShenyuPlugin
,与官方文档描述如出一辙 -
在
org.apache.shenyu.plugin.base.AbstractShenyuPlugin.execute
方法中打断点调试如下: -
此处正好印证官方文档关于插件的描述,具体的转发逻辑由插件各自实现,我们可以通过自定义插件的方式进行扩展
-
那么一个请求过来?网关是如何找到具体插件的呢?
3.3、ShenyuWebHandler
-
断点通过方法调用栈发现,该请求从上游方法
org.apache.shenyu.web.handler.ShenyuWebHandler.handle
过来: -
ShenyuWebHandler
类实现了org.springframework.web.server.WebHandler
接口。 -
可以看到,该handler方法拿到了plugins,并通过Reactor异步地将exchange发布出去
-
然后通过责任链机制,按照插件定义的顺序依次匹配。未匹配上则忽略,匹配上则由对应的插件处理,正好与3.2步骤中的divide插件衔接上。匹配逻辑如下:
-
由于这是首次体验,我不想过多的探究细节,因此插件匹配、执行的细节此处暂且跳过,我们继续往下探究plugins从何而来?
3.4、shenyu-spring-boot-starter-gateway
-
继续追溯,发现
ShenyuWebHandler
实例的生产地位于shenyu-spring-boot-starter-gateway
中的ShenyuConfiguration
类 -
通过该方法发现,插件列表信息从方法参数
ObjectProvider<List<ShenyuPlugin>> plugins
获取,因此我们只要找到插件Bean实例生成的位置即可
3.5、shenyu-spring-boot-starter-plugin-divide
-
于是很轻易的发现,在
shenyu-spring-boot-starter-plugin-divide
子项目下,有一个类:DividePluginConfiguration
,包含如下代码: -
因此,本次探究过程至此结束
4、本次学习总结
- 项目主要模块
- shenyu-admin:后台配置、监控
- shenyu-bootstrap:服务端配置、启动入口
- shenyu-plugin:服务端插件合集
- shenyu-web: 服务端web层上游基础功能封装
- shenyu-spring-boot-starter:将其他功能模块与springboot进行整合
- 插件开发大致流程
- 在
shenyu-plugin
下新建插件子模块,编写插件入口类(实现ShenyuPlugin
接口,或继承AbstractShenyuPlugin
类) - 定义好插件名称、优先级(Order)、skip逻辑、插件处理逻辑(execute)
- 在
shenyu-spring-boot-starter-plugin
编写自定义插件对应的starter
- 在
- 转发大致流程
- 项目启动后,从bean容器加载插件列表
- 请求过来后,首先到达
org.apache.shenyu.web.handler.ShenyuWebHandler.handle
,通过Reactor异步地将exchange发布出去 - 然后通过责任链机制,按照插件定义的顺序依次匹配。未匹配上则忽略,匹配上则由对应的插件处理
- 最后由具体的插件(如:divide插件,将http请求转发到目标地址)处理
相关文章:
Apache ShenYu 学习笔记一
1、简介 这是一个异步的,高性能的,跨语言的,响应式的 API 网关。 官网文档:Apache ShenYu 介绍 | Apache ShenYu仓库地址:GitHub - apache/shenyu: Apache ShenYu is a Java native API Gateway for service proxy, pr…...
uniapp 禁止遮罩层下的页面滚动
使用 touchmove.stop.prevent"toMoveHandle" 事件修饰符 若需要禁止蒙版下的页面滚动,可使用 touchmove.stop.prevent"moveHandle",moveHandle 可以用来处理 touchmove 的事件,也可以是一个空函数。将这个方法直接丢到弹…...
postgresql 分组
postgresql 数据汇总 分组汇总聚合函数注意 总结 分组统计总结 高级分组总结 分组汇总 聚合函数 聚合函数(aggregate function)针对一组数据行进行运算,并且返回单个结果。PostgreSQL 支持以下常见的聚合函数: • AVG - 计算一…...
RT1052的EPWM
文章目录 1 EPWM介绍1.1 引脚1.2 时钟1.3 比较寄存器 2 函数 1 EPWM介绍 RT1052 具有 4 个 eFlexPWM(eFlexWM1~eFlex_PWM4)。 每个 eFlexPWM 可以产生四路互补 PWM即产生 8 个 PWM,也可以产生相互独立的 PWM 波。四路分别是模块0-3每个 eFlexPWM 具有各自的故障检…...
k8s 安装istio (一)
前置条件 已经完成 K8S安装过程十:Kubernetes CNI插件与CoreDNS服务部署 部署 istio 服务网格与 Ingress 服务用到了 helm 与 kubectl 这两个命令行工具,这个命令行工具依赖 ~/.kube/config 这个配置文件,目前只在 kubernetes master 节点中…...
vue 项目在编译时,总是出现系统崩的状态,报错信息中有v7 或者 v8 的样式-项目太大内存溢出
vue 项目在编译时,总是出现系统崩的状态,node 命令框也会报错,如下图:有v7 或者 v8 的样式。 原因分析: 分析:遇到与上面图片相似的问题,我们要首先要想到是否是 有关内存的问题,当然…...
低功耗蓝牙射频指纹识别
射频指纹 射频指纹是什么 射频指纹是一种利用无线电信号的特征来识别设备或用户的技术。射频指纹可以用来做设备身份认证、位置跟踪、安全防护等应用。射频指纹的优点是难以伪造、不依赖于额外的硬件或软件、适用于多种无线通信协议。 射频指纹识别流程 射频指纹识别的一般…...
怎么检测UI卡顿?(线上及线下)
什么是UI卡顿? 在Android系统中,我们知道UI线程负责我们所有视图的布局,渲染工作,UI在更新期间,如果UI线程的执行时间超过16ms,则会产生丢帧的现象,而大量的丢帧就会造成卡顿,影响用…...
Git 常用操作
一、Git 常用操作 1、切换分支 git checkout命令可以用于三种不同的实体:文件,commit,以及分支。checkout的意思就是对于一种实体的不同版本之间进行切换的操作。checkout一个分支,会更新当前的工作空间中的文件,使其…...
前端修改新增操作导致数据删除——js精度丢失
问题描述 笔者在写前端渲染表格的时候,发现无论是修改还是新增,数据都会被删除。检查了前端逻辑并与后端联调均无问题。 然后就开始和后端一起对数据库,结果发现,十几位的id,接收过来的时候,尾数均变为了…...
winform使用usercontrol 构建了一个复杂的列表,列表速度慢该如何优化?
当使用 WinForms 构建复杂的列表时,可能会面临性能问题,特别是在数据量大或 UI 复杂的情况下。以下是一些优化策略,可以帮助您改善列表的性能: 1. **虚拟模式 (Virtual Mode)**:对于大型数据集,考虑使用虚…...
Lnton羚通算法算力云平台如何在OpenCV-Python中使用cvui库创建复选框
CVUI 之 复选框 Python import numpy as np import cv2 import cvuidef checkbox_test():WINDOW_NAME Checkbox-Testchecked [False]# 创建画布frame np.zeros((300, 400, 3), np.uint8)# 初始化窗口cvui.init(WINDOW_NAME)while True:# 画布填色frame[:] (100, 200, 100…...
中项系统集成项目管理知识点汇总
中项系统集成项目管理知识点汇总 一、成本-进度二、十大管理及47个过程三、质量四、人力资源五、风险六、干系人沟通七、案例分析万能答案八、选择题知识点九、十大管理输入输出工具技术总结十大管理工具技术总结 一、成本-进度 针对进度滞后的绩效情况 /缩短工期,可…...
Docker容器:docker基础及网络
Docker容器:docker基础及安装 一.docker容器概述 1.什么是容器 (1)Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。 (2)是一个开源的应用容器引擎,基于go语言开发并遵…...
Django实现音乐网站 ⑿
使用Python Django框架制作一个音乐网站, 本篇主要是加载静态资源和推荐页-轮播图、推荐歌单功能开发。 目录 加载静态资源 引入jquery.js 引入bootstrap资源文件 创建基类模板样式文件 推荐页开发 轮播图开发 下载 加载swiper 自定义引入继承块设置 使用…...
ORB-SLAM2学习笔记10之图像关键帧KeyFrame
文章目录 0 引言1 KeyFrame类1.1 构造函数1.2 成员函数1.3 关键帧之间共视图1.3.1 AddConnection1.3.2 UpdateBestCovisibles1.3.3 UpdateConnections1.3.4 EraseConnection1.3.5 SetBadFlag 1.4 地图点1.5 生成树 2 KeyFrame用途 0 引言 ORB-SLAM2学习笔记7详细了解了System主…...
【ownCloud】添加信任域
在我进行使用mysql:5.6和 owncloud 镜像,构建一个个人网盘后 我的虚拟机更改了ip地址导致出现下列状况 报错:您正在访问来自不信任域名的服务器。 please contact your administrator. if you are an administrator of this instance, configure the &q…...
C++--类型转换
1.什么是类型转换 在传统C语言中,由强制类型转换和隐式类型转换,隐式类型转换,编译器在在编译阶段自动处理,能转换则转换,强制类型转换由用户自己转换。 缺陷: 转换的可视性比较差,所有的转换形…...
在服务器上部署 Nginx 并设置图片服务器
问题:我要指定/home/images专门存放图片!该怎么做,而且我的系统是centos8系统,只有一个root用户,用root用户已经安装了nginx 答案: 既然你使用了 CentOS 8,并且你想使用 /home/images 目录存放…...
使用NXP GUI GUIDER生成的GUI移植到雅特力MCU平台过程详解(ST/GD/国民/极海通用)
好记性不如烂笔头,既然不够聪明,就乖乖的做笔记,温故而知新。 本文档用于本人对知识点的梳理和记录 一、前言 上一篇我们有介绍NXP GUI Guider工具如何制作和调试GUI,GUI神器 NXP GUI GUIDER开发工具入门教程https://blog.csdn.n…...
JVM——配置常用参数,GC调优策略
文章目录 JVM 配置常用参数Java内存区域常见配置参数概览堆参数回收器参数项目中常用配置常用组合 常用 GC 调优策略GC 调优原则GC 调优目的GC 调优策略 JVM 配置常用参数 Java内存区域常见配置参数概览堆参数;回收器参数;项目中常用配置;常…...
使用IDEA把Java程序打包成jar
点击左上角File,选择Project Structure 左侧选中Artifacts,点击右侧的号 选择JAR->From modules with dependencies 选择你要运行的main方法所在的类,选好了点击OK Artifacts添加完成后点击右下角OK 在工具栏中找到Build,选择Build Artifacts 刚才创建好的Artifacts,选择Bui…...
元宇宙和数字孪生的异同探究
元宇宙和数字孪生,作为两个备受瞩目的概念,都在不同领域引起了巨大的关注。虽然它们都涉及数字化世界的构建,但元宇宙和数字孪生在概念、应用和影响方面存在一些异同点。 相似之处: 数字表示: 元宇宙和数字孪生都依赖…...
初识微服务
我们在曾经最常见的就是所谓的单体架构,但是由于网民越来越多,单体架构已经逐渐的被淘汰出去,所以我们在单体架构的基础上提出了微服务,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合࿰…...
数据库锁的分类 各种锁
锁的一个分类 数据库中的锁前言分享链接个人总结全局锁:表级锁行级锁: 数据库中的锁 前言 C支持并发有锁,Linux里面也有锁机制,数据库也有锁,什么互斥锁,表级锁,间隙锁,好多…&…...
MySQL数据库软件
MySQL数据库软件的详细知识介绍: 1. 存储引擎 MySQL支持多种存储引擎,如InnoDB、MyISAM等。不同引擎有各自的特点,InnoDB支持事务、行锁,MyISAM支持全文索引等。 2. 索引结构 MySQL索引主要有B树索引、哈希索引、全文索引等。这些索引通过不同的数据结构加速查找效率。 3. …...
无涯教程-PHP - preg_match_all()函数
preg_match_all() - 语法 int preg_match_all (string pattern, string string, array pattern_array [, int order]); preg_match_all()函数匹配字符串中所有出现的模式。 它将按照您使用可选输入参数order指定的顺序将这些匹配项放置在pattern_array数组中。有两种可能的类…...
Docker 练习2 安装MySQL
一、实验要求 1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 2、安装搭建私有仓库 Harbor 3、编写Dockerfile制作Web应用系统nginx镜像,生成镜像nginx:v1.1,并推送其到私有仓库。具体要求如下: (1)…...
AndroidStudio 编译报错Unable to make field private final
用 AndroidStudio 打开某个工程后,编译报错如下 Execution failed for task :app:processDebugMainManifest. > Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to …...
linux 上安装es
首先 到官网 https://www.elastic.co/cn/downloads/elasticsearch 下载对应的安装包,我这里下载的是 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.9.1-linux-x86_64.tar.gz 然后讲该压缩包上传到 linux 的/usr/local 目录下执行 tar -z…...
www 上海网站建设/南昌搜索引擎优化
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处作者:流云编辑:流云链接:https://news.mydrivers.com/1/687/687718_all.htm#2来源:快科技 2020-05-07 21:00:39一、前言:时代变了 入门…...
wordpress加载本地字体/seo排名优化北京
这里是腾讯汽车官方汽车科技公众号点击上方“汽车AI科技”选择“置顶或星标公众号”最新汽车科技消息,第一时间送达腾讯汽车 图文/常岩这是一个最好的时代,我们欣喜于汽车产业前所未有的一次技术产业升级;这是一个最坏的时代,我们…...
重庆网站开发商城/今天国际新闻最新消息
一、python语言基础 1.1变量变量.png 1.2数据类型数据类型.png 1.3序列 序列分类:可变序列list,不可变序列tuple、str。在python中,内建了6中序列:列表、元组、字符串、unicode字符串、buffer对象、xrange对象。 (1)list列表list列…...
四川微信网站建设/游戏推广员好做吗
下图中,我画出了Spring MVC中,跟异常处理相关的主要类和接口。 1.包含文件 spring.xmlmessages_zh_CN.propertiesmessages_en_US.propertiesExceptionHandle.javaXXController.java2.文件内容 spring.xml <mvc:annotation-driven validator"vali…...
seo批量建站/怎样创建自己的网站
回收宝给出的今年低配高价手机排名数据显示,国产手机四强的华为、OPPO、vivo的手机均上榜,仅有小米的手机未有入榜。回收宝给出的数据显示,今年低配高价手机前十名当中以三星Galaxy note20居于第一名,华为有四款手机入榜ÿ…...
oss做静态网站/宁波谷歌优化
光学三维测量是什么? 光学三维测量时通过运动适当的光学和电子仪器非接触地获取被测物体外部形貌的方法和技术。光学三维测量是指对物体空间外形和结构进行扫描,以获得物体表面点的三维空间坐标的一项技术。 有什么用? 光学测量在工业自动检测…...