最近参加了一个阅读源码的活动,要求就是在接下来的 4 周时间里学习 SOUL 网关开源项目的源码,并且用文字记录下自己的收获。

今天是第一天。

尽管之前就已经 fork 了源码,但是一直没怎么去看过,希望这次的活动能让自己有所收获。

目标:

  1. 搭建网关环境
  2. 编译代码,运行 soul-admin soul-bootstrap
  3. 记录心得

    同步上游仓库

    当我打开尘封已久的 SOUL 项目时,发现之前 fork 的项目没有同步最新的提交,那么首要的问题就是同步最新的代码了。

粗暴的解决方式就是删掉 fork 的项目,然后重新 fork 一次,虽然能解决问题,但是不太合理。

比较合适的方式是借助 git 命令去添加上游仓库,然后拉取变动,之后合并再推送到自己 fork 的仓库。

  1. // 添加上游仓库 upstream 表示别名
  2. git add remote upstream https://github.com/dromara/soul.git
  3. // 拉取上游仓库的变动
  4. git fetch upstream
  5. // 合并
  6. // 这里用 rebase 或者 merge 都行,upstream 就是上面定义的别名,master 就是主分支名
  7. // 如果本地没有变动,是可以不用合并的,直接推送
  8. git rebase upstream/master
  9. git merge upstream/master
  10. // 推送到远程仓库
  11. git push origin master

解决了仓库同步的问题,就可以尝试运行代码了。

soul-admin 模块

soul-admin 是 SOUL 项目的 Web 管理模块,提供了网关的插件配置、网关路由配置、数据的存储和更新。也就是说,可以通过该模块去自由的配置各个 api 的转发,以及插件类型。

由于涉及到数据的存储,所以需要配置数据库,默认的是 MySQL 数据库,同时也支持基于内存的 H2 数据库。

启动项目时会先去初始化表结构,用来存储整个 SOUL 项目需要持久化的数据。

soul-bootsrap 模块

这个模块是 SOUL 的网关启动模块,启动该项目会加载一系列的插件,以及 netty 服务。

所有 api 经过 SOUL 网关代理之后都可以通过该模块暴露的服务去访问原来提供的服务。

这个模块引入的依赖比较多,暂时可以不用去管它,只需要知道一点——网关代理之后的服务全部都在这里就行了。

有了管理系统,有了网关系统,剩下的就是 api 服务了,拿最常用的 HTTP 服务举例,soul-examples-http 模块。

soul-examples-http 模块

这个模块是 HTTP 的使用案例模块,一旦启动就会自动把暴露出来的接口注册到 SOUL 网关上,通过上面启动的 soul-admin 就可以看到暴露出来的接口,同时可以通过上面提到的 soul-bootsrap 模块去使用 soul-examples-http 暴露的服务。

比如 soul-examples-http 默认提供的 http://localhost:8188/order/findById?id=1 接口可以使用 http://localhost:9195/http/order/findById?id=1 接口来代替。

总结

看到了这里,是不是觉得很神奇?

为什么仅仅启动一个 HTTP 服务就可以在 soul-admin 面板里看到暴露的服务?

为什么同时还可以通过另外一个服务访问得到相同的结果?

这三者有什么样的联系?

我们下期再见。