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
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作为服务治理中心
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界面看到新注册的服务
转载:https://blog.csdn.net/weixin_40990818/article/details/108878497