網站首頁 編程語言 正文
常用指令
agent指令
- -bind=0.0.0.0 指定consul所在機器的ip地址
- -http-port 指定web接口服務端口
- -client 指定哪些機器可以訪問consul, 0.0.0.0表示所有機器
- -data-dir=path 指定服務數據文件存儲位置
- -dev 開發者模式,直接以默認模式啟動consul
- -node=hostname 服務發現的名字
- -rejoin consul啟動的時候,加入到的consul集群
- -server 以服務方式開啟server, 允許其他的consul連接到開啟的consul上,不加則以客戶端方式開啟
- -ui 可以誰用web頁面來查看服務發現的詳情
- -config-dir 配置文件地址, 如果是文件夾會將所有文件合并,里面可以配置自己所在節點提供的服務
- -bootstrap-expect 在一個集群中期望提供的server節點數目,當該值提供時, consul一直等到達到指定的server數目才會參加選舉,推舉自己為leader。這個可以避免不一致和腦裂現象
啟動
consul agent -server -bootstrap-expect 1 -ui -rejoin -http-port=8080 -bind="127.0.0.1" -data-dir C:\Windows\tmp
members
查看集群中有多少成員
info
查看當前系欸但信息
leave
優雅關閉consul
reload
重新加載配置文件
常用功能
Consul最重要的的功能就是定義服務, 服務管理和健康檢查
定義服務
要定義一個服務, 有兩種方式:
- 通過寫配置文件, 讓Consul讀取
- 通過接口向Consul服務進行注冊
一般我們采用第二種方式, 但我們可以通過第一種方式的書寫規則來了解服務定義的一些選項
我們可以通過啟動時指定-config-dir
來指定配置文件所在位置, 配置文件時json格式, 有多個會合并在一起
例子:
{ "service": { "name": "redis", // 在consul面板上顯示的服務名 "id": "redis", // 服務id, 一般通過服務id對服務進行管理, 若不指定則會使用name作為id "address": "127.0.0.1", // 服務地址 "port": 80, // 服務運行的端口 "tags": [ "primary" ], // 服務的標簽, 可以作為服務的額外信息 // 服務健康檢查, 后面介紹 "checks": [ { "args": [ "/bin/check_redis", "-p", "7000" ], "interval": "30s", "timeout" : "60s" } ] } }
服務管理
所謂服務管理就是指服務發現\服務注冊\服務注銷
consul服務端均提供了相應的http\dns等方式的接口可以方便地操作,
一般我們用go是用官方提供的一個api
庫進行操作, 對這些http的接口就不再過多贅述, 可以查閱官方文檔
Consul API
服務健康檢查
健康檢查是為了避免服務突然宕機而調用方不知道的情況發生, 原理就是隔一段時間通信一次
consul提供了 tcp\ssl\ttl\udp\script\http等多種方式來進行健康檢查,可以在服務注冊時指定健康檢查的方式
consul根據interval
變量來決定多少時間間隔來通訊
根據timeout
變量來決定發送請求后多久未收到回應算作失敗
這里我們介紹三種, http|tcp|script方式
http方式
{ "check": { "id": "api", "name": "HTTP API on port 5000", "http": "https://localhost:5000/health", //調用接口 "method": "POST", "header": { "Content-Type": ["application/json"] }, "body": "{\"method\":\"health\"}", "interval": "10s", // "timeout": "1s" } }
tcp方式
{ "check": { "id": "ssh", "name": "SSH TCP on port 22", "tcp": "localhost:22", "interval": "10s", "timeout": "1s" } }
script腳本方式
腳本方式略有不同,原理是通過調用腳本,查看腳本的返回值來判斷健康檢查是否通過
腳本退出代碼為 0 : 通過健康檢查
1 : 警告 其他: 健康檢查失敗
{ "check": { "id": "mem-util", "name": "Memory utilization", "args": ["/usr/local/bin/check_mem.py", "-limit", "256MB"], // 會被拼成 /usr/local/bin/check_mem.py -limit 256MB 來進行調用 "interval": "10s", "timeout": "1s" } }
grpc方式
檢查grpc整個server狀態
{ "check": { "id": "mem-util", "name": "Service health status", "grpc": "127.0.0.1:12345", "grpc_use_tls": true, //是否使用tls, 默認不使用 "interval": "10s" } }
只檢查服務器上的某一個服務
{ "check": { "id": "mem-util", "name": "Service health status", "grpc": "127.0.0.1:12345/my_service", "grpc_use_tls": true, "interval": "10s" } }
go使用官方api包來定義服務\查詢服務
console的github官網提供了一個go包操作consul服務端的實現, 我們可以使用這個包來實現服務發現
那么編寫一個使用consul注冊服務的服務端程序的核心邏輯是這樣:
- 創建consul客戶端
- 使用創建的consul客戶端連接相應的consul agent
- 向consul注冊服務
- 運行服務
- 運行完畢后向consul注銷服務
示例代碼:
package main import ( "log" "net" "github.com/hashicorp/consul/api" ) func main() { // 使用默認配置創建consul客戶端 consulClient, err := api.NewClient(api.DefaultConfig()) if err != nil { log.Fatal(err) } // 注冊服務 // consulClient.Agent()先獲取當前機器上的consul agent節點 consulClient.Agent().ServiceRegister(&api.AgentServiceRegistration{ ID: "MyService", Name: "My Service", Address: "127.0.0.1", Port: 5050, Check: &api.AgentServiceCheck{ CheckID: "MyService", TCP: "127.0.0.1:5050", Interval: "10s", Timeout: "1s", }, }) // 運行完成后注銷服務 defer consulClient.Agent().ServiceDeregister("MyService") l, err := net.Listen("tcp", ":5050") if err != nil { log.Fatal(err) } for { conn, err := l.Accept() if err != nil { log.Fatal(err) } go func() { log.Printf("Ip: %s connected", conn.RemoteAddr().String()) }() } }
我們通過tcp每10秒進行健康檢查, 輸出窗口每10秒就會輸出有新連接到來, 這是consul做的
$ go run .
2022/06/09 20:17:51 Ip: 127.0.0.1:53011 connected
2022/06/09 20:18:01 Ip: 127.0.0.1:53038 connected
2022/06/09 20:18:11 Ip: 127.0.0.1:53045 connected?
那么服務的請求端(客戶端)需要通過consul來獲取服務的地址和端口,則需要這么幾步:
- 創建consul客戶端
- 使用創建的consul客戶端連接相應的consul agent
- 向consul請求相應服務id的注冊信息
- 如果獲取到了相應的注冊信息, 就通過地址和端口請求服務
代碼示例:
package main import ( "fmt" "log" "github.com/hashicorp/consul/api" ) func main() { consulClient, err := api.NewClient(api.DefaultConfig()) if err != nil { log.Fatal(err) } service, _, err := consulClient.Agent().Service("MyService", nil) if err != nil { log.Fatal(err) } fmt.Printf("Got Service: ip-%s, port-%d", service.Address, service.Port) }
保證服務端運行的情況運行客戶端:
$ go run .
Got Service: ip-127.0.0.1, port-5050
Consul使用Raft算法保證集群一致性
原文鏈接:https://blog.csdn.net/qq_35621436/article/details/125210475
相關推薦
- 2022-05-29 在Linux系統上安裝PostgreSQL數據庫_PostgreSQL
- 2022-10-07 C語言順序查找算法介紹及示例_C 語言
- 2023-02-07 C#實現自定義屏保的示例代碼_C#教程
- 2022-11-27 Git基礎學習之文件刪除操作命令詳解_相關技巧
- 2022-08-10 讀取Go項目中的配置文件的方法_Golang
- 2022-03-28 C語言怎么連接兩個數組的內容你知道嗎_C 語言
- 2023-03-20 C#中程序自刪除實現方法_C#教程
- 2022-05-22 ansible管理工具的環境及部署安裝_服務器其它
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支