Apache ShenYu 学习笔记一

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

1、简介

这是一个异步的,高性能的,跨语言的,响应式的 API 网关。

  • 官网文档:https://shenyu.apache.org/zh/docs/index
  • 仓库地址:https://github.com/apache/shenyu

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 并登陆,可以看到如下界面:
    Apache ShenYu 学习笔记一

2.4、启动shenyu-bootstrap

  • 找到shenyu-bootstrap子项目,修改application.ymlshenyu.local.enabled的值为true,方便本地调试。
  • 运行ShenyuBootstrapApplication
  • 该项目默认端口为:9195,后面设置路由规则需要用到

2.5、测试准备

  • 由于首次体验我们需要测试http接口转发,因此本地启动用于测试的web项目,提供一个待测试的接口:http://localhost:8081/test/hello 如下图:
    Apache ShenYu 学习笔记一

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 ,结果如下:
Apache ShenYu 学习笔记一

至此,首次体验已经完成。接下来,我想继续了解下本项目。

3、转发实现流程探究

以下的探究基于上面2.x体验流程

3.1、单一职责插件

通过官方文档:https://shenyu.apache.org/zh/docs/developer/custom-plugin ,可以看到如下内容:
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方法中打断点调试如下:
    Apache ShenYu 学习笔记一

  • 此处正好印证官方文档关于插件的描述,具体的转发逻辑由插件各自实现,我们可以通过自定义插件的方式进行扩展

  • 那么一个请求过来?网关是如何找到具体插件的呢?

3.3、ShenyuWebHandler

  • 断点通过方法调用栈发现,该请求从上游方法org.apache.shenyu.web.handler.ShenyuWebHandler.handle过来:
    Apache ShenYu 学习笔记一

  • ShenyuWebHandler类实现了org.springframework.web.server.WebHandler接口。

  • 可以看到,该handler方法拿到了plugins,并通过Reactor异步地将exchange发布出去

  • 然后通过责任链机制,按照插件定义的顺序依次匹配。未匹配上则忽略,匹配上则由对应的插件处理,正好与3.2步骤中的divide插件衔接上。匹配逻辑如下:
    Apache ShenYu 学习笔记一

  • 由于这是首次体验,我不想过多的探究细节,因此插件匹配、执行的细节此处暂且跳过,我们继续往下探究plugins从何而来?

3.4、shenyu-spring-boot-starter-gateway

  • 继续追溯,发现ShenyuWebHandler实例的生产地位于shenyu-spring-boot-starter-gateway中的ShenyuConfiguration
    Apache ShenYu 学习笔记一

  • 通过该方法发现,插件列表信息从方法参数ObjectProvider<List<ShenyuPlugin>> plugins获取,因此我们只要找到插件Bean实例生成的位置即可

3.5、shenyu-spring-boot-starter-plugin-divide

  • 于是很轻易的发现,在shenyu-spring-boot-starter-plugin-divide子项目下,有一个类:DividePluginConfiguration,包含如下代码:
    Apache ShenYu 学习笔记一

  • 因此,本次探究过程至此结束

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

5、联系我吧

我是一个热爱开源的小菜鸡,如果本文吸引到了你,欢迎通过下面的方式与我取得联系文章来源地址https://www.toymoban.com/news/detail-428638.html

  • 本文作者:傲世孤尘,dromara社区开源项目(neutrino-proxy)作者
  • 微信号:yuyunshize
  • 中微子代理(neutrino-proxy):一款基于netty的开源的内网穿透神器
  • 中微子代理文档:https://dromara.gitee.io/neutrino-proxy
  • 中微子代理仓库:https://gitee.com/dromara/neutrino-proxy

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

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

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

