soul开源网关项目搭建学习
1. soul开源网关项目搭建学习
1.1. 地址
1.2. 介绍
- 官方介绍:这是一个异步的,高性能的,跨语言的,响应式的API网关。参考了Kong,Spring-Cloud-Gateway等优秀的网关后,站在巨人的肩膀上,Soul由此诞生!
1.3. 特性
- 支持各种语言,无缝集成Dubbo,SpringCloud。
- 丰富的插件支持,鉴权,限流,熔断,防火墙等等。
- 网关多种规则动态配置,支持各种策略配置。
- 插件热插拔,易扩展
- 支持集群部署,支持A/B Test
1.4. 架构图

1.5. 依赖
- jdk1.8+
- maven3.2+
- git
- zookeeper
- mysql
1.6. 插件
1.6.1. divide插件
- divide插件定位是一个http代理插件,当请求头的rpcType为http的时候,并且插件开启的时候,它根据请求参数匹配到规则,然后进行响应式的代理调用。
1.6.2. dubbo插件
- dubbo插件,是soul支持dubbo框架的插件。dubbo插件开启,并且当请求头的rpcType字段为dubbo的时候,会走这个插件。
1.6.3. Springcloud插件
- springcloud插件,是soul支持springcloud框架的插件。Springcloud插件开启,并且当请求头的rpcType字段为springcloud的时候,会走这个插件。
- 可以进行hystrix熔断参数配置
- serviceId的服务调用
1.7. 源码解析
1.7.1. 核心 soul-web
1.7.1.1. 负载均衡算法(balance包)
- 代码架构还是比较清晰的,首先负载均衡算法

- 提供了3种算法,hash(哈希算法),random(随机),roundRobin(循环权重分配)分别对应了spi包里的三个类
- 算法实际使用在divide插件,追溯源码可以发现

- 具体算法设置在管理页面divide插件的规则列表设置

1.7.1.2. 缓存(cache包)
- UpstreamCacheManager类是divide插件专用,用来缓存更新该插件的选择器和规则以及定时检查url
- ZookeeperCacheManager 用来进行插件、选择器、规则、权限的缓存和zookeeper节点订阅
1.7.1.3. 自定义线程工厂(concurrent包)
- SoulThreadFactory用来自定义工厂名称、是否守护线程、优先级
1.7.1.4. 条件匹配(condition包)
- 管理页面中选择器规则的条件判断和策略控制

1.7.1.5. 配置(config包)

- dubbo插件配置
- 异常处理配置
- 时序数据库InfluxDB配置
- redis限流配置
- soul基本插件配合,如监控、限流、签名等
- springcloud插件配置
1.7.1.6. 并发写入监控数据(disruptor包)

- 使用了高性能并发框架disruptor
1.7.1.7. web请求过滤(filter包)
- 用于web请求过滤,进行参数验证、过期验证
1.7.1.8. handler处理(handler包)

- 用于创建webhandler相关实现,为webflux响应式编程实现
- 用于处理全局异常
- web请求处理拦截,SoulWebHandler是本项目主要入口,对全部插件进行了责任链模式的处理,如下为主要代码

1.7.1.9. influxDb操作类配置(influxdb包)

1.7.1.10. logo包
- 启动打印logo
1.7.1.11. 插件(plugin包)

