Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心
一、启动consul
二、consul-client部分
- 增加依赖到pom.xml文件
<dependency>
<groupId>com.orbitz.consul</groupId>
<artifactId>consul-client</artifactId>
<version>1.3.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码
-
服务注册及健康检查
package daemo.check;
import com.orbitz.consul.*;
import com.orbitz.consul.model.agent.ImmutableRegCheck;
import com.orbitz.consul.model.agent.ImmutableRegistration;
import com.orbitz.consul.model.agent.Registration;
import com.orbitz.consul.model.health.ServiceHealth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.List;
public class ServiceRegister implements ApplicationListener<ContextRefreshedEvent> {
private static final Logger logger = LoggerFactory.getLogger(ServiceRegister.class);
@Value("${spring.application.name}")
private String appName;
Consul client = Consul.builder().build();
AgentClient agentClient = client.agentClient();
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
logger.info("开始注册");
try {
//健康检查需要用到actuator,在application.properties中配置
//management.endpoints.web.base-path=/monitor
//management.endpoint.health.show-details=always
//management.endpoints.web.exposure.include=*
URL url = URI.create("http://127.0.0.1:8088/monitor/health").toURL();
//use server tag
Registration registration = register("127.0.0.1","8088",url,3,appName,appName,"devtag");
agentClient.register(registration);
}catch (MalformedURLException e) {
logger.error("You configured a wrong health check URL[{}]! ");
throw new RuntimeException(e);
}
}
private Registration register(String hostIp, String port, URL http, long interval, String name, String id, String tags) {
Registration.RegCheck check = ImmutableRegCheck.builder().http(http.toExternalForm()).interval(String.format
("%ss", new Object[]{Long.valueOf(interval)})).build();
ImmutableRegistration.Builder registrationBuilder = ImmutableRegistration.builder().port(Integer.parseInt(port)).check(check).name
(name).id(id).addTags(tags);
if (!"localhost".equalsIgnoreCase(hostIp) && !"127.0.0.1".equalsIgnoreCase(hostIp)) {
registrationBuilder.address(hostIp);
}
return registrationBuilder.build();
}
/**
* 发现可用的服务
*/
public List<ServiceHealth> findHealthyService(String servicename){
Consul consul = Consul.builder().build();
HealthClient healthClient = consul.healthClient();//获取所有健康的服务
return healthClient.getHealthyServiceInstances(servicename).getResponse();//寻找passing状态的节点
}
/**
* 存储KV
*/
public void storeKV(String key, String value){
Consul consul = Consul.builder().build();
KeyValueClient kvClient = consul.keyValueClient();
kvClient.putValue(key, value);//存储KV
}
/**
* 根据key获取value
*/
public String getKV(String key){
Consul consul = Consul.builder().build();
KeyValueClient kvClient = consul.keyValueClient();
return kvClient.getValueAsString(key).get();
}
/**
* 找出一致性的节点(应该是同一个DC中的所有server节点)
*/
public List<String> findRaftPeers(){
StatusClient statusClient = Consul.builder().build().statusClient();
return statusClient.getPeers();
}
/**
* 获取leader
*/
public String findRaftLeader(){
StatusClient statusClient = Consul.builder().build().statusClient();
return statusClient.getLeader();
}
}
复制代码
- ConsulConfig配置
package daemo.config;
import daemo.check.ServiceRegister;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @ClasssNmae:ConsulConfig
* @Author:sange
* @Description:
* @Date:2019/8/2 上午10:04
* @Version:1.0
**/
@Configuration
public class ConsulConfig {
@Bean
public ApplicationListener getEnniuApplicationStartedEvent() {
return new ServiceRegister();
}
}
复制代码
三、启动服务
查看server上注册的服务
更多精彩关注公众号“51运维com”
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END