【Spring Cloud H 版教程】第四篇:注册中心组件Consul

1.概述

在前面的文章我们已经提到过,服务发现是微服务架构不可或缺的基础设施组件,Eureka 作为 Spring Cloud 标准服务发现的实现组件之一,由 Netflix 公司研发,是目前企业用得最多的注册中心组件。Eureka 包含了 1.x 版本 和 2.x 版本,其中 1.x 版本在国内被广泛使用,Netflix 本来想趁热打铁,推出 Eureka 2.x 版本,然而就在 2018 年 7 月,其官方突然宣布 Eureka 2.0 的开源工作不再继续,并警告用户使用 2.x 版本来部署生产环境,需要自己承担一切后果。

在当时这样的背景之下,各大企业不得不需要重新考虑在注册中心组件上的技术选型,由于当时 Nacos 还没有被纳入到 Spring 官方正式项目大家庭中,所以并没有引起人们足够的关注,倒是 Spring 官方之前一直不温不火的 Consul 突然开始流行起来,成为中小企业首选的注册中心组件。Consul 全称 Spring Cloud Consul ,采用 Go 语言开发,是 Spring 官方的正式项目之一,是 Spring Cloud 大项目的组成部分。如同 Eureka 一样,Consul 也提供了非常方便整合 Spring Boot 项目的能力,同样只需要少量的注解和配置用户就可以快速地启用 Consul ,构建出大型分布式系统。Consul 不仅拥有服务发现的功能,还拥有 Eureka 没有的分布式配置中心功能,并且 Consul 可以很好地支持 Spring Cloud Netflix 相关的开源组件,例如 Ribbon、Zuul 等。

2.安装服务端

Consul 同样包含的服务端和客户端,其中服务端程序不需要我们像 Eureka 那样需要手动创建,已经提前发布在其官网上,截止到作者写该篇文章时 Consul 最新版为 1.7.2 。

2.1下载Consul管理台

Consul 下载地址:

官方网站:https://www.consul.io
下载地址:https://www.consul.io/downloads.html

图片: https://uploader.shimo.im/f/rzsrYjGwYX4KtTYQ.png

2.2安装Consul管理台

实际开发中一般使用 Linux 环境部署 Consul,所以作者只演示在 Linux 环境的安装和启动,其他环境读者朋友可以查阅相关资料自己去安装和启动,作者演示的 Linux 注解 IP 地址为:192.168.0.149 。

第一步:安装 Consul。安装非常简单只需要解压 zip 文件即可:

[root@test home]# unzip consul_1.7.2_linux_amd64.zip

解压完成之后可以将 consul 命令 拷贝到 /usr/local/bin 目录中,这样就可以全局使用该命令。

[root@test software]# mv ./consul /usr/local/bin/

第二步:启动 Consul。执行以下命令启动:

consul agent -server -bind=192.168.0.149 -client=0.0.0.0 -bootstrap-expect=1 -data-dir=./data -node=server1 -ui

-server 表示以服务端身份启动
-bind 绑定主机地址,默认是 127.0.0.1
-client 指定客户端访问的 IP (consul 有丰富的 api 接口,这里的客户端指浏览器或调用方),0.0.0.0 表示不限制客户端 IP
-bootstrap-expect=1 表示 server 集群最低节点为 1,低于这个值将工作不正常(注:类似zookeeper一样,通常集群数为奇数,方便选举,consul采用的是raft算法)
-data-dir 表示指定数据的存放目录
-node 表示节点在 web ui 中显示的名称
-ui 表示启用web管理台

第三步:访问 Consul 管理台,管理台默认端口是 8500 。在浏览器输入地址 http://192.168.0.149:8500 即可访问。
图片: https://uploader.shimo.im/f/d3LS1QSVTDkbvtQF.png
注意:Consul 管理台目前存在一些 bug,在谷歌浏览器下会经常出现 Error 错误,建议使用其他浏览器打开,例如火狐浏览器。

Consul returned an error. You may have visited a URL that is loading an unknown resource, 
so you can try going back to the root or try re-submitting your ACL 
Token/SecretID by going back to ACLs.Try looking in our documentation

在这里插入图片描述

3.注册中心

3.1加入consul-discovery依赖

客户端程序整合 Consul 需要在 POM 中加入 spring-cloud-starter-consul-discovery 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--consul注册中心-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

当客户端注册 Consul 时,它提供有关自身的元数据,如主机和端口,ID,名称和标签。默认情况下会创建一个 HTTP 检测,每隔 10 秒,Consul 命中 /health 端点。如果健康检查失败,则服务实例被标记为关键。

3.2application.yml配置连接Consul

在 application.yml 配置连接 Consul 服务端:

server:
  port: 8755

spring:
  application:
    name: cloud-consul-client

3.3通过DiscoveryClient获取注册中心信息

对于主启动类来说,由于 Consul 遵循了 Spring Cloud 的服务发现标准,所以同样通过注解 @EnableDiscoveryClient 声明作为注册中心客户端程序。

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulClientMain8755 {

    public static void main(String[] args) {
        SpringApplication.run(ConsulClientMain8755.class,args);
    }

}

