Soul 网关源码学习(5) - 从依赖的角度理解 Soul 网关(1)
Soul 模块概况
soul 网关项目采用 maven 组织项目模块, 主要的模块定义在可以从项目根路径的 pom.xml 出发找到各个模块:
| 模块名 | 模块说明 |
|---|---|
| soul-admin | soul 管理台控制接口, soul bootstrap 运行时数据支持 |
| soul-bootstrap | soul 网关承接流量的入口工程 |
| soul-client | soul 网关 RPC 代理调用客户端封装父 pom |
| soul-client-common | soul 网关 RPC 代理公共组件 |
| soul-client-dubbo | soul 网关 dubbo RPC 调用客户端封装父 pom |
| soul-client-apache-dubbo | soul 网关 apache dubbo RPC 调用客户端封装 |
| soul-client-alibaba-dubbo | soul 网关 alibaba dubbo RPC 调用客户端封装 |
| soul-client-dubbo-common | soul 网关 dubbo RPC 调用公共组件封装 |
| soul-client-http | soul 网关 HTTP RPC 调用客户端封装父 pom |
| soul-client-springcloud | soul 网关 SpringCloud HTTP RPC 调用客户端封装 |
| soul-client-springmvc | soul 网关 SpringMVC HTTP RPC 调用客户端封装 |
| soul-client-sofa | soul 网关 sofa RPC 调用客户端封装 |
| soul-client-tars | soul 网关 tars RPC 调用客户端封装 |
| soul-common | soul 网关公共依赖封装 |
| soul-dist | soul 部署相关的依赖封装父 pom |
| soul-admin-dist | soul admin 部署相关依赖封装 |
| soul-bootstrap-dist | soul bootstrap 部署相关依赖封装 |
| soul-examples | soul 网关示例子模块根 pom 工程 |
| soul-metrics | soul 数据采样相关依赖封装父 pom |
| soul-metrics-facade | soul 数据采样相关调用入口封装 |
| soul-metrics-prometheus | soul 数据采样 prometheus 封装 |
| soul-metrics-spi | soul 数据采样 spi 定义 |
| soul-plugin | soul 网关插件相关封装父 pom |
| soul-plugin-alibaba-dubbo | soul 网关 alibaba dubbo 插件封装 |
| soul-plugin-apache-dubbo | soul 网关 apache dubbo 插件封装 |
| soul-plugin-api | soul 网关插件 api 定义 |
| soul-plugin-base | soul 网关插件基础依赖定义 |
| soul-plugin-context-path | soul 网关 context path 插件定义 |
| soul-plugin-divide | soul 网关 divide 插件定义 |
| soul-plugin-global | soul 网关 global 插件定义 |
| soul-plugin-httpclient | soul 网关 httpclient 插件定义 |
| soul-plugin-hystrix | soul 网关 hystrix 插件定义 |
| soul-plugin-monitor | soul 网关 monitor 插件定义 |
| soul-plugin-ratelimiter | soul 网关限流插件定义 |
| soul-plugin-resilience4j | soul 网关 resilience4j 插件定义 |
| soul-plugin-rewrite | soul 网关接口路径重写 插件定义 |
| soul-plugin-sentinel | soul 网关 sentinel 插件定义 |
| soul-plugin-sign | soul 网关认证插件定义 |
| soul-plugin-sofa | soul 网关 sofa 插件定义 |
| soul-plugin-springcloud | soul 网关 springcloud 插件定义 |
| soul-plugin-tars | soul 网关 tars 插件定义 |
| soul-plugin-waf | soul 网关 waf 插件定义 |
| soul-register-center | soul 网关注册中心封装父 pom |
| soul-register-client | soul 网关注册中心 client 封装父 pom |
| soul-register-client-api | soul 网关注册中心 client 接口封装 |
| soul-register-client-http | soul 网关注册中心 http client 封装 |
| soul-register-client-zookeeper | soul 网关注册中心 zookeeper client 封装 |
| soul-register-common | soul 网关注册中心公共依赖封装 |
| soul-register-server | soul 网关注册中心 server 封装父 pom |
| soul-register-server-api | soul 网关注册中心 server api 定义 |
| soul-register-server-http | soul 网关注册中心 http server 定义 |
| soul-register-server-server | soul 网关注册中心 zookeeper server 定义 |
| soul-spi | soul 网关 spi 功能定义组件 |
| soul-spring-boot-starter | soul 网关 spring boot starter 封装父 pom |
| soul-sync-data-center | soul 网关数据同步封装父 pom |
| soul-web | soul 网关 web 功能定义 |
soul 为了实现高吞吐, 高性能, 从方方面面进行优化, 包括网关应用编码方面采用响应式异步流编程, 功能特征数据流同步采用 JVM 缓存与数据库结合方式。可使用的数据同步的方式主要有以下几种, http长轮询、nacos 配置中心同步、websocket、zookeeper。
插件大体可以分为路由插件和网关业务功能插件,路由插件负责将请求转发到正确的下游服务上,网关业务插件负责执行网关的通用业务逻辑,比如限流、鉴权等。流量必须在路由插件中配置才能正确转发,而业务插件不是必配的。每个插件都是单独针对全部流量配置筛选和使用规则,所以配置可以很灵活。
从 soul-plugin 部分代码可以发现,如果想自定义插件,也至少需要这两部分,一个是插件处理类,一个是处理动态配置的类。
模块梳理之后的思考
soul 网关可部署的组件有两个: soul-admin 和 soul-dashboard, soul dashboard 中的功能概览如下:

以上的代码模块, 我从上到下整理了一遍, 阅读了各个模块 pom 的依赖关系, 接下来几天的学习将从如下的几条线去探索 soul 网关组件的源码:
- 组件间如何协作来实现 soul 网关功能的可插拔的?
- soul 网关如何保证高性能的?
- soul 网关如何实现代理多种 RPC 请求的?
- soul 的插件体系是如何实现可扩展的 ?