传统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();
	}
相关推荐
ZKNOW甄知科技几秒前
燕千云AI-ITR系列:三线分层机制的标准化解决方案
大数据·运维·人工智能·低代码·自然语言处理·自动化·敏捷流程
AIOps打工人2 分钟前
数据库运维工具选型 2026 横评:dbskiter vs MySQL Workbench vs percona_toolkit vs Navicat
运维·数据库·mysql
Bode_200219 分钟前
离散制造系统中自动化底座的主要软件品牌
运维·机器人·自动化·制造
炸炸鱼.22 分钟前
Git+Jenkins 基本使用:从入门到实战(知识点大全)
运维·git·jenkins
会Tk矩阵群控的小木42 分钟前
独立站tk矩阵系统站外引流实战:多账号管理+风控+数据分析代码实现
运维·macos·自动化·个人开发·tk矩阵
似水এ᭄往昔42 分钟前
【Linux系统编程】--命令行参数和环境变量
linux·运维·服务器
vortex543 分钟前
Linux 组管理命令工具链
linux·运维·服务器
艾莉丝努力练剑43 分钟前
【Linux网络】数据链路层协议(二):ARP协议
linux·运维·服务器·网络·计算机网络·udp
willhuo1 小时前
射击训练系统 Docker 部署方案(OpenCloudOS 9.4)
运维·docker·容器
NCU_wander1 小时前
LB HA(high avaliablity)和nginx
运维·nginx