本篇文章主要内容如下:

  • Soul是什么
  • 如何在本地运行Soul
  • Soul进行压测

Soul 是什么

Soul是什么?它可不是灵魂交友软件!

引用Soul的官网,它是这样描述Soul的:

这是一个异步的,高性能的,跨语言的,响应式的API网关。我希望能够有一样东西像灵魂一样,保护您的微服务。参考了KongSpring-Cloud-Gateway等优秀的网关后,站在巨人的肩膀上,Soul由此诞生!

Soul是一个网关,它的特点如下:

  • 支持各种语言(http协议),支持 dubbospring cloud协议。
  • 插件化设计思想,插件热插拔,易扩展。
  • 灵活的流量筛选,能满足各种流量控制。
  • 内置丰富的插件支持,鉴权,限流,熔断,防火墙等等。
  • 流量配置动态化,性能极高,网关消耗在1~2ms
  • 支持集群部署,支持 A/B Test,蓝绿发布。

来自官网的一张架构图


从上面的架构图可以看出,Soul网关与语言无关,各种语言(Java,PHP,.NET等)都可以接入到网关中。它通过对不同插件的支持实现各种功能(监控,认证,限流,熔断,不同用户接入等)。在后台管理系统(soul-admin)就可以灵活配置各种流量。

如何在本地运行 Soul

好了,知道了Soul是一个网关,那么接下来就看看怎么使用它。 通过案例演示的方式比直接了解各个概念的方式更能激发兴趣,所以开始play it吧!

  1. 从官网拉取项目源码 git clone git@github.com:dromara/soul.git,当前最新版本是2.2.1

  2. 创建并切换分支git checkout -b myLearn,就在自己的在本地跑,直接用master分支也行。

  3. 使用IDEA打开项目,然后本地编译一下,确保没有错。

    mvn clean install

    第一次编译会很慢,需要下载依赖。当然,也可以跳过相关测试和注释,这样会快一点。

    mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true
  4. 启动Soul的后台管理地址,就是项目源码中的soul-admin模块,这是一个SpringBoot项目,只需要修改一下数据库的地址就可以运行了。项目会自动创建对应的库和表。


    项目启动后的登录地址是http://localhost:9095/,默认用户名是admin,密码是123456。后台界面如下:


    主要模块有插件列表和系统管理,在插件列表中可以对各个插件进行管理,每个插件都可以添加多个选择器,每个选择器都可以添加多条规则。实际这就是Soul根据请求的URL去匹配规则:插件->选择器->规则,这个后面再细说。

  5. 启动Soul的核心模块soul-bootstrap,这是网关的核心处理逻辑。不要怕它,这个模块本身不复杂,目录结构如下:


    启动成功后,就可以访问这个网关了http://127.0.0.1:9195/,返回信息如下:

    {"code":-107,"message":"Can not find selector, please check your configuration!","data":null}

    因为还没有接入业务系统,所以没有相关返回值,上面展示的信息是Soul网关没有找到相应的选择器,返回的一个提示信息

  6. 通过上述步骤,就成功的搭建起Soul网关服务了,后面就是在自己的业务系统上使用网关。使用例子可以参考soul-examples模块。

  7. 本文运行soul-examples下面的 http服务,结合divde插件,发起http请求到soul网关,体验http代理。模块目录及配置信息如下:


    配置文件中有关soul的配置我们后面再详细解释,现在只需要知道这个服务就是一个很普通的Spring Boot项目。其中的一个接口信息如下:

    @GetMapping("/findById")@SoulSpringMvcClient(path = "/findById", desc = "Find by id")public OrderDTO findById(@RequestParam("id") final String id) {    OrderDTO orderDTO = new OrderDTO();    orderDTO.setId(id);    orderDTO.setName("hello world findById");    return orderDTO;}

    运行SoulTestHttpApplication,启动这个项目。成功之后,通过postman进行访问:

    发起一个Get请求: http://localhost:8188/order/findById?id=99 得到的响应结果:{ "id": "99", "name": "hello world findById"}

    上面就是一个普通的http请求,直接请求业务系统的后端服务,现在通过Soul网关来访问该服务。

    同样发起一个Get请求:http://localhost:9195/http/order/findById?id=99得到的响应结果:{ "id": "99", "name": "hello world findById"}

    这个localhost:9195地址就是网关的地址,/http是业务系统在网关中的名称。那么,现在的请求就是先通过Soul网关,再由网关转发到实际的请求接口。

    对 Soul 进行压测

    成功在本地运行Soul网关之后,我们最后再来看看Soul网关的性能如何。在windows平台可以通过SuperBenchmarker工具进行压测。压测设置的参数是200个请求,32个并发,100秒内执行完。

    C:\Users\admin>sb -u http://localhost:9195/http/order/findById?id=99 -n 200 -c 32 -N 100Starting at 2021/2/22 21:30:07[Press C to stop the test]154500  (RPS: 1493.2)---------------Finished!----------------Finished at 2021/2/22 21:31:50 (took 00:01:43.6728900)Status 200:    154500
    
    RPS: 1526.3 (requests/second)Max: 205msMin: 0msAvg: 4.5ms
    
     50%   below 2ms 60%   below 3ms 70%   below 5ms 80%   below 7ms 90%   below 11ms 95%   below 15ms 98%   below 20ms 99%   below 24ms99.9%   below 38ms

    然后再来看一下直连的情况

    C:\Users\admin>sb -u http://localhost:8188/order/findById?id=99 -n 200 -c 32 -N 100Starting at 2021/2/22 21:32:16[Press C to stop the test]396602  (RPS: 3826.8)---------------Finished!----------------Finished at 2021/2/22 21:33:59 (took 00:01:43.8629227)396604  (RPS: 3819.7)                   Status 200:    396604
    
    RPS: 3916.9 (requests/second)Max: 77msMin: 0msAvg: 0.3ms
    
     50%   below 0ms 60%   below 0ms 70%   below 0ms 80%   below 0ms 90%   below 0ms 95%   below 1ms 98%   below 5ms 99%   below 8ms99.9%   below 20ms

    可以看到 直连的RPS(3916.9)还是大于经过网关转发后的RPS(1526.3 ),毕竟多了网关这一层的转发。

    小结一下,本篇文章介绍了Soul网关的特点和架构设计。然后,拉取soul源码,在本地运行测试案例。最后,对soul网关进行了简单的压测。

    参考文献:

  • soul介绍
  • soul学习03——性能测试
  • Soul网关学习(1) 环境配置

