服务治理Consul篇

news/2024/12/19 1:53:52/文章来源:https://www.cnblogs.com/binghandsom/p/18615744

服务中心Consul

光从名字上就能看出他是个头头。Consul的本意是“领事,总督”。就像战场上的将军,带一帮喽啰去打仗,首先他要有个花名册,记录下他们有哪些战士,姓甚名谁,抡大刀还是耍长枪,他要知道哪个战士的能力如何,该对付多少敌人,哪个战士失踪了,或者战伤了,该不该担架抬回来,要不要派替补上去顶着。另外所有的喽啰的装备配置他也要管(config)。
当喽啰(微服务)比较少时只需要比较少的总督(注册中心就够),为了确保总督出现意外,确保战争胜利,比较要紧的时刻是需要更多个总督共同来管理喽啰的,不光喽啰有替补,总督也要,才保险。这就是所谓的集群和高可用。总督与总督之间也互相作为喽啰登记在册,即注册中心不仅能够作为管理者也要作为其他注册中心的被管理者。

找到服务(Service Discovery)

在分布式集群服务中会有众多的服务,并且服务的地址对于客户端来说会是纷繁的,并且可能变化,于是解决这个问题就有了服务注册与发现的问题。
每个微服务启动后需要到注册中心进行登记,登记的过程,不仅告诉服务注册中心它的逻辑名称,还会把网络信息暴露给注册中心。那么当客户端要请求某一应用的服务时,这个客户端只需要告诉注册中心他要访问的服务名称,注册中心就能够返回给客户端一个可用的请求ip地址。这个过程就是服务发现。如图:
image

安装Consul服务(windows篇)

下载

进入Hashicorp Consul release下载链接
https://releases.hashicorp.com/consul/
当前最新的1.20.1可以看到有一系列可以下载的安装包,这里我选择Windows_amd64.zip
image
如果您有Linux需要部署,根据需要选择linux版本的安装包。

解压:

image

配置环境变量

Win+Pause键打开系统信息。(windows)->高级系统设置->

设定CONSUL_HOME
F:\envi\consul
Path中添加
%CONSUL_HOME%

Win+R cmd回车打开windows黑窗口
输入consul --version应当看到类似如下信息
image

consul运行参数

-server 以服务端模式运行,相应的还有客户端模式-client
-ui 启动内置的Web UI
-bootstrap-expect=3 集群最少节点数,类似zookeeper的配置一样,为了防止脑裂,一般为奇数
-data-dir=/data/consul 数据存储目录
-node=agent-1 集群的节点名称,如果你不指定,他会是你的hostname比如localhost
-client=0.0.0.0 指定客户端能访问的ip,类似于ip白名单。0.0.0.0表示不限制
-bind=10.25.84.163 绑定了当前主机的IP地址
-datacenter=dc1 数据中心名称
-retry-join agent启动时加入到代理服务器地址,不指定不会加入任何节点,可以在启动后通过consul join命令加入

consul配置文件

你可以创建一个或多个文件来配置Consul agent去启动。官方推荐把相似的配置信息分成不同的部分文件,比如ACL参数,让管理配置文件更加简单一些。你可以选择使用HCL文件格式或者JSON格式的配置文件。当使用JSON配置文件时,配置内容一个是一个JSON对象,它有很多key。
HCL大概是HashiCorp Config Language的简称。

agent 参数详解

启动一个consul agent服务

有两种方式启动agent,一种是cli参数,一种是配置文件,为了能够方便修改和查看、复用,使用配置方式。
启动命令:
consul agent -config-file=server.json
或者
consul agent -config-file=server.hcl
创建一个配置文件
config_learn.hcl

编辑内容如下

点击查看代码
datacenter = "datacenter_learn"
data_dir = "F:/envi/consul/data/data_learn"
log_level = "INFO"
node_name = "node_learn_01"
server = true
address = 127.0.0.1:18888
ui = true
client = "0.0.0.0"

黑窗口执行命令
consul agent -config-file=F:/envi/consul/config/config_learn.hcl
报错了:
Node name "node_learn_01" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.
不允许使用下划线,node_name只能是英文数字,中划线组成。
将node_learn_01修改为node-learn-01。
再次执行。再次报错:failed to sync remote state: error="No cluster leader"。这说明需要有节点领导者。虽然报错,但是程序依然没有中断。这时候进入网页可以看到中心服务已经起来了如图:
image

启动多个consul

由于本人只想在本地测试3个注册中心,所以就通过改变端口的方式来达到目的。一般情况下,不会有将相同类型的注册中心部署到同一个服务器。(这服务器物理机一挂不就团灭了吗?哈哈~)
为了防止同一机器上三个服务抢夺端口,那么我们需要闹明白:
1.consul的默认端口哪些开启了
这个问题参加本篇博文默认端口部分
查看表格发现consul默认启动的网络服务使用了以下几个(6)

