【Soul源码阅读系列(一)】Soul网关初探
本篇文章主要内容如下:
Soul
是什么- 如何在本地运行
Soul
- 对
Soul
进行压测
Soul 是什么
Soul
是什么?它可不是灵魂交友软件!
引用Soul
的官网,它是这样描述Soul
的:
这是一个异步的,高性能的,跨语言的,响应式的
API
网关。我希望能够有一样东西像灵魂一样,保护您的微服务。参考了Kong
,Spring-Cloud-Gateway
等优秀的网关后,站在巨人的肩膀上,Soul
由此诞生!
Soul
是一个网关,它的特点如下:
- 支持各种语言(
http
协议),支持dubbo
,spring cloud
协议。 - 插件化设计思想,插件热插拔,易扩展。
- 灵活的流量筛选,能满足各种流量控制。
- 内置丰富的插件支持,鉴权,限流,熔断,防火墙等等。
- 流量配置动态化,性能极高,网关消耗在
1~2ms
。 - 支持集群部署,支持
A/B Test
,蓝绿发布。
来自官网的一张架构图
从上面的架构图可以看出,Soul
网关与语言无关,各种语言(Java
,PHP
,.NET
等)都可以接入到网关中。它通过对不同插件的支持实现各种功能(监控,认证,限流,熔断,不同用户接入等)。在后台管理系统(soul-admin
)就可以灵活配置各种流量。
如何在本地运行 Soul
好了,知道了Soul
是一个网关,那么接下来就看看怎么使用它。 通过案例演示的方式比直接了解各个概念的方式更能激发兴趣,所以开始play it
吧!
从官网拉取项目源码
git clone git@github.com:dromara/soul.git
,当前最新版本是2.2.1
。创建并切换分支
git checkout -b myLearn
,就在自己的在本地跑,直接用master
分支也行。使用
IDEA
打开项目,然后本地编译一下,确保没有错。mvn clean install
第一次编译会很慢,需要下载依赖。当然,也可以跳过相关测试和注释,这样会快一点。
mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true
启动
Soul
的后台管理地址,就是项目源码中的soul-admin
模块,这是一个SpringBoot
项目,只需要修改一下数据库的地址就可以运行了。项目会自动创建对应的库和表。项目启动后的登录地址是
http://localhost:9095/
,默认用户名是admin
,密码是123456
。后台界面如下:主要模块有插件列表和系统管理,在插件列表中可以对各个插件进行管理,每个插件都可以添加多个选择器,每个选择器都可以添加多条规则。实际这就是
Soul
根据请求的URL
去匹配规则:插件->选择器->规则
,这个后面再细说。启动
Soul
的核心模块soul-bootstrap
,这是网关的核心处理逻辑。不要怕它,这个模块本身不复杂,目录结构如下:启动成功后,就可以访问这个网关了
http://127.0.0.1:9195/
,返回信息如下:{"code":-107,"message":"Can not find selector, please check your configuration!","data":null}
因为还没有接入业务系统,所以没有相关返回值,上面展示的信息是
Soul
网关没有找到相应的选择器,返回的一个提示信息通过上述步骤,就成功的搭建起
Soul
网关服务了,后面就是在自己的业务系统上使用网关。使用例子可以参考soul-examples
模块。本文运行
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网关初探相关推荐
- 【Dubbo源码阅读系列】之远程服务调用(上)
今天打算来讲一讲 Dubbo 服务远程调用.笔者在开始看 Dubbo 远程服务相关源码的时候,看的有点迷糊.后来慢慢明白 Dubbo 远程服务的调用的本质就是动态代理模式的一种实现.本地消费者无须知道 ...
- TiDB 源码阅读系列文章(六)Select 语句概览
在先前的 TiDB 源码阅读系列文章(四) 中,我们介绍了 Insert 语句,想必大家已经了解了 TiDB 是如何写入数据,本篇文章介绍一下 Select 语句是如何执行.相比 Insert,Sel ...
- TiDB 源码阅读系列文章(十九)tikv-client(下)
上篇文章 中,我们介绍了数据读写过程中 tikv-client 需要解决的几个具体问题,本文将继续介绍 tikv-client 里的两个主要的模块--负责处理分布式计算的 copIterator 和执 ...
- TiDB 源码阅读系列文章(十五)Sort Merge Join
2019独角兽企业重金招聘Python工程师标准>>> 什么是 Sort Merge Join 在开始阅读源码之前, 我们来看看什么是 Sort Merge Join (SMJ),定 ...
- DM 源码阅读系列文章(二)整体架构介绍
2019独角兽企业重金招聘Python工程师标准>>> 作者:张学程 本文为 DM 源码阅读系列文章的第二篇,第一篇文章 简单介绍了 DM 源码阅读的目的和规划,以及 DM 的源码结 ...
- SpringMVC源码阅读系列汇总
1.前言 1.1 导入 SpringMVC是基于Servlet和Spring框架设计的Web框架,做JavaWeb的同学应该都知道 本文基于Spring4.3.7源码分析,(不要被图片欺骗了,手动滑稽 ...
- TiDB 源码阅读系列文章(十六)INSERT 语句详解
在之前的一篇文章 <TiDB 源码阅读系列文章(四)INSERT 语句概览> 中,我们已经介绍了 INSERT 语句的大体流程.为什么需要为 INSERT 单独再写一篇?因为在 TiDB ...
- DM 源码阅读系列文章(四)dump/load 全量同步的实现
作者:杨非 本文为 DM 源码阅读系列文章的第四篇,上篇文章 介绍了数据同步处理单元实现的功能,数据同步流程的运行逻辑以及数据同步处理单元的 interface 设计.本篇文章在此基础上展开,详细介绍 ...
- 【Dubbo源码阅读系列】服务暴露之本地暴露
在上一篇文章中我们介绍 Dubbo 自定义标签解析相关内容,其中我们自定义的 XML 标签 <dubbo:service /> 会被解析为 ServiceBean 对象(传送门:Dubbo ...
最新文章
- 水晶报表调用存储过程的问题
- 创建docker用户组并加入
- powerpoint预览_如何安排PowerPoint幻灯片的时间以进行更有效的演示
- [笔记][原创]Verilog HDL语法分析笔记
- python 定义数组
- 从流程的自动化中获得最大价值的10种方式
- 360云台智能看家存储在哪_新品360智能摄像机云台变焦版,惊喜改变可不止一点点...
- python 笔记(一)
- Stanford CS230深度学习(六)目标检测、人脸识别和神经风格迁移
- ​从程序员到 33 岁的亿万富翁
- PHP+Flash网页游戏开发 - 基本思路
- 使用casewhen来判断执行不同的sql
- 夏普Sharp MX-B401 一体机驱动
- 13.6.1 PDF 偏执狂
- Eclipse Android Junit Test 测试实例
- YUVPlayer: 基于Android平台的YUV视频原始数据播放器
- 就是要弄懂你之—— 同步 异步 阻塞 非阻塞
- 8大基本数据类型各占多少字节和一些单位常识
- 东华大学计算机考研大纲,2019年东华大学854计算机及软件工程专业基础综合考研初试大纲...
- matlab-高数 diff 方向导数