【Soul源码阅读系列(一)】Soul网关初探相关推荐

  1. 【Dubbo源码阅读系列】之远程服务调用(上)

    今天打算来讲一讲 Dubbo 服务远程调用.笔者在开始看 Dubbo 远程服务相关源码的时候,看的有点迷糊.后来慢慢明白 Dubbo 远程服务的调用的本质就是动态代理模式的一种实现.本地消费者无须知道 ...

  2. TiDB 源码阅读系列文章(六)Select 语句概览

    在先前的 TiDB 源码阅读系列文章(四) 中,我们介绍了 Insert 语句,想必大家已经了解了 TiDB 是如何写入数据,本篇文章介绍一下 Select 语句是如何执行.相比 Insert,Sel ...

  3. TiDB 源码阅读系列文章(十九)tikv-client(下)

    上篇文章 中,我们介绍了数据读写过程中 tikv-client 需要解决的几个具体问题,本文将继续介绍 tikv-client 里的两个主要的模块--负责处理分布式计算的 copIterator 和执 ...

  4. TiDB 源码阅读系列文章(十五)Sort Merge Join

    2019独角兽企业重金招聘Python工程师标准>>> 什么是 Sort Merge Join 在开始阅读源码之前, 我们来看看什么是 Sort Merge Join (SMJ),定 ...

  5. DM 源码阅读系列文章(二)整体架构介绍

    2019独角兽企业重金招聘Python工程师标准>>> 作者:张学程 本文为 DM 源码阅读系列文章的第二篇,第一篇文章 简单介绍了 DM 源码阅读的目的和规划,以及 DM 的源码结 ...

  6. SpringMVC源码阅读系列汇总

    1.前言 1.1 导入 SpringMVC是基于Servlet和Spring框架设计的Web框架,做JavaWeb的同学应该都知道 本文基于Spring4.3.7源码分析,(不要被图片欺骗了,手动滑稽 ...

  7. TiDB 源码阅读系列文章(十六)INSERT 语句详解

    在之前的一篇文章 <TiDB 源码阅读系列文章(四)INSERT 语句概览> 中,我们已经介绍了 INSERT 语句的大体流程.为什么需要为 INSERT 单独再写一篇?因为在 TiDB ...

  8. DM 源码阅读系列文章(四)dump/load 全量同步的实现

    作者:杨非 本文为 DM 源码阅读系列文章的第四篇,上篇文章 介绍了数据同步处理单元实现的功能,数据同步流程的运行逻辑以及数据同步处理单元的 interface 设计.本篇文章在此基础上展开,详细介绍 ...

  9. 【Dubbo源码阅读系列】服务暴露之本地暴露

    在上一篇文章中我们介绍 Dubbo 自定义标签解析相关内容,其中我们自定义的 XML 标签 <dubbo:service /> 会被解析为 ServiceBean 对象(传送门:Dubbo ...

最新文章

  1. 水晶报表调用存储过程的问题
  2. 创建docker用户组并加入
  3. powerpoint预览_如何安排PowerPoint幻灯片的时间以进行更有效的演示
  4. [笔记][原创]Verilog HDL语法分析笔记
  5. python 定义数组
  6. 从流程的自动化中获得最大价值的10种方式
  7. 360云台智能看家存储在哪_新品360智能摄像机云台变焦版,惊喜改变可不止一点点...
  8. python 笔记(一)
  9. Stanford CS230深度学习(六)目标检测、人脸识别和神经风格迁移
  10. ​从程序员到 33 岁的亿万富翁
  11. PHP+Flash网页游戏开发 - 基本思路
  12. 使用casewhen来判断执行不同的sql
  13. 夏普Sharp MX-B401 一体机驱动
  14. 13.6.1 PDF 偏执狂
  15. Eclipse Android Junit Test 测试实例
  16. YUVPlayer: 基于Android平台的YUV视频原始数据播放器
  17. 就是要弄懂你之—— 同步 异步 阻塞 非阻塞
  18. 8大基本数据类型各占多少字节和一些单位常识
  19. 东华大学计算机考研大纲,2019年东华大学854计算机及软件工程专业基础综合考研初试大纲...
  20. matlab-高数 diff 方向导数

热门文章

  1. 计算机培训教师的培训计划,教师计算机培训工作计划
  2. 不一样的手机3D壁纸,展现手机炫酷特效
  3. 基于Android二手车交易网站系统app
  4. 什么是内连接,外连接? 有什么用途和好处
  5. 新浪2014校园招聘笔试题
  6. nyist 737
  7. python爬虫设置代理ip池
  8. python加权求和_python – 随机矩阵的所有行的快速随机加权选择
  9. [Deepin - Pycharm调试记录] Matplot3D动态画图报错问题
  10. vscode左下角分支信息不显示