启动客户端程序,可以在控制台看到输出 Registering service with consul 的相关日志,就表明已经成功注册到了 Consul 服务端。

2020-04-24 11:30:54.779  INFO 714636 --- [           main] o.s.c.c.s.ConsulServiceRegistry          : 
Registering service with consul: 
NewService{id='cloud-consul-client-8755', name='cloud-consul-client', tags=
[secure=false], address='192.168.0.205', meta=null, port=8755, enableTagOverride=null,
check=Check{script='null', interval='10s', ttl='null', 
http='http://192.168.0.205:8755/actuator/health', method='null', header={},
tcp='null', timeout='null', deregisterCriticalServiceAfter='null', 
tlsSkipVerify=null, status='null'}, checks=null}

在这里插入图片描述

我们可以在程序中通过 DiscoveryClient 获取 Consul 管理台上所有的注册实例相关的信息。

@RestController
@RequestMapping("/consul")
@Slf4j
public class ConsulController {

    @Resource
    private DiscoveryClient discoveryClient;

    /**
     * 获取注册中心上所有的注册实例
     * @return
     */
    @GetMapping("/getInstanceList")
    public List<ServiceInstance> getInstanceList (){
        List<ServiceInstance> instanceList = new ArrayList<>();
        discoveryClient.getServices().forEach( serviceId -> {
            List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
            instanceList.addAll(instances);
        });
        return instanceList;
    }

浏览器输入地址:http://192.168.0.205:8755/consul/getInstanceList
在这里插入图片描述

4.配置中心

Consul 提供了一个用于存储配置和其他元数据的键/值存储功能。所以 Consul 除了可以作为微服务架构的注册中心之外,还可以作为配置中心,在这点上和后面会讲到的 Nacos 很相似。

4.1创建配置文件

我们现在 Consul 管理台创建一个配置文件, 其中 data-key 为 user :

config:
 name: luke123
person:
 name: Jordon
 number: 24
 sex:

图片: https://uploader.shimo.im/f/Ub3BuTyq7D3VTvLO.png
其中配置文件结构可以如下:

config/testApp,dev/ 表示客户端服务testApp的dev环境的配置文件
config/testApp/ 表示客户端服务testApp的配置文件
config/application,dev/ 表示所有客户端服务dev环境的配置文件
config/application/ 表示所有客户端服务的配置文件

比如我的例子是目录结构为:config/cloud-consul-client,表示该配置文件只给 cloud-consul-client 服务使用,user 是一个 data-key ,表示配置文件的名称,默认值为 data 。config 值也可以通过 prefix 配置项指定。

4.2加入consul-all依赖

为了使用 Consul 的配置中心功能,我们需要在 POM 中屏蔽之前的 spring-cloud-starter-consul-discovery 依赖,加入 spring-cloud-starter-consul-all :

<!--consul-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <!--<artifactId>spring-cloud-starter-consul-discovery</artifactId>-->
    <artifactId>spring-cloud-starter-consul-all</artifactId>
</dependency>

使用了 Consul 的配置中心功能之后,我们需要将 consul 相关的配置项都配置在 bootstrap.xml 文件:

#连接consul配置中心
---
spring:
  cloud:
    consul:
      host: 192.168.0.149
      port: 8500
      discovery:
        prefer-ip-address: true #使用ip地址注册,而不是主机名
      config:
        format: yaml #配置格式
        prefix: config #前缀
        data-key: user #配置文件key

4.3输出配置项

创建类 PersonConfig 用于接收配置文件内容,同时修改 ConsulController 代码将结果输出。

@Component
@ConfigurationProperties(prefix = "person")
@Data
public class PersonConfig {

    private String name;

    private Integer number;

    private String sex;

}
@RestController
@RequestMapping("/consul")
@Slf4j
@RefreshScope //动态刷新
public class ConsulController {

    @Value("${config.name}")
    private String configName;

    @GetMapping("/getConfigName")
    public String getConfigName(){
        return configName;
    }

    @Autowired
    private PersonConfig personConfig;

    @GetMapping("/getPersonConfig")
    public PersonConfig getPersonConfig(){
        return personConfig;
    }

}

启动客户端程序,在浏览器依次访问 http://192.168.0.205:8755/consul/getConfigName
http://192.168.0.205:8755/consul/getPersonConfig
图片: https://uploader.shimo.im/f/1gSjHGd1KUheCEyY.png

4.4动态属性配置

注册中心最重要的作用就是,除了集中管理各个程序的配置之外,还可以在客户端程序不重启的情况就可以动态刷新配置的值,下面我们来修改配置文件的内容,再次访问试试:
在这里插入图片描述
在这里插入图片描述

5.附录

Consul 所有相关的配置项:

https://cloud.spring.io/spring-cloud-static/spring-cloud-consul/2.2.2.RELEASE/reference/html/appendix.html

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章