Port name Default port
DNS 8600
HTTP 8500
gRpc TLS 8503
Server PRC 8300
LAN Serf 8301
WAN Serf 8302

2.如何通过配置文件修改服务端口
如何修改consul的各网络服务端口
一看就会

步骤1,准备配置文件,文件夹

关闭之前启动的consul节点服务。
分别创建三个路径:
data_learn0,data_learn1,data_learn2
假想下,它们位于不同的物理机服务器。
复制出来多个配置文件,名称分别叫
config_learn00.hcl config_learn01.hcl config_learn02.hcl
内容修改如下:
config_learn00.hcl

点击查看代码
datacenter = "datacenter_learn"
data_dir = "F:/envi/consul/data/data_learn00"
log_level = "INFO"
node_name = "node-learn-00"
server = true
ui = true
client_addr = "0.0.0.0"
bootstrap_expect = 3
ports={dns=8600http=8500grpc_tls=8503server=8300serf_lan=8301serf_wan=8302
}

config_learn01.hcl

点击查看代码
datacenter = "datacenter_learn"
data_dir = "F:/envi/consul/data/data_learn01"
log_level = "INFO"
node_name = "node-learn-01"
server = true
ui = true
client_addr = "0.0.0.0"
bootstrap_expect = 3
ports={dns=18600http=18500grpc_tls=18503server=18300serf_lan=18301serf_wan=18302
}

config_learn02.hcl

点击查看代码
datacenter = "datacenter_learn"
data_dir = "F:/envi/consul/data/data_learn02"
log_level = "INFO"
node_name = "node-learn-02"
server = true
ui = true
client_addr = "0.0.0.0"
bootstrap_expect = 3
ports={dns=28600http=28500grpc_tls=28503server=28300serf_lan=28301serf_wan=28302
}
### 分别启动三个consul执行命令 打开三个控制台黑窗口。分别输入如下命令,然后回车: `consul agent -config-file=F:/envi/consul/config/config_learn00.hcl` `consul agent -config-file=F:/envi/consul/config/config_learn01.hcl` `consul agent -config-file=F:/envi/consul/config/config_learn02.hcl` #### 默认端口 参见: https://developer.hashicorp.com/consul/docs/install/ports ![image](https://img2024.cnblogs.com/blog/728178/202412/728178-20241218212540293-1707582516.png)

参考

csdn

https://blog.csdn.net/u014513883/article/details/104597521

官方文档

https://developer.hashicorp.com/consul/docs/agent#starting-the-consul-agent

其他关于consul

一致性协议(共识协议)( consensus protocol)

HashiCorp官方的解释consesus protocal

Consul使用Raft protocol作为共识协议,它参考并基于帕克西(Paxos),Raft算法更简单更容易理解的一种少量状态的算法。
Raft算法中包含一些重要概念设计:
1.日志(Log)————日志是Raft系统基本工作单元。日志是一个有序的一致的条目,并且日志具有副本(每个consul节点的日志都一样那么肯定是注册中心一致性状态正常)。条目中包含集群节点信息的变化:增加节点(微服务),增加服务(接口暴露),新的键值对(配置信息),等等。当所有的其他(consul)节点的日志条目都与本服务注册中心的日志条目内容顺序一样,就认为注册中心是一致的。
2.FSM————有限状态机的缩写(Finite State Machine)。FSM是一个状态收集器,它可以有状态的转化。当新的日志被应用后,FSM是可以根据日志信息进行状态的变化。应用的相同的顺序的日志必须导致相同的状态,意味着应用的状态一定是可断定的(应用是on还是off,和其他一些信息,比如接口状态信息也一致)。
3.节点集合————节点集合是指参与到日志副本记录的所有节点成员。在consul设计理念中,所有的服务节点都在它们自己的注册中心服务中。
4.仲裁者————节点集合的多数节点共同构成仲裁者(少服从多原则)。如果有(N/2)+1个注册中心说A服务挂了,那么就认定A服务挂了。
5.提交的条目————当一个条目被节点仲裁者的节点持久化保存到本地就认为节点这个条目是已提交的条目。条目一旦被提交,就可以被应用。
6.领导节点————在任何时候,节点集合选取一个consul节点作为领导节点。这个领导节点的职责是(向其他consul节点)获取新的日志条目并把他们同步到其他的consul节点,同时还负责管理提交的条目。

Raft一致性策略,动画演示

这样看来,表面上是所有注册中心都是平等的,实际上在确定时刻还是有一个人负责同步,只是这个人是可变的。

一致性协议特征简述

创建项目

idea新建项目

image
image
image

项目pom.xml

点击查看代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.shouldsun</groupId><artifactId>cloud_social</artifactId><version>0.0.1-SNAPSHOT</version><name>cloud_social</name><description>cloud_social</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><spring-cloud.version>2024.0.0</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

