Consul

2020-03-02  本文已影响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,所以这个请求自带负载均衡功能。

执行结果
上一篇下一篇

猜你喜欢

热点阅读