相关文章

  • Flask学习笔记_异步论坛(四)

    flask 系列的代码笔记都放在了 仓库。 生成本环境的requirements.txt文件 在app.py文件的目录下 celery(分布式任务队列/任务调度器)和redis(内存数据库)的教程和安装步骤可以参考学习。Broker和Backend都用redis存储。 pip install gevent pip install redis pip install hiredis 启动celery flask-cachi

    2024年02月14日
    浏览(41)
  • redis协议与异步方式学习笔记

    发布者与注册者之间是1:n的关系,类似于观察者模式。 下图中两个客户端监听 “n1”, 第三个客户端向\\\"n1\\\"发布消息: 还可以是监听 n1.*, 用命令psubscibe 实际使用redis的时候,会与redis server建立两条连接,一条专门订阅(一直处于等待状态,相当于阻塞了),另一条用来处理

    2024年02月10日
    浏览(28)
  • 【单元测试】测还是不测,这是一个问题

    这篇文章也可以在我的博客中查看 相信大家从小就被千叮万嘱要做单元测试。然后秉承这一信念,成为了一个测试狂魔。凡有代码,测!覆盖!最终,一波操作猛如虎:467测试,0错误, 0自信 。 第二天。 你为了优化,颤抖着手更改了一行代码。果不其然发现牵连了 1e9 个测

    2024年02月03日
    浏览(47)
  • JUC并发编程学习笔记(十四)异步回调

    Future设计的初衷:对将来的某个事件的结果进行建模 在Future类的子类中可以找到CompletableFuture,在介绍中可以看到这是为非异步的请求使用一些异步的方法来处理 点进具体实现类中,查看方法,可以看到CompletableFuture中的异步内部类,里面是实现的异步方法 以及一些异步方法

    2024年02月05日
    浏览(45)
  • Flask学习笔记_异步CMS(五)

    这篇博客是上一篇的后台,使用Vue3+VueCli+VueRouter+Vuex搭建,这个是 学习手册,具体的代码放到了 仓库。 nvm(Node Version Manager)是一个用来管理node版本的工具。首先去nvm下载,然后安装,环境变量自动添加,如果没有手动添加。nvm version查看安装好的版本有哪些。 常用命令

    2024年02月14日
    浏览(31)
  • AJAX学习笔记5同步与异步理解

    AJAX学习笔记4解决乱码问题_biubiubiu0706的博客-CSDN博客 示例 前端代码 后端两个 test1 test2 同步与异步的使用 当第一个按钮改成同步后    test1里面睡10秒

    2024年02月09日
    浏览(36)
  • Apache Doris 学习笔记

    目录 一、Doris简介 一)概述 二)使用场景 三)架构 二、Doris安装部署 一)安装要求 2.1.1 Linux操作系统 2.1.2 软件需求 2.1.3 开发测试环境 2.1.4 生产环境 2.1.5 内部端口使用说明 二)部署 2.2.1 操作系统 2.2.2 Doris安装包 2.2.3 解压安装包 2.2.4 配置FE 2.2.5 配置BE 三、Doris数据表设计

    2024年02月05日
    浏览(35)
  • vue中的异步请求Axios(个人学习笔记五)

    先看文章目录,大致了解知识点结构,直接点击文章目录可以跳转到文章指定位置。 ①传统的Ajax请求是基于XMLHttpRequest(XHR)对象。可以直接使用。但是使用起来配置较为麻烦,实际开发中使用非常少,在MVC时代通常使用的是JQuery-Ajax。相对于传统的Ajax现在使用更多的是Fe

    2024年02月15日
    浏览(32)
  • C# .Net学习笔记—— 异步和多线程(Thread)

     注意:现在不建议使用 thread.Suspend(); //线程挂起                                  和 thread.Resum();   //唤醒线程 thread.Abort(); //销毁,方法是抛异常,也不建议使用 1、Join 线程等待 2、thread.ThreadState; //线程状态 3、thread.IsBackground; (i)默认是前台线程,启动之后一定要

    2024年02月02日
    浏览(40)
  • 传道授业20年,这是一个老网工的初心

    下午好,我是老杨。 昨天又是教师节 ,虽然是网工,但因为经常写写文章、聊聊技术,很多小友都会很客气地称我一声杨老师。 老杨收到了很多“教师节快乐”的私信,在此多谢各位小友的祝福 如果说当网工,是我蓄谋已久为之奋斗的事业,那输出技术干货、行业解读、和

    2024年02月09日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包