Soul是一个异步的,高性能的,跨语言的,响应式的API网关。我希望能够有一样东西像灵魂一样,保护您的微服务。参考了Kong,Spring-Cloud-Gateway等优秀的网关后,站在巨人的肩膀上,Soul由此诞生!
基本概念
adminUrl:Soul的管理配置平台
contextPath:给后端每个应用定义的一个目录,基于此来路由到不同的应用,与应用自己的contextPath是不同的概念。
appName:后端每个应用的名称,仅用于展示
path:给后端每个接口定义的一个访问路径,基于此来做路由到不同的接口,对于http接口,就是原始http访问路径(比如:Controller里面方法定义的访问路径);对于dubbo接口,可以理解为一个访问用的映射路径
选择器(SelectorData)
名称:
类型
SelectorTypeEnum:选择器类型,分为全流量和自定义流量
匹配方式:条件的逻辑运算(and(AndMatchStrategy
),or(OrMatchStrategy
))
条件
条件(ConditionData)用来匹配(OperatorJudge
)请求(AbstractMatchStrategy
),包括四个属性:
- paramType:参数类型(ParamTypeEnum),包括header、uri、query、host、ip、post等
- paramName:参数名称,只有在paramType是header、query和post时有作用,根据参数名称获取
真实值(realData)
- operator:操作符(
OperatorEnum
),包括match、=、regEx和like,具体算法可以参见OperatorJudge
- paramValue:参数值,会被trim处理,如果是uri,则支持逗号分隔多个
OperatorJudge
类型 | 对应operator | 描述 |
---|---|---|
MatchOperatorJudge | match | 对于非uri,跟like一样;对于uri,采用Ant-style模式匹配 |
EqOperatorJudge | = | 相等 |
LikeOperatorJudge | like | 包含 |
RegExOperatorJudge | regEx | 正则表达式 |
继续后续选择器:
打印日志:
是否开启:
规则(RuleData)
名称:
处理(handle)
不同插件定制参数及其处理
http
{“loadBalance”:”random”,”retry”:0,”timeout”:3000}
waf
{“permission”:”reject”,”statusCode”:”403”}
限流
{“replenishRate”:”1”,”burstCapacity”:”1”}
dubbo
{“version”:null,”group”:null,”retries”:0,”loadBalance”:”random”,”timeout”:3000}
hystrix
1 |
|
1 |
|
数据结构
元数据
接口的定义、参数等基础信息,由@SoulClient自动填入。
HTTP元数据
Dubbo元数据
其中rpc扩展参数
为DubboParamExt
,代码:
1 |
|
数据同步
websocket
zookeeper
http长连接
请求核心流程
WebFilter
ParamWebFilter
请求过滤器:org.dromara.soul.web.filter.ParamWebFilter
ParamService
参数处理
TimeWebFilter
WebSocketFilter
SoulWebHandler
遍历插件
插件
SoulPlugin
org.dromara.soul.web.plugin.SoulPlugin
PluginEnum:内置plugin,包括sign、waf、dubbo等13个值,实际不止,还有一些是硬编码的。
PluginTypeEnum:插件类型,包括before、function和last,处理顺序是before-》function-》last
AbstractSoulPlugin
org.dromara.soul.web.plugin.AbstractSoulPlugin
遍历选择器,遍历规则。
如下9个SoulPlugin继承了AbstractSoulPlugin,包括:DividePlugin,DubboPlugin,HystrixPlugin,MonitorPlugin,RateLimiterPlugin,RewritePlugin,SpringCloudPlugin,WafPlugin,WebSocketPlugin
GlobalPlugin
org.dromara.soul.web.plugin.before.GlobalPlugin
静默
SignPlugin
org.dromara.soul.web.plugin.before.SignPlugin
静默
WafPlugin
org.dromara.soul.web.plugin.before.WafPlugin
样例
1 |
|
RateLimiterPlugin
org.dromara.soul.web.plugin.function.RateLimiterPlugin
插件的配置中配置redis地址:{"master":"mymaster","mode":"Standalone","url":"localhost:6379","password":""}
样例
请求
1 |
|
RewritePlugin
org.dromara.soul.web.plugin.function.RewritePlugin
HystrixPlugin
org.dromara.soul.web.plugin.hystrix.HystrixPlugin
DividePlugin
org.dromara.soul.web.plugin.function.DividePlugin
样例
Admin配置
get
请求
1 |
|
post
请求
1 |
|
###
SpringCloudPlugin
org.dromara.soul.web.plugin.function.SpringCloudPlugin
WebClientPlugin
处理http和spring cloud请求发送
org.dromara.soul.web.plugin.http.WebClientPlugin
WebSocketPlugin
org.dromara.soul.web.plugin.function.WebSocketPlugin
DubboPlugin
org.dromara.soul.web.plugin.function.DubboPlugin
插件的配置中配置zookeeper地址:{"register":"zookeeper://localhost:2181"}
利用dubbo泛化调用实现(org.dromara.soul.web.plugin.dubbo.DubboProxyService
)
- interfaceName:必填,请求的接口的全限定名。
- method:必填,请求的方法。
- 如果请求的方法的参数是primary类型,则
- params:请求的参数类型和值,json对象表示,比如你的参数是一个String,Int 等。 如果是连续相同类型的参数,那么就要写成一个数组。
- 如果请求参数是对象,比如自定义对象、java.util.Map、java.util.List等
- paramClass:对象全限定名,多个用都逗号分隔。
- classParams:对象值,json数组。
2.1.2版本默认仅支持单个参数,比如基本类型、DTO、Map和List等,如需要支持多个参数,可扩展实现。
样例
Admin配置
simple parameter
DTO parameter
请求
1 |
|
Map parameter
List parameter
no parameter
1 |
|
由于不需要参数,因而元数据
的参数类型
没有用处,可以随便填
异步非阻塞
DubboProxyService.java
1 |
|
堆栈
1 |
|
MonitorPlugin
WebClientResponsePlugin
处理http和spring cloud应答响应
静默
DubboResponsePlugin
处理dubbo应答响应
NettyHttpClientPlugin
处理http和spring cloud请求发送
NettyClientResponsePlugin
处理http和spring cloud应答响应
SoulPluginChain
线程模型
客户端
soul针对不同的后端分别提供了相应的客户端接入包
客户端自动注册
基于@SoulClient
和BeanPostProcessor
相应实现,客户端在启动时自动注册(包括元数据
,选择器
和规则
)。
客户端需要配置soul-admin的地址:
1 |
|
http
针对http的BeanPostProcessor
实现为org.dromara.soul.client.springmvc.spring.SoulClientBeanPostProcessor
后端服务器的ip和端口如果希望自动登记,则soul-admin增加配置:
1 |
|
客户端增加配置:
1 |
|
Alibaba Dubbo
针对alibaba dubbo的BeanPostProcessor
实现为org.dromara.soul.client.dubbo.spring.DubboServiceBeanPostProcessor
Apache Dubbo
针对apache dubbo的BeanPostProcessor
实现为org.dromara.soul.client.dubbo.spring.DubboServiceBeanPostProcessor
Spring Cloud
针对Spring Cloud的BeanPostProcessor
实现为org.dromara.soul.client.springcloud.spring.SoulSpringCloudClientBeanPostProcessor