有幸参加 soul 网关社区的【发电机计划】,进行为期四周的源码深度学习。

接下来的四周将在这里记录学习的脚印。

一、目标

1.搭建网关环境(github 一键三连 star,watch,fork)
2.编译代码,运行 soul-admin、soul-bootstrap
3.记录心得,写博客分享。

二、内容

启动前准备

将 fork 的 soul 项目 clone 到本地

  1. git clone git@github.com:stephenshen1993/soul.git

Soul网关源码解析(一)搭建网关环境 - 图1
使用 Maven 编译 root 项目

  1. mvn clean package install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Drat.skip=true -Dcheckstyle.skip=true

Soul网关源码解析(一)搭建网关环境 - 图2

运行soul-admin

从命名上看,soul-admin 应该是 soul 的管控台,先尝试启动项目。
尝试直接运行 SoulAdminBootstrap 启动 soul-admin,控制台报错如下:

Soul网关源码解析(一)搭建网关环境 - 图3

在错误堆栈的末尾,看到如下信息:

  1. nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

初步怀疑是数据库连接问题,打开application.yml验证猜想
Soul网关源码解析(一)搭建网关环境 - 图4

果然需要连接数据库服务,同时注意到名为h2的profiles被注释未生效,应该是配合application-h2.yml接入内存数据库。
application-h2.yml内容:

  1. soul:
  2. database:
  3. dialect: h2
  4. init_script: "META-INF/schema.h2.sql"
  5. spring:
  6. datasource:
  7. url: jdbc:h2:mem:~/soul;DB_CLOSE_DELAY=-1
  8. username: sa
  9. password: sa
  10. driver-class-name: org.h2.Driver

故此处我选择启用profiles注释,使用application-h2.yml配置的h2数据库。
(也可以直接启动本地数据库服务接入)

Soul网关源码解析(一)搭建网关环境 - 图5

再次启动soul-admin,项目启动成功。
Soul网关源码解析(一)搭建网关环境 - 图6

访问 http://localhost:9095,默认账号/密码:admin/123456

运行soul-bootstrap

从命名上看,soul-bootstrap应该是soul的入口,后续debug应该是从这里开始,尝试启动项目。
顺利启动

Soul网关源码解析(一)搭建网关环境 - 图7

同时注意到soul-admin有打印更多信息

Soul网关源码解析(一)搭建网关环境 - 图8

可以看到,soul-admin在感知到soul-bootstrap启动后,才开始初始化数据库表及相关可执行服务。
直到此时,soul-admin的重定向服务、插件服务等才真正拉起来,以及初始化dispatcherServlet。

Soul网关源码解析(一)搭建网关环境 - 图9

那么,soul-admin是如何感知到的呢?从soul-bootstrap的配置文件中发现了一点端倪

Soul网关源码解析(一)搭建网关环境 - 图10

字面上理解,soul-bootstrap是在启动时与soul-admin通过websocket建立同步通道,具体同步机制后面需要跟踪。

三、总结

  • soul-admin是带状态管控端,应该是通过数据库记录某些状态及元数据信息。
    采用懒加载模式,同步通道建立后,才初始化数据库表单和管控台mvc服务。
  • soul-bootstrap应该是soul启动入口,启动时通过websocket与soul-admin建立同步通道,同步机制尚待跟踪。
    同时注意到配置文件中有健康检查相关配置,使用场景也需跟踪。