Consul的简单介绍和基本使用
Consul简单介绍
consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server和client。每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。
👀️ https://www.consul.io/intro/index.html
Consul的功能
- client
CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。 - server
- SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
- server-leader
中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。 - raft
server节点之间的数据一致性保证,一致性协议使用的是raft,而zookeeper用的paxos,etcd采用的也是raft。 - 服务发现协议
consul采用http和dns协议,etcd只支持http - 服务注册
consul支持两种方式实现服务注册,一种是通过consul的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。consul官方建议使用第二种方式。 - 服务发现
consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式可以通过check的方式检查服务。 - 服务间的通信协议
Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossip pool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通信的,WAN pool是多个数据中心通信的,LAN pool有多个,WAN pool只有一个。
Consul的下载安装
打开Consul官网
https://www.consul.io/downloads
- 选择系统进行安装 (这里我们演示使用windows)
- 下载完/解压/会得到一个consul.exe的一个文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6993e17cf60e4f47be9281f99e4a06d6.png
-
在consul.exe的命令打开cmd窗口
3.1. 查看版本consul --version
D:\Develop\consul>consul --version Consul v1.13.1 Revision c6d0f9ec Build Date 2022-08-11T19:07:00Z Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents) D:\Develop\consul>
-
使用开发者模式启动
consul agent -dev
D:\Develop\consul>consul agent -dev ==> Starting Consul agent... Version: '1.13.1' Build Date: '2022-08-11 19:07:00 +0000 UTC' Node ID: '51d45d1a-b90f-8fae-d6cc-b4a2244fdc49' Node name: 'LAPTOP-66KVCCQR' Datacenter: 'dc1' (Segment: '<all>') Server: true (Bootstrap: false) Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600) Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302) Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false ==> Log data will now stream in as it occurs: 2022-09-16T11:37:16.799+0800 [INFO] agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:51d45d1a-b90f-8fae-d6cc-b4a2244fdc49 Address:127.0.0.1:8300}]" 2022-09-16T11:37:16.799+0800 [INFO] agent.server.raft: entering follower state: follower="Node at 127.0.0.1:8300 [Follower]" leader-address= leader-id= 2022-09-16T11:37:16.802+0800 [INFO] agent.server.serf.wan: serf: EventMemberJoin: LAPTOP-66KVCCQR.dc1 127.0.0.1 2022-09-16T11:37:16.803+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: LAPTOP-66KVCCQR 127.0.0.1 2022-09-16T11:37:16.803+0800 [INFO] agent.router: Initializing LAN area manager ....
-
启动后通过访问以下地址,可以访问到Consul的首页
http://localhost:8500
Consul注册与发现
创建Spring Boot 工程 test-goods
pom.xml文件加入以下依赖项
<!--SpringCloud consul-server -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--在本地仓库找不到就到官网去找-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
properties配置文件加入以下配置信息
###consul服务端口号
server.port=8080
spring.application.name=test-goods
####consul注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}
项目启动类增加 @EnableDiscoveryClient
注解
编写一个controller测试
@RestController
@RequestMapping("/test")
public class Test {
@GetMapping(value = "/test")
public String test1() {
return "我是 test-goods 模块的test方法";
}
}
启动项目
查看 consul的管理页面 , 发现test-goods已经注册上来了
访问 接口 , 查看是否可以访问成功
到此,单个项目注册到Consul上的教程就到此为止了
Consul模块之间的互相调用
这类似于Spring Cloud 里面的openFing , 远程调用
下面我们来创建一个工程,使用这个工程调用 test-goods 工程里面的test方法
创建test-user工程
pom.xml文件加入以下依赖项
<dependencies>
<!--SpringCloud consul-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--在本地仓库找不到就到官网去找-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
配置文件加入以下信息
###consul服务端口号
server.port=8081
spring.application.name=test-user
####consul注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}
启动类加入 @EnableDiscoveryClient
注解
配置bean /配置类初始化远程调用的对象
@Configuration
public class ApplicationContextConfig
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
创建一个controller 调用test-goods的test方法
@RestController
@RequestMapping("/user")
public class User {
public static final String INVOKE_URL = "http://test-goods";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/test")
public String paymentInfo() {
String result = restTemplate.getForObject(INVOKE_URL + "/test/test", String.class);
return result;
}
}
启动项目/实现远程调用
调研 test-user的test方法 , 查看是否可以访问到test-goods模块
至此 , consul的远程调用 , 就到这里