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.ymlshenyu.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请求转发到目标地址)处理 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx+keepalived负载均衡和高可用配置

概述 nginx用来负载均衡&#xff0c;keepalived是用来实现VIP故障切换。 配置 nginxkeepalived配置中&#xff0c;后端普通服务器不需要lvs实现负载均衡。 在服务器上停止之前的lvs配置 /etc/init.d/lvs_rs stop 1.nginx的配置 在主备节点上测试 配置nginx之前需要将kee…

UE学习记录03----UE5.2 使用MVVM示例

1.打开ue5.2新建C项目 2.项目中通过类导向新建C类&#xff0c;父类选择为UMVVMViewModelBase&#xff0c;创建完成会自动打开vs 3.在VS中对新建的类进行宏定义 使用 C 类向导 创建的类声明自动通过 UCLASS() 宏进行处理。 UCLASS() 宏使得引擎意识到这个类的存在&#xff0c;并…

React Native 任务列表实战

通过 ToDo 的小项目实战&#xff0c;我们可以回顾页面布局&#xff0c;事件的监听&#xff0c;React Native 中的钩子函数使用。 整体项目框架搭建以及相关基础样式 首先我们先完成项目的整体框架搭建&#xff0c;把页面中相关的元素和样式类名定义好。并且表明对应单独组建的…

【linux】NFS调试总结

文章目录 00. ENV10. 简述20. 下载、安装、配置30. 使用1. 从uboot中设置NFS启动文件系统2. 调试 80. 问题1. NFS版本不匹配问题 90. 附件91. 服务端NFS配置项简述 00. ENV ubuntn1804 10. 简述 百度百科&#xff1a;https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E6%96%87…

【Rust】Rust学习 第十九章高级特征

现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十章开始另一个新项目之前&#xff0c;让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们&#xf…

阿里云短信发送模板

1.读取yml的配置Data ConfigurationProperties(prefix "aliyun.sms") public class SmsProperties {private String signName;private String templateCode;private String accessKey;private String secret; } 2.封装方法并注入容器 Bean public class SmsTempla…

上海交大ACM班总教头团队重磅新作,带你动手学机器学习(文末赠书4本)

目录 0 写在前面1 什么是机器学习&#xff1f;2 ACM 班总教头&#xff1a;俞勇3 动手学习机器学习赠书活动 0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器…

一些自定义hooks

文章目录 1、点击框外隐藏弹窗hook 1、点击框外隐藏弹窗hook **描述&#xff1a;**有一个需要自己封装弹窗的组件&#xff0c;实现点击弹窗框外时隐藏弹窗 代码&#xff1a; import { useEffect } from “react”; // 点击框外hooks import { useEffect } from "react&q…

怎么制作sip网络寻呼话筒,sip任意呼叫主机,

怎么制作sip网络寻呼话筒&#xff0c;sip任意呼叫主机&#xff0c; 所需材料一&#xff1a;SV-2103VP sip网络音频模块 功能如下&#xff1a; SV-2101VP/ SV-2103VP使用了AT32F437VGT7处理器构架加专业的双向音频Codec编解码器&#xff0c; 处理器负责数据的传输&#xff0c…

Chrome历史版本下载和Selenium驱动版本下载

Python自动化必备&#xff1a; Selenium驱动版本下载 http://chromedriver.storage.googleapis.com/index.html Chrome浏览器历史版本下载 https://www.slimjet.com/chrome/google-chrome-old-version.php

Springboot使用DataRest直接访问数据库

Spring-boot-data-rest 直接将数据库资源映射成为Rest资源 说明 Spring Data REST是基于Spring Data的repository之上&#xff0c;可以把 repository 自动输出为REST资源&#xff0c;目前支持Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j、Spring Data GemFire…

chapter 3 Free electrons in solid - 3.2 量子自由电子理论对一些现象的解释

3.2 自由电子气的热容 Heat capacity of free electron gas 3.2.1 计算自由电子的热容 Calculation of Heat Capacity of free Electrons T>0K, total energy of free electrons: E ∫ E d N 3 5 N e E F 0 [ 1 5 12 π 2 ( k B T E F 0 ) 2 ] E \int EdN \frac{3}{5}…

最新APP下载官网源码带app预览,

适合做软件&#xff0c;游戏&#xff0c;产品&#xff0c;企业工作室官网&#xff0c;有能力的可自行二开。 源码&#xff1a;星域社区官网源码.zip - 蓝奏云

ARL资产侦察灯塔 指纹增强

项目&#xff1a;https://github.com/loecho-sec/ARL-Finger-ADD 下载项目后运行 python3 ARl-Finger-ADD.py https://你的vpsIP:5003/ admin password该项目中的finger.json可以自己找到其他的指纹完善&#xff0c;然后运行脚本添加指纹。

mysql 正则表达式,每三个img标签图片后面添加<hr>

你可以使用MySQL的REGEXP_REPLACE函数来实现这个需求。下面是一个示例的正则表达式和SQL语句&#xff1a; sql UPDATE your_table SET your_column REGEXP_REPLACE(your_column, (<img[^>]*>){3}, $0<hr>) WHERE your_column REGEXP (<img[^>]*>){3}…

VM——获取图像中的圆环区域

、需求&#xff1a;下图是圆柱形铝罐&#xff0c;需要获取图像中的罐沿区域。 2、方法如下&#xff1a; (1)通过找外圆&#xff0c;提取圆形区域 &#xff08;2&#xff09;利用“拷贝填充”模块&#xff0c;绘制外圆ROI&#xff0c;选择“输出掩膜” &#xff08;3&#xff09…

4.前端常用时间工具函数封装

1 判断闰年函数 闰年需要满足以下两个条件&#xff0c;1、能被4整除&#xff0c;但不能被100整除&#xff1b;2、能被400整除 /*** 判断润年* param {string} year 年份* return {Boolean}*/ const isLeap function(year) {if ((year % 4 0 && year % 100 ! 0) || …

【leetcode 力扣刷题】双指针//哈希表 解决链表有环等问题

双指针//哈希表 解决链表有环等问题 19. 删除链表的倒数第N个结点遍历两次&#xff0c;先求得链表长度&#xff0c;再删除双指针&#xff0c;只遍历一次 141. 环形链表 【判断链表是否有环】哈希表快慢双指针 142. 环形链表Ⅱ 【找环的入口】哈希表双指针求环中有多少个结点 面…

【jvm】类的主动使用和被动使用

目录 一、主动使用二、被动使用 一、主动使用 1.创建类的实例 2.访问某个类或接口的静态变量&#xff0c;或者对该静态变量赋值 3.调用类的静态方法 4.反射&#xff08;例如Class.forName(“com.learning.Test”)&#xff09; 5.初始化一个类的子类 6.java虚拟机启动时被标明为…

【广州华锐视点】AR配电所巡检系统:可视化巡检利器

随着科技的发展&#xff0c;人工智能、大数据等技术逐渐应用于各个领域&#xff0c;为人们的生活带来便利。在电力行业&#xff0c;AR(增强现实)技术的应用也日益广泛。AR配电所巡检系统作为一种新型的巡检方式&#xff0c;可以实现多种功能&#xff0c;提高巡检效率&#xff0…