那么我们怎么知道要去连接哪些实例呢
我定义了一个ConnectionServerManager
的接口用来管理服务信息
当然我们完全可以自己实现一个,比如通过配置文件来配置服务实例信息
不过我们有更方便的方式,那就是依赖Spring Cloud
的服务发现组件了,不管是Eureka
还是Nacos
还是其他的注册中心相当于都支持了,这就是抽象的魅力啊
我们可以通过DiscoveryClient#getInstances(Registration.getServiceId())
来获得所有的实例,排除掉自身就是需要连接的服务实例了
当我们的服务实例连接上其他的服务实例之后,发送一个自身实例信息的消息过去,其他的服务实例接收到对应的消息之后反过来连接我们的服务实例,保证一定的连接及时性,这样双方的连接就搭建起来了,可以互相转发消息了
同时我还添加了心跳检测和自动重连,当一段时间没有收到心跳回复后就会断开连接,并且每隔一段时间就会重新查询一遍实例信息,如果发现存在某个服务实例没有对应的连接,就会重新进行连接,这样就能在某些偶尔网络不好的情况下有一定的容错
到目前为止,我们基本的框架已经建立了,当我们启动服务之后,服务间就会自动建立连接