Consul

作者: 一腔诗意换酒钱 | 来源:发表于2020-03-02 16:17 被阅读0次

    Spring Cloud中,大部分组件都有备选访问,如注册中心,除了常见的Eureka外,还有另一个常用的方案就是Consul。Consul是HashiCrop公司推出的开源产品。主要提供:服务发现、服务隔离、服务配置等功能。

    相比Eureka和zookeeper,Consul的配置更加简单,其中内置了许多微服务常用的需求:服务发现与注册、分布式一致性协议实现、健康检查、键值对存储、多数据中心等。不需要再安装其他第三方来实现这些功能。

    安装

    Consul是基于Go语言开发的注册中心,要使用Consul需要现在官网上下载安装软件。

    官网地址:https://www.consul.io/

    下载压缩包,解压后将consul添加到环境变量,在cmd中输入命令

    consul agent -dev
    

    即可开启服务,开启后访问localhost:8500就可以进入consul的后台管理界面

    Consul使用

    单节点服务注册

    创建一个provider服务,添加如下依赖

    consul-provider

    对consul服务进行配置

    #服务名称
    spring.application.name=consul-provider
    #服务端口号
    server.port=2000
    #注册中心地址
    spring.cloud.consul.host=localhost
    #consul端口
    spring.cloud.consul.port=8500
    #consul服务名称
    spring.cloud.consul.discovery.service-name=consul-provider
    

    之后在启动类上添加@EnableDiscoveryClient注解,开启服务发现

    添加一个简单的测试接口

    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello(){
            return "hello consul";
        }
    }
    

    启动服务,在consul后台管理界面可以看到服务注册成功

    image

    consul集群注册

    简单修改测试接口,使接口能返回服务端口号

    @RestController
    public class HelloController {
        @Value("${server.port}")
        Integer port;
        @GetMapping("/hello")
        public String hello(){
            return "hello consul>>>"+port;
        }
    }
    

    修改完成后打包项目,在Terminal启动两个项目实例,分别运行在2000端口和2001端口,再进入consul控制台查看,可以看到两个服务都被注册到了consul上,这两个服务就是一个集群。

    服务中心注册信息

    consul服务消费

    项目创建方法和provider服务一样,创建spring boot项目选择Web、Consul Discovery和Spring Boot Actuator三个依赖,并添加相关配置。

    注意:避免端口重复

    在启动类中开启服务发现,并创建一个RestTemplate的实例

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ConsulConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConsulConsumerApplication.class, args);
        }
        @Bean
        RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    

    编写测试接口调用服务,注入RestTemplate和LoadBalanceCllent

    通过LoadBalanceCllent实例获取要调用的ServiceInstance,获取成功后用
    RestTemplate调用

    @RestController
    public class HelloController {
        @Autowired
        LoadBalancerClient loadBalancerClient;
        @Autowired
        RestTemplate restTemplate;
        @GetMapping("/hello")
        public void hello(){
            //获取服务信息
            ServiceInstance choose = loadBalancerClient.choose("consul-provider");
            System.out.println("服务地址:"+choose.getUri());
            System.out.println("服务名称:"+choose.getServiceId());
            String s = restTemplate.getForObject(choose.getUri()+"/hello", String.class);
            System.out.println(s);
        }
    }
    

    在consul的后台可以看到consumer服务已经注册到服务中心

    服务中心注册信息

    访问localhost:2002/hello接口可以看到调用服务的相关信息以及服务端方法的调用结果,由于注入了LoadBalanceCllent,所以这个请求自带负载均衡功能。

    执行结果

    相关文章

      网友评论

          本文标题:Consul

          本文链接:https://www.haomeiwen.com/subject/esyvkhtx.html