import com.ecwid.consul.v1.ConsulClient;
import com.ecwid.consul.v1.Response;
import com.ecwid.consul.v1.agent.model.NewService;
import com.ecwid.consul.v1.health.model.HealthService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
/**
* @ Author:yl1794
* @ Date:2020/6/15 10:39
* @ Description:
*/
@Component
public class GetPhoneBookFromConsul {
private Logger logger = LoggerFactory.getLogger(GetPhoneBookFromConsul.class);
@Value("${spring.application.name:phonebook}")
private String serviceName;
@Value("${server.port:9993}")
private int servicePort;
@Value("${spring.cloud.consul.host:127.0.0.1}")
private String consulIp;
@Value("${spring.cloud.consul.port:8500}")
private int consulPort;
@Scheduled(cron = "0 0/5 * * * ?")
public void exec() {
getPhoneBookIp();
}
/**
* 從consul上獲取地址簿相關信息
*
* @return
*/
private void getPhoneBookIp() {
ConsulClient consulClient = new ConsulClient(consulIp, consulPort);
Response<List<HealthService>> response = consulClient.getHealthServices(serviceName, false, null);
List<HealthService> healthServices = response.getValue();
if (healthServices == null || healthServices.size() <= 0) {
throw new RuntimeException("遠程地址簿註冊consul失敗!");
}
healthServices.forEach(healthService -> {
logger.info("遠程地址簿註冊consul成功,node: {}", JSONUtil.serialize(healthService.getNode()));
logger.info("遠程地址簿註冊consul成功,service: {}", JSONUtil.serialize(healthService.getService()));
});
}
/**
* 註冊服務
*/
private void registerService() {
try {
ConsulClient client = new ConsulClient(consulIp, consulPort);
client.agentServiceDeregister(serviceName);
InetAddress address = InetAddress.getLocalHost();
NewService.Check check = new NewService.Check();
// 也可以tcp
check.setHttp("http://" + address.getHostAddress() + ":" + servicePort + "/presence/health");
check.setInterval("5s");
NewService newService = new NewService();
newService.setId(serviceName);
newService.setName(serviceName);
newService.setPort(servicePort);
newService.setAddress(address.getHostAddress());
newService.setCheck(check);
client.agentServiceRegister(newService);
} catch (UnknownHostException e) {
logger.error("服務註冊失敗!", e.getMessage());
}
}
}
結果如下:
2020-06-15T14:45:00.034+0800 WEB INFO 18078 --- [pool-2-thread-1] c.y.p.service.GetPhoneBookFromConsul : 遠程地址簿註冊consul成功,node: {"address":"10.200.112.43","node":"manager-master"}
2020-06-15T14:45:00.037+0800 WEB INFO 18078 --- [pool-2-thread-1] c.y.p.service.GetPhoneBookFromConsul : 遠程地址簿註冊consul成功,service: {"address":"10.200.112.43","id":"phonebook-515842c43b29046c27c6fd077712ef29","port":9993,"service":"phonebook","tags":["environment=production","version=24.2.0.0","phonebookName=XXXXXX"]}