注册服务代码如下
public void registerService(ServiceConfig service) {
NewService newService = parseFrom(service);
Check check = service.getCheck();
if (check != null) {
NewService.Check sCheck = check.toConsulCheck();
newService.setCheck(sCheck);
if (check instanceof TTLCheck) {
submitTTLTask(service.getId(), check.getInterval());
}
}
client.agentServiceRegister(newService);
}
如果使用ttl形式检查健康 代码如下:
private void submitTTLTask(final String serviceId, int interval) {
Runnable task = new Runnable() {
@Override
public void run() {
try {
String checkId = CHECK_ID_PREFIX + serviceId;
client.agentCheckPass(checkId);
LOGGER.debug("invoke agentCheckPass with checkId:{}", checkId);
} catch (Exception e) {
LOGGER.error("invoke agentCheckPass error", e);
}
}
};
EXECUTOR_SERVICE.scheduleWithFixedDelay(task, interval, interval, TimeUnit.SECONDS);
}
PS:
-
一般写一个服务注册的组件要注意考虑,如果consul 挂掉,应用注册失败。要考虑重试机制。
-
类似的服务发现组件,如果consul挂掉,这个时候服务路由应该本地缓存一下,并且等待consul恢复,重新更新路由。