Consul简单使用以及集群选举原理
是什么
Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。
它具有很多优点。包括: 基于 raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP 和 DNS 协议 支持跨数据中心的 WAN 集群 提供图形界面 跨平台,支持 Linux、Mac、Windows
功能有哪些
服务注册中心、健康监测、K\V存储、多数据中心、可视化管理
Consul服务搭建
本次在windows下演示单机模式,集群搭建参考官网或者问问chatGPT
下载
根据系统环境下载对应的安装包,windows直接就是一个.exe文件
运行
- 在exe目录中打开cmd,执行命令
consul agent -dev
#只能本地(localhost:8500\127.0.0.1:8500)可以访问
#要想通过ip可以访问,使用下面的使用即可
consul agent -dev -client 0.0.0.0 -ui
#指定ip可以访问
-
浏览器打开http://127.0.0.1:8500/
能打开即为成功
生产者消费者服务搭建
生产者&消费者POM
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-consul-discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>3.0.2</version>
</dependency>
生产者Yml
server:
port: 7777
spring:
application:
name: my-producer #注册到consul的服务名称
cloud:
consul:
host: 10.20.30.94:8500
port: 8500
discovery:
service-name: ${spring.application.name}
消费者Yml
server:
port: 6655
spring:
application:
name: my-customer-6655 #注册到consul的服务名称
cloud:
consul:
host: 10.20.30.94:8500
port: 8500
discovery:
service-name: ${spring.application.name}
消费者java代码
Config
package com.rb.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextBean
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
Controller
package com.rb.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class CustomerController {
public static final String URL = "http://my-producer";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/customer/getMethod")
public String getMethod(String val){
String result = restTemplate.getForObject(URL+"/producer/getMethod?val="+val, String.class);
return result;
}
}
生产者java代码
Controller
package com.rb.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProducerController {
@GetMapping("/producer/getMethod")
public String getMethod(String val){
return val+"7777";
}
}
启动类
package com.rb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class,args);
}
}
测试
启动生产者&消费者
如全部搭建成功在Consul页面可看到
并且通过消费者可访问到生产者的方法
Consul集群选举原理
Consul使用基于Raft协议的一致性算法来实现分布式集群中的领导者选举机制。Raft算法是一种分布式一致性算法,它将集群中的节点划分为领导者、跟随者和候选人。
当一个节点启动时,它首先成为候选人,并向其他节点发送投票请求。如果一个节点接受了该候选人的请求,它会将投票返回给该候选人。如果该候选人收到了集群中大多数节点的投票,它将成为新的领导者。
一旦选举完成,Consul中的所有更改将由新的领导者发起,并通过Raft协议进行复制。在领导者失效或网络分区等情况下,节点将启动新的选举流程,以选择新的领导者。
需要注意的是,为了保证集群的可用性,Consul集群中应该至少有3个节点。这样,在发生节点失效或网络分区等情况时,集群仍然能够正常运行,并保持数据的一致性。
总之,Consul使用Raft算法来实现领导者选举机制,保证了集群中节点的高可用性和数据的一致性。