目录
自定义说明
按照我们前文提到的一个源码的阅读,光光读懂它还不够,需要尝试着去用它,加深对它的理解。前面我们阅读了soul websocket同步和zookeeper同步的方式,今天来自定义一个helloworld同步的方式,本来确实底层想用一个新的工具来进行同步,但一时间没找到合适的,那么底层我们还是选用websocket来进行同步吧,也不太影响我们上手使用去加深对它的理解。
soul admin自定义
application.yml修改sync属性如下:
DataSyncConfiguration文件配置如下:
@Configuration
@ConditionalOnProperty(name = "soul.sync.helloworld.enabled", havingValue = "true")
@EnableConfigurationProperties(HelloWorldSyncProperties.class)
static class HelloWorldListener {
/**
* Config event listener data changed listener.
*
* @return the data changed listener
*/
@Bean
@ConditionalOnMissingBean(WebsocketDataChangedListener.class)
public HelloWorldDataChangedListener helloWorldDataChangedListener() {
return new HelloWorldDataChangedListener();
}
/**
* Websocket collector websocket collector.
*
* @return the websocket collector
*/
@Bean
@ConditionalOnMissingBean(HelloWorldCollector.class)
public HelloWorldCollector helloWorldCollector() {
return new HelloWorldCollector();
}
/**
* Server endpoint exporter server endpoint exporter.
*
* @return the server endpoint exporter
*/
@Bean
@ConditionalOnMissingBean(ServerEndpointExporter.class)
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
分别新建HelloWorldCollector类和HelloWorldDataChangedListener类,截图如下,HelloWorldCollector加上注解@ServerEndpoint("/helloworld"),声明为helloworld服务站点。HelloWorldDataChangedListener只实现onPluginChanged做下演示。监听器收到事件通知后调用HelloWorldCollector.send方法发送消息。
底层发送消息用的也是websocket机制
启动SoulAdminBootstrap,没错,一个自定义的websocket的helloworld服务站点就起来了。
soul bootstrap自定义
application-local.yml配置属性如下:
自定义一个soul-spring-boot-starter-sync-data-helloworld,结构如下
HelloWorldSyncDataConfiguration配置类用于注册一个WebsocketSyncDataService,service也可以自定义哈,这里就偷了个懒,直接用的原来的service类,增加一个WebsocketConfig读取soul.sync.helloworld的属性,初始化的时候会拿到urls跟服务站点进行连接。
好了,soul-bootstrap模块的pom.xml文件引入starter
启动SoulBootstrapApplication,admin提示已正常连接,但收到bootstrap myself同步的时候报了个空指针异常。
因为websocket同步策略配置了matchIfmissing=true,了解下matchIfMissing属性,它是用来指定如果配置文件中未进行对应属性配置时的默认处理:默认情况下matchIfMissing为false,也就是说如果未进行属性配置,则自动配置不生效。如果matchIfMissing为true,则表示如果没有对应的属性配置,则自动配置默认生效。首先此处我们虽然将原来的websocket属性注释了,但还是作为有效的配置加载了它的监听器,导致发消息的时候,WebsocketCollector的session为空,抛出了异常。
去掉该属性即可。
总结
简单的底层复用了websocket同步方式自定了一个helloworld服务站点,从学到上手使用,再到应用,这是一个进阶的过程。包括websocket同步策略里用到的观察者模式,也可以尝试着自定义一个新的事件分发器,新的事件加深下理解,非常有助于写代码能力的提升。