- 监控调用插件monitor
- 签名插件sign
- 防火墙插件waf
- http分发插件divide
- dubbo插件
- 限流插件rateLimiter
- 重写插件rewrite
- springcloud插件
- 以及以上插件所依赖的某些服务,如redis限流,hystrix限流
1.7.1.12. 请求对象(request包)
- RequestDTO对象
1.8. 总结
经过所有核心代码分析,整个流程大致就清楚了,项目核心采用责任链模式进行插件热插拔,使用zookeeper管理配置信息,使用InfluxDb存储监控调用信息,使用distruptor并发高性能队列进行监控写入,架构采用了webflux反应式Web框架,基于Netty进行异步非阻塞调用
1.9. 具体介绍文档
soul开源网关项目搭建学习的更多相关文章
- Android开源地图项目 BigPlanetTracks 学习随笔
一. app主体部分 [tyt.android.bigplanettracks] 二. 地图部分 [tyt.android.bigplanettracks.maps] ...
- 传统web项目搭建学习
1.安装插件 # babel安装问题,Cannot find module '@babel/core' babel-loader@8 requires Babel 7.x (the package ' ...
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...
- iOS及Mac开源项目和学习资料【超级全面】
UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITable ...
- iOS开发--iOS及Mac开源项目和学习资料
文/零距离仰望星空(简书作者)原文链接:http://www.jianshu.com/p/f6cdbc8192ba著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 原文出处:codecl ...
- 强烈推荐 GitHub 上值得前端学习的开源实战项目
强烈推荐 GitHub 上值得前端学习的开源实战项目. Vue.js vue-element-admin 是一个后台前端解决方案,它基于和 element-ui 实现 基于 iView 的 Vue 2 ...
- Android 开源项目及其学习
Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...
- iOS超全开源框架、项目和学习资料汇总(5)AppleWatch、经典博客、三方开源总结篇
完整项目 v2ex – v2ex 的客户端,新闻.论坛.apps-ios-wikipedia – apps-ios-wikipedia 客户端.jetstream-ios – 一款 Uber 的 MV ...
- 【转】iOS超全开源框架、项目和学习资料汇总
iOS超全开源框架.项目和学习资料汇总(1)UI篇iOS超全开源框架.项目和学习资料汇总(2)动画篇iOS超全开源框架.项目和学习资料汇总(3)网络和Model篇iOS超全开源框架.项目和学习资料汇总 ...
随机推荐
- 现代编译原理——第二章:语法分析之LL(K)
转自: http://www.cnblogs.com/BlackWalnut/p/4472122.html LL(K)语法分析技术是建立在预测分析的技术之上的.我们先来了解预测分析技术.考虑以下文法: ...
- 网址导航18A
[导航] hao268 百度导航 泡泡导航 35Q网址导航 [名站] 百度 网易 腾讯 新华 中新 凤凰 [邮箱] 163邮箱 126邮箱 Yeah邮箱 QQ邮箱 阿里邮箱 189邮箱 [新闻] 联合 ...
- python 常忘代码查询 和autohotkey补括号脚本和一些笔记和面试常见问题
笔试一些注意点: --,23点43 今天做的京东笔试题目: 编程题目一定要先写变量取None的情况.今天就是因为没有写这个边界条件所以程序一直不对.以后要注意!!!!!!!!!!!!!!!!!!!!! ...
- 关于mysql存储过程中传decimal值会自动四舍五入的这个坑
容我说几句题外话:我的工作日常是用微软系的,SQL SERVICE 存储过程很强大,我也很习惯很喜欢用存储过程.和MySQL结缘,是在五年前,因为一些原因,公司要求用开源免费的数据库.很多时候,用my ...
- node vue 项目部署问题汇总
场景:vue-router为history模式,不带项目名访问的部署,如果资源是用相对路径加载,则资源匹配路径不对 一.带项目名称访问,如部署到tomcat服务上 webpack: build/ut ...
- ----Arrow functions----
Arrow functions Arrow functions表达式相比函数表达式有更短的语法,没有自己的this.argument.super或者new.target. 1.语法规则: 基础语法: ...
- 关于python的展望
在未接触这门课程以前,我完全对编程一类的操作毫无兴趣.但在短短的两星期时间里,我改变了想法,原因有二.其一是老师幽默,其二是课程实用性高.我希望课程以后可以继续沿用现在由浅入深,给予足够提示的方式,引 ...
- 磨人的Fragment的转换
磨人的Fragment的转换 本次任务是 程序运行之后将第一个Fragment加载出来 然后点击"SHOW NEXT PAGE"切换到第二个Fragment 当再次点击按钮时下方出 ...
- 1123. Is It a Complete AVL Tree (30)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- centos 6.5升级openssl
1.下载升级版本 wget https://www.openssl.org/source/openssl-1.1.0i.tar.gz 2.安装 zlib zlib-devel yum -y insta ...