Consul

服务发现

服务发现是一种在网络上自动识别和访问设备及服务的方法。这是分布式系统和微服务架构中常见的模式。

Consul

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置,Consul是分布式的、高可用的、可横向扩展的。它具备以下特性:

  • service discovery: consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
  • health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
  • key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作.
  • multi-datacenter: 无需复杂的配置,即可支持任意数量的区域

Consul安装:

Consul用Golang实现,因此具有天然可移植性(支持 Linux、windows和macOS)。安装包仅包含一个可执行文件。
Consul安装非常简单,只需要下载对应系统的软件包并解压后就可使用。

下载安装:

下载链接:https://developer.hashicorp.com/consul/downloads?product_intent=consul

windows使用Consul:

进入consul.exe文件所在目录,进入cmd输入consul agent -dev,执行完成后http://127.0.0.1:8500/进入可视化界面

Linux使用Consul:

按照网址中的命令安装后直接运行

consul

Consul角色介绍与集群命令

Consul角色:

client:客户端,无状态将HTTP 和 DNS 接口请求转发给局域网内的服务端集群,server: 服务端保存配置信息高可用集群在局域网内与本地客户端通讯 通过广域网与其他数据中心通讯每个数据中心的 server 数量推荐为3个或是5个

运行Consul代理:

Consul是典型的C/S架构,可以运行服务模式或客户模式。每一个数据中心必须有至少一个服务节点,3到5个服务节点最好。非常不建议只运行一个服务节点,因为在节点失效的情况下数据有极大的丢失风险。

运行Agent:

完成Consul的安装后必须运行agent.agent可以运行为server或client模式每个数据中心至少必须拥有一台server建议在一个集群中有3或者5个server.部署单一的server,在出现失败时会不可避免的造成数据丢失。

其他的agent运行为client模式一个client是一个非常轻量级的进程用于注册服务,运行健康检查和转发对server的查询agent必须在集群中的每个主机上运行

启动Consul Server:

#node1:
consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=n1 -bind=192.168.105.132 -ui -config-dir=/etc/consul.d -rejoin -join 192.168.105.132 -client 0.0.0.0 -server-port=8300 -serf-lan-port=8301 -serf-wan-port=8302 -http-port=8500 -dns-port=8600
#运行cosnu1,agent以server模式
-server : 定义agent运行在server模式
-bootstrap-expect :在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用
-data-dir:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-ui: 启动web界面
-config-dir::配置文件目录,里面所有以.json结尾的文件都会被加载
-rejoin: 使consu1忽略先前的离开,在再次启动后仍旧尝试加入集群中
-client: consu1服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服
务,如果你要对外提供服务改成0.0.0.0
-server-port=8300 选取Leader节点 (raft协议通信)和提供RPC调用时,consu节点之间的通信端
-serf-lan-port=8301 集群通信端口,用在LAN网
-serf-wan-port=8302 数据中心通信端口,用在WAN网
-http-port=8500 提供http服务的端门
dns-port-8600 提供dns服务的端口
#nade2:
consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=n2 -bind=192.168.105.133 -ui -config-dir=/etc/consul.d -rejoin -client 0.0.0.0 -server-port=8300 -serf-lan-port=8301 -serf-wan-port=8302 -http-port=8500 -dns-port=8600 -join=192.168.105.132:8301
-server: 定义agent运行在server模式
-bootstrapexpect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul-直
等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用
-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-ui: 启动web界面
-rejoin:使consu1忽略先前的离开,在再次启动后仍旧尝试加入集群中
-config-dir::配置文件目录,里面所有以json结尾的文件都会被加载
-client:consu1服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127,0.0.1所以不对外提供服
务,如果你要对外提供服务改成0.0.0.0
-join 192.168.110.121 : 启动时加入这个集群
#nade3:
consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=n3 -bind=192.168.105.134 -ui -config-dir=/etc/consul.d -rejoin -client 0.0.0.0 -server-port=8300 -serf-lan-port=8301 -serf-wan-port=8302 -http-port=8500 -dns-port=8600 -join=192.168.105.132:8301
-server: 定义agent运行在server模式
-bootstrapexpect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul-直
等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用
-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-ui: 启动web界面
-rejoin:使consu1忽略先前的离开,在再次启动后仍旧尝试加入集群中
-config-dir::配置文件目录,里面所有以json结尾的文件都会被加载
-client:consu1服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127,0.0.1所以不对外提供服
务,如果你要对外提供服务改成0.0.0.0
-join 192.168.110.121 : 启动时加入这个集群

启动Consul Client:

#nodew:
consul agent -data-dir=/tmp/consul -node=n4 -bind=192.168.105.135 -config-dir=/etc/consul.d -join=192.168.105.132
运行cosnu] agent以client模式,-join 加入到已有的集群中去

查看集群成员:

$ consul members
Node  Address               Status  Type    Build   Protocol  DC   Partition  Segment
n1    192.168.105.132:8301  alive   server  1.16.2  2         dc1  default    <all>
n2    192.168.105.133:8301  alive   server  1.16.2  2         dc1  default    <all>
n3    192.168.105.134:8301  alive   server  1.16.2  2         dc1  default    <all>
n4    192.168.105.135:8301  alive   client  1.16.2  2         dc1  default    <default>

停止Agent:

$ consul leave

注册服务:

搭建好conus集群后,用户或者程序就能到consul中去查询或者注册服务。可以通过提供服务定义文件或者调用HTTP API来注册一个服务

首先为Consul配置创建一个目录.Consul会载入配置文件夹里的所有配置文件,在Unix系统中通常类似/etc/consul.d(.d 后缀意思是这个路径包合了一组配置文件)

$ mkdir /etc/consul.d

然后,我们将编写服务定义配置文件.假设我们有一个名叫web的服务运行在 10000端口.另外,我们将给他设置一个标
签.这样我们可以使用他作为额外的查询方式

/etc/consul.d下创建一个web.json文件

{
	"service" :{		  #服务
        "name":"web",     #名称
        "tags":["master"], #标记
        "address":"127.0.0.1"#Ip
        "port":10000,		#端口
        "checks":[
        	{
        		"http":"http://localhost:10000/health",#等待检查的URL
        		"interval":"10s"		#检查时间
        	}
        ]
    }
}

测试程序:

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Println("hello this is n2 or n3")
	fmt.Fprintf(w, "hello this is n2 or n3")
}

func healthHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Println("heath check!")
}

func main() {
	http.HandleFunc("/", handler)
	http.HandleFunc("/health", healthHandler)
	http.ListenAndServe(":10000", nil)
}

查询服务:

一旦agent启动并且服务同步了.我们可以通过DNS或者HTTP的API来查询服务

DNS API:

让我们首先使用DNS API来查询,在DNS AP中,服务的DNS名字是 NAMEservice.consul.虽然是可配置的,但默认的所有DNS名字会都在consul命名空间下,这个子域告诉Consul,我们在查询服务,NAME则是服务的名称.对于我们上面注册的Web服务它的域名是 web.service.consul:

$ dig @127.0.0.1-p 8600 web.service.consul

也可用使用 DNS API来接收包合地址和端口的 SRV记录:

$ dig @127.0.0.1 -p 8600 web.service.consul SRV
posted @ 2023-09-27 20:04  CrryG_GPC  阅读(40)  评论(0)    收藏  举报