一个异步的,高性能的,跨语言的,响应式的API优秀网关,参考了Kong,Spring-Cloud-Gateway等优秀的网关。
目录
一、soul网关学习计划
- 学习动机
参加了一个源码学习小组,连续28天,每天记录一点soul网关学习的心得体会,一起监督学习。 - 学习计划
week1-实例:
- 安装部署soul网关、使用soul网关的examples,Http、dubbo、spring cloud等的简单使用
- 做一些压力测试对比。
- 了解soul网关的基本原理、表结构、功能概述。
- 实际项目中使用soul网关。
- 翻译/吸收一些soul网关的本周相关优质文档。
week2-核心:
- 阅读核心模块的源码,熟悉方法含义,调用流程等。
- debug核心模块代码,找出代码中的可以借鉴的地方,如责任链模式。
- 翻译/吸收一些soul网关的本周优质文档。
week3-插件:
- 阅读几个插件的学习,熟悉三方库的功能/整合/配置/代码。
- debug插件模块代码,找出代码中的可以借鉴的地方。
- 翻译/吸收一些soul网关的本周优质文档。
week4-总结:
- 查缺补漏,总结soul网关的学习内容,分类整理。
- 结合自己公司场景下的soul使用的业务差异和分析。
- 复习相关NIO和Netty课程知识。
- 手撸一个略微丰富的网关项目。
- 学习要求
坚持死磕、多看多问、乐于分享、每天输出总结
二、soul网关基本原理、功能介绍和关键表结构
2.1 soul网关基本原理
2.1.1 微服务中为什么需要网关?
- 微服务的流行,服务之间的调用,需要统一的请求标准。
- 微服务接口,需要监控,限流,熔断,等等。
- 微服务接口需要统一的鉴权。
- 接口问题定位 A/B test等等。
2.1.2 soul网关概述
一个异步的,高性能的,跨语言的,响应式的API网关。参考了Kong,Spring-Cloud-Gateway等优秀的网关!
- 自带插件: 防火墙,签名,监控,限流,代理,dubbo,springcloud
- 所有的插件,选择器,规则,热插拔,动态配置。
- 无缝对接http,restful,websocket,dubbo,springcloud 等协
- 支持集群部署,支持灰度发布。
- 当然你熟了以后,还有很多其他的功能,比如查找定位问题,A/B test 等等
2.1.3 soul对手概述
2.1.3.1 soul pk zuul
zuul一个中间件产品,完全可以由业务系统自己去引入,性能不高,没有动态化的配置,不利于管理。
2.1.3.2 soul pk kong
kong 是非常优秀的框架,某些功能要收费,基于lua语言,开发维护成本高
2.1.3.3 soul pk sc-gateway
- 性能上来说,soul和sc-gateway 都采用webflux,性能相当
- sc-gateway 基于配置的,接口很多很难集成,而且配置规则不是动态化的。
- soul是插件化的思想,插件热插拔,配置灵活并且是动态化的。
- soul还可以用来排除问题,A/B test。
- soul提供了监控插件来统计qps等等信息。
- soul提供了waf,sign插件,来阻止外来攻击
2.2 soul功能介绍
2.2.1 soul架构设计
架构图解读:
- 绿色的客户端就是各个客户,各种语言的客户端,按照网关要求的数据格式请求网关服务
- soul也是个http服务,底层用了webflux(一种响应式编程范式),这个是soul网关设计的核心设计之一。
- soul-admin 就是整个soul的整个管理后台,它配置所有的规则选择器,然后再把数据写到zookeeper。
- soul服务在启动的时候,会拉取zookeeper的数据,写到本地JVM内存,然后继续监听 zookeeper,来动态更新JVM内存中的数据
- 后面就是soul的执行流程了,基本上就是插件责任链模式,具体的插件执行具体的事情. 每个插件它是根据用户请求网关的数据,与admin后台配置的规则,来执行具体的逻辑,这个是soul网关设计的核心设计之一。
2.2.2 soul模块概述
- soul-admin : Plugins and other information configuration management background(负责插件和其它配置的后端管理)
- soul-bootstrap : With the startup project, users can refer to(负责项目启动)
- soul-client : User fast access with Spring MVC, Dubbo, Spring Cloud.(用户可以快速接入spring mvc ,dubbo,spring cloud)
- soul-common : Framework common class(框架公用类)
- soul-dist : build project(负责构建工程)
- soul-metrics : metrics impl by prometheus.(使用prometheus实现的Metrics)
- soul-plugin : soul provider plugin collection.(负责soul的插件集合)
- soul-spi : soul spi define.(负责soul的spi定义)
- soul-spring-boot-starter : Support for the spring boot starter(负责soul的spring-boot 快速启动)
- soul-sync-data-center : provider zookeeper, http, websocket, nacos to sync data(负责zookeeper,http,websocket,nocos数据同步)
- soul-test/examples : the rpc test project(负责soul的测试)
- soul-web : Core processing packages including plugins, request routing and forwarding, and so on(soul的web管理,包含插件,请求路由和转发)
2.3 soul关键表结构说明
- 插件采用数据库设计,来存储插件,选择器,规则配置数据,以及对应关系
- 一个插件对应多个选择器,一个选择器对应多个规则。
- 一个选择器对应多个匹配条件,一个规则对应多个匹配条件。
- 每个规则在对应插件下,不同的处理表现为handle字段,这个一个不同处理的json字符串。具体的可以在admin使用过程中进行查看。
数据库表UML类图:
具体几张表的含义
- meta_data:对dubbo泛化调用使用,每条记录对应一个dubbo接口的方法,http协议不会保存,而springcloud协议,只会存储一条数据, path为 :/contextPath/**
- plugin:存储当前支持插件,我们对应配置的插件相关参数,就会更新这样表
- rule:插件管理中,我们配置的具体规则。实际在这里我们也可以看出Soul的三大核心:plugin,rule,selector
- rule_condition:rule表中配置的,对应的具体匹配规则
- selector:规则表
- selector_condition:规则条件表
三、soul安装和测试
3.1 soul安装运行
- 安装mysql,windows下直接解压,修改data存储路径,cmd管理启动
- 安装数据库client,这里使用的是DBeaver,可以用其他mysql client替代
- 安装postman/jmeter,作http请求使用
- 创建soul项目,使用master分支
- mvn install 项目
- 启动soul-admin项目,自动创建数据库,soul-admin是一个单纯的后端控制服务
- 启动soul-bootstrap,整个项目的核心,直接run起来就可以,注意端口号为http://localhost:9095/
3.2 soul网关转发测试
- 启动模拟业务项目,使用soul-test-http中的相关实例
- 相关配置,在业务中使用soul,配置相应的path前缀,实现转发
- 在OrderController中使用@SoulSpringMvcClient注解,相应的接口已经注册至soul
- 使用postman测试转发功能
正常访问接口
使用soul网关访问接口
3.3 几个问题小插曲
Error:(20, 14) java: 程序包lombok不存在
在项目内,命令行运行 mvn idea:idea后解决
Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
时区问题,在jdbc连接后面添加&serverTimezone=UTC 后解决