以前接手过一个网关系统里面一个子系统的维护工作,后来没多久就移交出去给别人了,也没太细看里面的源码。本次学习一下soul网关源码的机会,补足一下自己在网关方面的知识欠缺。
一个网关应该具有以下基本功能:
- 路由转发
- 限流熔断
- 日志监控
- 安全认证
首先,看一下soul官网的介绍,soul网关除了以上基本功能之外,还有一些其他的特性:
- 支持各种语言(http协议),支持 dubbo,springcloud协议
- 插件化设计思想以及丰富的插件支持
- 流量配置动态化
- 支持A/B Test
后面几篇笔记将针对网关的基本功能以及soul网关的其他特性进行学习。本文主要是初步入手了解一下。
本文先大致看一下soul网关源码的结构:
- soul-admin是网关的管理后台
- soul-bootstrap是网关启动模块,它的pom里面依赖了其他的功能包
- soul-client里面是一些Spring MVC,Dubbo,SpringCloud的用户快捷使用soul网关的代码
- soul-common里面是一些通用类
- soul-dist是用于启动或者停止项目的一些脚本及配置参数
- soul-metrics里面用于实现监控和统计的代码
- soul-example是一些示例项目
- soul-plugin是提供的一些插件
- soul-register-center顾名思义是注册中心
- soul-spi是定义soul spi
- soul-spring-boot-start是spring boot启动器
- soul-sync-data-center是数据同步相关的代码
- soul-web里面包括插件、路由转发等代码
我们来将这个项目实际运行一下,体验一下:
-
先将代码clone下来
-
执行下面这个命令编译安装一下。命令里面skip掉一些东西,可以加快速度
mvn clean package install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Drat.skip=true -Dcheckstyle.skip=true
- 启动一下soul-admin模块
运行之前,需要修改application.yml
里面的数据库地址、端口、用户名密码,都改成你自己的数据库的配置
注意:此处需要将jdbc链接改一下,在后面加上zeroDateTimeBehavior=convertToNull
,否则在之后会报can not be represented as java.sql.Timestamp
错误
运行成功之后,可以看到数据库里多了一个soul
数据库,里面有一些表。(以后的笔记里面会学习相关的知识)
如果不想用mysql的话,它里面还有一个application-h2.yml
配置,修改那个配置文件就行了。
从application.yml
里面可以看到,soul-admin管理后台在9095端口启动了。我们可以在浏览器里面访问一下http://localhost:9095/#/user/login
,可以看到登录界面。登录的用户名密码是admin/123456
进管理后台看一下,基本上各个tab里面啥也没有,因为我们还没启动网关,也没把业务的api放进来
- 启动一下soul-bootstrap模块
从配置文件里面看下,它启动在了9195端口
- 我们启动soul-example/soul-example-http这个模块看一下,这个模块就相当于我们平常的springboot项目。
这个soul-example-http
启动在了8188
端口,从源码里面看下它有两个controller,可以点进去看一下提供了什么API。例如OrderController里面提供了一个/test/order/findById
这个API。
先试一下soul-example-http这个服务本身的API能否调用。在浏览器里面试一下http://localhost:8188/order/findById?id=1
再试一下请求能否通过网关正常转发给soul-example-http这个服务。在soul-example-http的配置文件里面看到这个服务在网关那边的appName是http
, 所以在浏览器里面试一下http://localhost:9195/http/order/findById?id=1
可以看到有结果返回,而且从IDEA的控制台的日志里面也可以看到,请求被成功转发了。
再回去soul-admin管理后台看一下,可以看到soul-example-http这个里面的两个controller提供的API都已经可以在divide
这个tab里面看到了
本文就先到此结束,后续对各个模块继续深究一下。