1,概述
Soul 是基于 WebFlux实现的响应式的 API 网关,具有异步、高性能、跨语言等特点,接下来,我们将从环境部署开始,一层层拨开她,进行行一场灵魂的碰撞!
项目github地址:https://github.com/Dromara/soul
clone 项目:
使用:mvn clean package install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Drat.skip=true -Dcheckstyle.skip=true命令编译项目
2,部署
上图简易部署admin和bootstrap,随着学习的深入逐渐完善各部组件的源码实现!
启动admin后,登录:admin/123456
2.1,启动admin分析
查看配置文件application.yml
红色框出的作用:(猜测一下是:开启websocket,sync同步?-->同步开启websocket?使用websocket的原因是啥?)
这时框图变成这样:
查看同websocket有关的类,一般情况下在配置类:WebsocketSyncProperties;全局文本搜索WebsocketSyncProperties;
这个@Configuration里面分别@Bean三个:WebsocketDataChangedListener;WebsocketCollector;ServerEndpointExporter具体作用后面在详解;但是可以发现:WebsocketCollector 这个类被@ServerEndpoint("/websocket")所修饰;说明这个websocket是服务端;
而这个类的类名:DataSyncConfiguration ---->中文释义:数据同步配置在进一步推导:使用websocket进行数据同步;
这时我们的框图就是这样的:
2.2 Soul-bootstrap启动分析:
(1)红色框中1的部分说明:在启动bootstrap过程中就去加载插件。进入SoulConfiguration搜索load plugin:
@Bean("webHandler") public SoulWebHandler soulWebHandler(final ObjectProvider<List<SoulPlugin>> plugins) { List<SoulPlugin> pluginList = plugins.getIfAvailable(Collections::emptyList); final List<SoulPlugin> soulPlugins = pluginList.stream() .sorted(Comparator.comparingInt(SoulPlugin::getOrder)).collect(Collectors.toList()); soulPlugins.forEach(soulPlugin -> log.info("load plugin:[{}] [{}]", soulPlugin.named(), soulPlugin.getClass().getName())); return new SoulWebHandler(soulPlugins); }
debugger进入:
证明是分析是对的!
(2)红色方框2:说明建立了一个websocket连接;
如上述阅读方法:进入WebsocketSyncDataConfiguration类:看到这个注解@ConditionalOnProperty(prefix = "soul.sync.websocket", name = "urls")
再看配置文件:发现
soul :
file:
enabled: true
corss:
enabled: true
dubbo :
parameter: multi
sync:
websocket :
urls: ws://localhost:9095/websocket
这个地址不就是:admin的websocket服务端吗?
3,第一节框图
到此时我们的框图如下:
4,总结
感受:阅读源码需要大胆假设,并结合日志,配置文件分析源码;当然了一个好的项目,类名,方法名的命名对阅读源码有很大的帮助!在此不得不,感受猫大的强大!充实的一天,明天继续...