Spring+consul服务注册

492 阅读2分钟

Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心 参考sq.163yun.com/blog/articl…

一、启动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上注册的服务

【实战】consul集群部署调试(0.7.1版本)

更多精彩关注公众号“51运维com”