SpringCloud使用Consul作为服务治理中心

前言

我们在进行开发分布式架构的系统时,有一个不可或缺的工具那就是服务治理组件,我们可以通过它来实现服务的注册、发布和调用,可以理解为它维护着我们所有服务的花名册。目前主流的服务治理中心有​​Zookeeper​​​、​​Eureka​​​、​​Nacos​​​等,但是今天这里我想和大家介绍一下另一种服务治理组件—​​Consul​​。

Nacos的使用可以参考我的博客:​​Nacos服务治理中心和配置中心​​

正文

Consul

Consul是一个​​Spring Cloud​​​ 中集成好的开源的分布式的服务注册发现中心。
由​​​Go​​​语言编写。支持健康检查,多数据中心还支持k-v存储,采用​​Raft​​​一致性算法,保证强一致性,可用性。并且和​​docker​​完美兼容。

Consul本身也是一种服务治理中心,相对于​​Eureka​​而言:

  • ​Consul​​牺牲了部分的性能,保证了服务的强一致性。
  • ​Eureka​​只要服务注册到主节点,就认为服务注册成功,不关其他节点是否可以正常调用。

Consul vs Eureka vs Zookeeper

SpringCloud使用Consul作为服务治理中心_consul

​CAP​​​原理分别指的是,数据一致性、数据可用性、分区耐受性 ,这里​​AP​​​和​​CP​​分别指的是:

  • AP模式​: 牺牲强一致性,部分节点宕机,不会影响正常工作的节点。
  • CP模式​: 牺牲数据可用性,为了保证数据的一致性,当一台机器出现故障时,所有节点的数据都不能使用。

一致性算法,使一组服务器在一个值上达成一致,所以活跃的特征在于最终每个服务器都可以决定一个值。通过值的一致能够实现对同一个数据的请求会让同一个服务器来处理。​​Paxos​​​和​​Raft​​​都是通过选取​​master​​来实现多节点下值的一致性。

Consul的安装及启动

第一步:下载consul​​
根据自身的系统从​​​官网​​​选择合适的版本。我这里使用的是​​Mac​​​,可以直接使用​​brew​​​下载
同样使用Mac的小伙伴可以参考我的博客:​​使用Mac系统来进行Java编程​​

brew install consul

第二步:启动consul

./consul agent -dev -ui -client 0.0.0.0

启动命令各参数说明:

  • agent​​:​​Consul​​的核心命令,主要作用有维护成员信息、运行状态检测、声明服务以及处理请求等
  • -server​​:就是代表​​server​​模式
  • -ui​​:代表开启​​web​​ 控制台
  • -bootstrap-expect​:代表想要创建的集群数目,官方建议3或者5
  • -data-dir​:数据存储目录
  • -node​​:代表当前​​node​​的名称
  • -client​​:应该是一个客户端服务注册的地址,可以和当前​​server​​的一致也可以是其他主机地址,系统默认是127.0.0.1
  • -bind​:集群通讯地址
  • -join​:加入的集群地址

第三步:进入​​http://localhost:8500/ui/dc1/services​​进入Consul UI界面

SpringCloud使用Consul作为服务治理中心_服务治理_02

SpringCloud使用Consul作为服务治理中心

Maven依赖

  • ​Consul​​​对于​​SpringBoot​​​和​​SpringCloud​​​的版本有着一定的要求,所以这里展示实例​​demo​​相对完整的依赖。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<lombok-version>1.18.2</lombok-version>
</properties>

<dependencies>
<!--actuator用于检查节点健康-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

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

<!--spring boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok-version}</version>
<optional>true</optional>
</dependency>

</dependencies>

<!--加入Spring Cloud 的Dalston版本的配置依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

application.properties:配置类

server.port=8080
spring.application.name=springcloud-demo-producer

#consul
spring.cloud.consul.host=127.0.0.1
spring.cloud.consul.port=8500
#健康检查路径
spring.cloud.consul.discovery.health-check-path=/actuator/health
spring.cloud.consul.discovery.health-check-interval=15s
spring.cloud.consul.discovery.hostname=127.0.0.1
spring.cloud.consul.discovery.register=true
spring.cloud.consul.discovery.port=${server.port}


#consul service name
spring.cloud.consul.discovery.serviceName=springcloud-demo-producer
spring.cloud.consul.discovery.heartbeat.enabled=true

SpringCloudProducerApp:启动类

  • @EnableDiscoveryClient​​:用于向​​consul​​​或者​​zookeeper​​作为注册中心的时候提供注册服务
@Slf4j
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class SpringCloudProducerApp extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringCloudProducerApp.class);
}
/**
* 项目的启动方法
*
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(SpringCloudProducerApp.class, args);
log.info("======服务已经启动========");
}
}

验证

启动项目,进入​​http://localhost:8500/ui/dc1/servicesConsul​​ UI界面看到新注册的服务

SpringCloud使用Consul作为服务治理中心_nacos_03

SpringCloud使用Consul作为服务治理中心_nacos_04