传统JavaWeb项目集成consul注册中心

​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();
	}
相关推荐
海宇数据21 分钟前
零信任架构实战:基于海宇入职背调报告构建自动化即时配送与网约车众包运力准入鉴权网关
运维·人工智能·架构·自动化
姜鱼问生39 分钟前
每次开机手动检查 6 样东西?我写了个 2 秒自检脚本
运维·网络·nginx·docker·容器
wangqiaowq1 小时前
PostgresSQL server Docker 安装部署
运维·docker·容器
南棋网络安全2 小时前
ssrf跨站请求伪造(保姆级教程)
运维·服务器·网络·网络安全
帷幕落秋2 小时前
进程服务与文件描述符
linux·运维·面试
帷幕落秋2 小时前
信号、Ctrl 组合键与进程状态
linux·运维·面试
开开心心就好2 小时前
文件被占用删不掉?解锁工具强制删除
java·运维·服务器·开发语言·前端·pdf·ocr
小超人诞生日记2 小时前
Linux 进程优先级
linux·运维·服务器
科技象限2 小时前
数据防泄漏系统:文件是怎么溜出门的,就该怎么堵
运维·网络·网络安全·安企神
cpolar技术支持2 小时前
端口被谁占了、这台机上开了哪些监听?本机起一个端口占用只读清单,cpolar 给异地同事远程看谁在监听
运维·python·内网穿透·cpolar·端口占用