Consul是由HashiCorp开发的一款开源工具,专注于分布式系统的服务发现和配置管理。Consul提供了多种关键功能,包括服务注册与发现、健康检查、键值存储、多数据中心支持等,特别适用于微服务架构中的服务治理。本文演示老项目如ssh,ssm等项目需要通过java api的方式来集成consul注册中心,先引入依赖
java
<dependency>
<groupId>com.ecwid.consul</groupId>
<artifactId>consul-api</artifactId>
<version>1.4.5</version>
</dependency>
编写一个监听器,在监听其中将服务注册到consul里面
java
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.ecwid.consul.v1.ConsulClient;
import com.ecwid.consul.v1.agent.model.NewService;
public class ConsulRegistrationListener implements ServletContextListener {
private static ConsulClient consulClient = null;
private static String consulServiceId = null;
@Override
public void contextInitialized(ServletContextEvent context) {
logger.debug("starting service register...");
Thread thread = new Thread(()->{
try {
initConsulClient();
} catch (Exception e) {
e.printStackTrace();
}
},"Registry-Thread");
thread.start();
}
@Override
public void contextDestroyed(ServletContextEvent context) {
consulClient.agentServiceDeregister(consulServiceId);
}
private void initConsulClient() {
consulServiceId = "xxx-service:8083";
consulClient = new ConsulClient("127.0.0.1", "8500");
NewService newService = new NewService();
newService.setId(consulServiceId);
newService.setName("xxx-service");
newService.setPort("8083");
newService.setAddress("127.0.0.1");
NewService.Check check = new NewService.Check();
check.setTtl("10s");
check.setDeregisterCriticalServiceAfter("15s");
newService.setCheck(check);
consulClient.agentServiceRegister(newService);
Thread thread = new Thread(() -> {
while (true) {
try {
consulClient.agentCheckPass("service:" + consulServiceId);
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
}
}, "Consul-Health-Check");
thread.start();
}
}
在常用工具类中可添加通过服务名获取服务url相关的方法
java
/**
* 获取Consul中的服务的url
*
* @param serviceName
* @return
*/
private static String getServiceUrlFromConsul(String serviceName) {
List<HealthService> serviceList = getServiceFromConsul(serviceName);
int size = serviceList.size();
HealthService healthService = serviceList.get(random.nextInt(100) % size);
String address = healthService.getNode().getAddress();
Integer port = healthService.getService().getPort();
return "http://" + address + ":" + port;
}
/**
* 获取Consul中的服务
*
* @param serviceName
* @return
*/
private static List<HealthService> getServiceFromConsul(String serviceName) {
HealthServicesRequest request = HealthServicesRequest.newBuilder().setPassing(true).setQueryParams(QueryParams.DEFAULT).build();
Response<List<HealthService>> healthServices = consulClient.getHealthServices(serviceName, request);
return healthServices.getValue();
}