前言
上回说到, 同步数据有不同的策略。如果一个 admin 配置多个同步方式那么 soul-web 会选哪个呢?还是一个 admin 只能配置一个同步策略呢?
配置多个同步策略
配置多个同步策略时,需要 zookeeper 和 nacos 两个服务。这里使用 docker 安装即可。详情点击: zookeeper docker 安装, nacaos 安装,根据提示检测是否成功。
成功后我们 soul-admin 后台配置。
soul:
sync:
websocket:
enabled: true
zookeeper:
url: localhost:2181
sessionTimeout: 5000
connectionTimeout: 2000
http:
enabled: true
nacos:
url: localhost:8848
namespace: 1c10d748-af86-43b9-8265-75f487d20c6c
acm:
enabled: false
endpoint: acm.aliyun.com
namespace:
accessKey:
secretKey:
重新启动 admin, 将 soul-bootstrap 修改如下
soul :
sync:
websocket :
urls: ws://localhost:9095/websocket
zookeeper:
url: localhost:2181
sessionTimeout: 5000
connectionTimeout: 2000
# 这里先注释掉,bootstrap http 和 webscoket 会报错,下面会解释原因
# http:
# url : http://localhost:9095
nacos:
url: localhost:8848
namespace: 1c10d748-af86-43b9-8265-75f487d20c6c
acm:
enabled: false
endpoint: acm.aliyun.com
namespace:
accessKey:
secretKey:
然后检查 pom 文件相关包是否引入:
<!--soul data sync start use zookeeper-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-sync-data-zookeeper</artifactId>
<version>${project.version}</version>
</dependency>
<!--soul data sync start use websocket-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-sync-data-websocket</artifactId>
<version>${project.version}</version>
</dependency>
<!--soul data sync start use http-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-sync-data-http</artifactId>
<version>${project.version}</version>
</dependency>
<!-- soul data sync start use nacos-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-sync-data-http</artifactId>
<version>${project.version}</version>
</dependency>
没有引入的话,自行引入即可,重新启动 bootstrap。从命令行看出
2021-01-21 18:59:34.263 INFO 6334 --- [ main] s.b.s.d.z.ZookeeperSyncDataConfiguration : you use zookeeper sync soul data.......
...
2021-01-21 18:59:34.395 INFO 6334 --- [ main] b.s.s.d.w.WebsocketSyncDataConfiguration : you use websocket sync soul data.......
2021-01-21 18:59:34.441 INFO 6334 --- [ main] d.s.s.s.s.d.n.NacosSyncDataConfiguration : you use nacos sync soul data.......
2021-01-21 18:59:34.851 WARN 6334 --- [ main] onfigReactiveWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nacosSyncDataService' defined in class path resource [org/dromara/soul/springboot/starter/sync/data/nacos/NacosSyncDataConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.dromara.soul.sync.data.api.SyncDataService]: Factory method 'nacosSyncDataService' threw exception; nested exception is java.lang.NullPointerException
2021-01-21 18:59:34.853 INFO 6334 --- [-localhost:2181] org.I0Itec.zkclient.ZkEventThread : Terminate ZkClient event thread.
2021-01-21 18:59:34.970 INFO 6334 --- [ main] org.apache.zookeeper.ZooKeeper : Session: 0x10001d80adf0007 closed
2021-01-21 18:59:34.970 INFO 6334 --- [ain-EventThread] org.apache.zookeeper.ClientCnxn : EventThread shut down for session: 0x10001d80adf0007
2021-01-21 18:59:34.982 INFO 6334 --- [ main] ConditionEvaluationReportLoggingListener :
Debug
判断是否是 nacos 的配置有误。按照上述流程,注释掉其他的策略,只留 nacos,配置好重启。
发现还是报错, 经过调试发现:
现在在 soul 上提了一个 issue ,有可能是个bug,但也有可能是我配置 nacos 的问题。
解决办法
- 确保是否是 Nacos 的配置问题。
-
登录 admin 后台,在以下菜单上配置好信息,然后同步到 nacos 上,
看看 nacos 上是否有信息。
配置权限的时候,需要在列表处,打上勾,不然会无法传输
-
检查 nacos 是否都有以下参数
- 启动 soul 网关, 出现以下则配置成功
2021-01-22 09:55:36.837 INFO 8210 --- [ main] d.s.s.s.s.d.n.NacosSyncDataConfiguration : you use nacos sync soul data.......
2021-01-22 09:55:37.197 INFO 8210 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
2021-01-22 09:55:37.756 INFO 8210 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 9195
2021-01-22 09:55:37.760 INFO 8210 --- [ main] o.d.s.b.SoulBootstrapApplication : Started SoulBootstrapApplication in 3.625 seconds
总结
- 调试的时候,如果发现问题,可以先把身边用过的人问问是否会出现这种情况,是个例还是通性问题。
- 如果是通性问题,可以去社区,或者 github 上直接提 issue 问清楚。不要害怕写英语,其实大家水平都差不多。