环境准备
- 搭建三个soul-admin实例(本机端口分别为9095/9096/9097), 启动命令如下:
java -jar soul-admin.jar --server.port=9095
java -jar soul-admin.jar --server.port=9096
java -jar soul-admin.jar --server.port=9097
- 搭建三个soul-bootstrap实例(本机端口分别为9195/9196/9197)
同步方式采用websocket,配置文件如下:
soul:
sync:
websocket :
urls: ws://localhost:9095/websocket,ws://localhost:9096/websocket,ws://localhost:9097/websocket
启动命令如下:
java -jar soul-bootstrap.jar --server.port=9195
java -jar soul-bootstrap.jar --server.port=9196
java -jar soul-bootstrap.jar --server.port=9197
- 配置nginx
upstream soul-admin-upstream {
server localhost:9095;
server localhost:9096;
server localhost:9097;
}
upstream soul-bootstrap-upstream {
server localhost:9195;
server localhost:9196;
server localhost:9197;
}
server {
listen 9094;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://soul-admin-upstream;
}
}
server {
listen 9194;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://soul-bootstrap-upstream;
}
}
使用nginx代理后端的三个soul-admin实例和三个soul-bootstrap实例,用来实现高可用
4. 分别启动三个soul-examples-http的实例,端口号是8188/8189/8190
启动后访问http://localhost:9094/,可以发现三个实例已注册到soul-admin中:
测试访问
1.通过nginx代理访问网关
2. 将dvide插件禁用,可以发现数据立马同步到网关,多刷新几次,返回结果为:
3. 测试soul-admin高可用,现将其中的两台9096和9097关闭,通过9094再次访问soul-admin,发现可以正常访问,观察soul-bootstrap端日志:
2021-01-26 01:22:02.479 ERROR 11861 --- [ocket-connect-1] o.d.s.p.s.d.w.WebsocketSyncDataService : websocket reconnection is error.....
2021-01-26 01:22:02.519 ERROR 11861 --- [ocket-connect-3] o.d.s.p.s.d.w.WebsocketSyncDataService : websocket reconnection is error.....
soul-bootstrap一直在尝试重连断掉的soul-admin,这是浏览器访问网关正常不受影响,将divide插件开启后,剩余的一个soul-admin可以正常将状态同步至三个网关示例中,服务访问不受影响
4. 测试soul-bootstrap高可用,现将其中的两台9196和9197关闭,只剩一台,再次重复步骤3的状态同步以及测试访问,可以发现所有访问都会达到剩余的一台网关中
源码简要分析
- websoket方式同步数据,网关启动时,通过获取所有配置的admin-url来依次与其连接感知所有admin的变化
- http方式同步数据与websocket类似,也是在启动时配置的admin-url来依次建立长轮询
- zookeeper和nacos为单独的注册中心,网关连接是与zookeeper和nacos打交道,不直接与soul-admin通信,因此只要保证zookeeper和nacos高可用即可
结论
- soul-admin以及soul-bootstrap需要借助nginx才能实现高可用,自身组建的集群相互之间并不通信,soul-admin之间通过数据库来感知数据变化,需手动刷新,不能自动。
- soul-bootstrap通过同时监听多个soul-admin来实现任意一个soul-admin发生数据变更,都可以及时通知到该网关