前言
当初因为业务需求的缘故,博主在Eureka
的基础上做了一定的修改和封装,用来更好的适配我们的业务需求,下面我就写写当初实现手动同步服务的过程。(有段时间不接触eureka有点遗忘,如有错误之处请见谅)
需求:手动指定任意Eureka server
上的服务同步到指定Eureka server
,可一次同步服务到多个Eureka server
。
什么是手动同步服务?
顾名思义是将某个服务手动同步到指定的Eureka server
上。
Eureka Server之间是如何进行服务同步的?
服务之间同步是使用PeerEurekaNode来维持的
- 使用PeerEurekaNode#register(InstanceInfo)来向其他
Eureka server
上注册服务 - 使用PeerEurekaNode#heartbeat(args…)来同步心跳的
手动同步服务实现分析
既然Eureka server
之间使用PeerEurekaNode
来进行同步,那我们也借助PeerEurekaNode
来手动同步服务不就可以了?
步骤:
- 创建
PeerEurekaNode
- 使用
PeerEurekaNode#register
来同步服务到指定注册中心 - 将
PeerEurekaNode
存储,后续维持心跳 - 监听服务心跳事件,使用
PeerEurekaNode#heartbeat
转发心跳
如何创建PeerEurekaNode?
使用PeerEurekaNodes#createPeerEurekaNode(peerEurekaNodeUrl)
来创建的
createPeerEurekaNode
方法的访问修饰符是protected
的,只允许子类访问,但是我们可以使用反射
的方式来调用
那你肯定又问PeerEurekaNodes如何创建吧,只要你使用了Spring cloud
那PeerEurekaNodes
就已经存在你的IOC容器
中了,你可以直接注入使用
private PeerEurekaNodes peerEurekaNodes;
@Autowired
public void setPeerEurekaNodes(PeerEurekaNodes peerEurekaNodes){
this.peerEurekaNodes = peerEurekaNodes;
}
然后使用peerEurekaNodes.createPeerEurekaNode(peerEurekaUrl)
来创建PeerEurekaNode
peerEurekaUrl:要同步的eurekaUrl,例如:http://localhost:8761/eureka/
实现手动同步服务
核心代码如下,对不相关部分进行删减
/**
* @author mikasa
*/
@Component @Slf4j
public class PeerEurekaNodeService {
@Autowired
private PeerEurekaNodes peerEurekaNodes;
@Autowired
private PeerAwareInstanceRegistry peerAwareInstanceRegistry;
// 待续约Map
private static final Map<String, Set<PeerEurekaNode>> renewableNode = new ConcurrentHashMap<>();
private static final<