非常遗憾

当我查询Consul是否开源时,发现它是个不完全免费的东西,我决定放弃学习了。
image

参见:
https://blog.csdn.net/zhangzehai2234/article/details/135761007

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855133.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库高可用性与容灾

title: 数据库高可用性与容灾 date: 2024/12/19 updated: 2024/12/19 author: cmdragon excerpt: 在现代企业中,数据库的高可用性和容灾能力至关重要。为了保证业务的连续性,必须确保数据库在发生故障或灾难时能够快速恢复和持续可用。将探讨实现数据库高可用性和容灾的策略,…

Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?

Redis 是一个内存数据库,意味着它主要将数据存储在内存中,从而能够提供极高的性能。然而,作为内存数据库,Redis 默认情况下的数据不会永久保存。为了确保数据在重启或故障后能够恢复,Redis 提供了几种 **持久化机制**。这些机制允许 Redis 将内存中的数据保存到硬盘上,从…

【甲方安全】金融行业+网络安全合规

一、金融机构安全建设需求分析框架 由于金融数据的敏感性和金融交易的重要性,使得金融机构成为网络攻击行为的重点目标,也使金融机构成为网络安全监管的重点关注对象。 金融机构在进行网络安全需求分析和安全体系建设时,建议从安全建设的外部和内部两方面的驱动力进行分析,…

应用题6

考点:图的存储结构(邻接矩阵,邻接表,邻接多重表,十字链表)P149-165 Dijkstra 算法求最短路径 P173-177 普利姆算法求最小生成树 P170-173邻接矩阵表示图;若有节点元素n个,则有n*n个元素的数组,第i行表示从i元素出发到达各个元素的路径是否存在。 第i列则表示从各元素进…

【架构】一文搞懂业务架构的5个核心概念

今天聊聊业务架构的5个核心概念。 商业模式 商业模式是帮助企业成功的“秘诀”,它通过整合企业内外部的多种要素,构建起一个全面、高效且具有独特竞争优势的运营体系。这一体系的目的是满足市场的需求,实现各利益相关者价值最大化,并确保企业的长期盈利能力。 商业模式的核…

VbaCompiler 1.6.4 注册分析[1]

VbaCompiler 1.6.4 注册分析[1] 目录VbaCompiler 1.6.4 注册分析[1]说明AboutDialog校验注册文件lambda_check_key_402880parse_key_file_529060 解析注册keyparse_key_534660check_key_header_535091shift_decode_532C99verify_52A520pyps2.5.2版本有多处key3 是否为空校验注册…

最大交换

本题的关键是越往后找到一个最大的数与越靠前的最小的数进行交换。从右往前遍历,找到右边最大数的位置,和左边最小数的位置进行交换 时间复杂度为O(len(num))func maximumSwap(num int) int {numStr := fmt.Sprintf("%d", num)if len(numStr) == 1 {return num}le…

汇编基础,寄存器、指令、函数栈(有栈协程)

ref很好的入门视频教程,基础寄存器和基础指令讲得好,https://www.bilibili.com/video/BV12M4m1o7f6 简化了很多细节,但可以粗略入门,https://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html 也是一个简化版,但是比上一个详细,https://www.cnblogs.com/a…

最大流之上下界可行流

一.无汇源上下界可行流#include<bits/stdc++.h>#define x first #define y second #define endl \n #define int long longusing namespace std;const int N=10010,M=200010,INF=1e15;//根据边的大小,来调整N,M,INFint n,m,S,T; int h[N],e[M],f[M],l[M],ne[M],idx;//l数…

项目中ES踩坑记录

当用到script score query 时,出现java 异常 这种异常多半是对检索出来的数据进行script计算的时候出错了,大多数是空指针异常情况。 解决思路是: 1.在query条件中,将需要script计算的字段的数据过滤掉。比如用到了feature字段进行计算的时候,需要保证feature有值并且是512…

从“bug”到“成就感”——软件工程大冒险

从“bug”到“成就感”——软件工程大冒险 这一学期的《软件工程》简直可以称为我的“技术冒险之旅”。从最初的迷茫,到逐渐掌握核心技能,再到团队合作中的互助与共识,到最后顺利完成项目时的“轻舟已过万重山”,经历了从“bug”到“成就感”的转变,既有汗水,也有欢笑。回…

【AI安全漏洞】VLLM反序列化漏洞分析与保姆级复现(附批量利用)

#CVE-2024-9052环境需要 Linux(这里使用kali)、Anaconda首先安装Anaconda 前言 最好使用linux,如果使用windows可能会产生各种报错(各种各种各种!!!),最好使用Anaconda,方便独立管理虚拟机 使用conda创建虚拟机、python要求3.10 conda create -n vllm_beam python=3.…