微服務之consul(一) - 詩碼者 - 博客園

一、概述

consul是google開源的一個使用go語言開發的服務發現、配置管理中心服務。內置了服務注冊與發現框 架、分布一致性協議實現、健康檢查、Key/Value存儲、多數據中心方案,不再需要依賴其他工具(比如ZooKeeper等)。服務部署簡單,只有一個可運行的二進制的包。每個節點都需要運行agent,他有兩種運行模式server和client。每個數據中心官方建議需要3或5個server節點以保證數據安全,同時保證server-leader的選舉能夠正確的進行。

@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集群搭建

1)安裝

首先去官網現在合適的consul包:https://www.consul.io/downloads.html

安裝直接下載zip包,解壓后只有一個可執行的文件consul,將consul添加到系統的環境變量里面。

#unzip?consul_1.2.3_linux_amd64.zip

#cp -a consul? /usr/bin

#consul

復制代碼

Usage: consul [--version] [--help] <command> [<args>]Available commands are:agent          Runs a Consul agentcatalog        Interact with the catalogconnect        Interact with Consul Connectevent          Fire a new eventexec           Executes a command on Consul nodesforce-leave    Forces a member of the cluster to enter the "left" stateinfo           Provides debugging information for operators.intention      Interact with Connect service intentionsjoin           Tell Consul agent to join clusterkeygen         Generates a new encryption keykeyring        Manages gossip layer encryption keyskv             Interact with the key-value storeleave          Gracefully leaves the Consul cluster and shuts downlock           Execute a command holding a lockmaint          Controls node or service maintenance modemembers        Lists the members of a Consul clustermonitor        Stream logs from a Consul agentoperator       Provides cluster-level tools for Consul operatorsreload         Triggers the agent to reload configuration filesrtt            Estimates network round trip time between nodessnapshot       Saves, restores and inspects snapshots of Consul server statevalidate       Validate config files/directoriesversion        Prints the Consul versionwatch          Watch for changes in Consul

復制代碼

?

?輸入consul,出現上面的內容證明安裝成功。

?

2)啟動

consul必須啟動agent才能使用,有兩種啟動模式server和client,還有一個官方自帶的ui。server用與持久化服務信息,集群官方建議3或5個節點。client只用與于server交互。ui可以查看集群情況的。

server:

cn1:

#consul agent? -bootstrap-expect 2? -server? ?-data-dir /data/consul0 -node=cn1 -bind=192.168.1.202 -config-dir /etc/consul.d -enable-script-checks=true? -datacenter=dc1?

cn2:

#consul agent? ? -server? -data-dir /data/consul0 -node=cn2 -bind=192.168.1.201 -config-dir /etc/consul.d -enable-script-checks=true? -datacenter=dc1? -join 192.168.1.202

cn3:

#consul agent? -server? -data-dir /data/consul0 -node=cn3 -bind=192.168.1.200 -config-dir /etc/consul.d -enable-script-checks=true? -datacenter=dc1? -join 192.168.1.202

參數解釋:

-bootstrap-expect:集群期望的節點數,只有節點數量達到這個值才會選舉leader。

-server:?運行在server模式

-data-dir:指定數據目錄,其他的節點對于這個目錄必須有讀的權限

-node:指定節點的名稱

-bind:為該節點綁定一個地址

-config-dir:指定配置文件,定義服務的,默認所有一.json結尾的文件都會讀

-enable-script-checks=true:設置檢查服務為可用

-datacenter:?數據中心沒名稱,

-join:加入到已有的集群中

?

client:

#consul agent? ?-data-dir /data/consul0 -node=cn4 -bind=192.168.1.199 -config-dir /etc/consul.d -enable-script-checks=true? -datacenter=dc1? -join 192.168.1.202

client節點可以有多個,自己根據服務指定即可。

ui:

#consul agent? -ui? -data-dir /data/consul0 -node=cn4 -bind=192.168.1.198? -client 192.168.1.198? ?-config-dir /etc/consul.d -enable-script-checks=true? -datacenter=dc1? -join 192.168.1.202

?-ui:使用自帶的ui,

-ui-dir:指定ui的目錄,使用自己定義的ui

-client:指定web? ui、的監聽地址,默認127.0.0.1只能本機訪問。

集群創建完成后:

使用一些常用的命令檢查集群的狀態:

#consul? info

可以在raft:stat看到此節點的狀態是Fllower或者leader

#consul members

Node Address Status Type Build Protocol DC Segment
cn1 192.168.1.202:8301 alive server 1.0.2 2 dc1 <all>
cn2 192.168.1.201:8301 alive server 1.0.2 2 dc1 <all>
cn3 192.168.1.200:8301 alive client 1.0.2 2 dc1 <default>

新加入一個節點有幾種方式;

1、這種方式,重啟后不會自動加入集群

#consul? join? 192.168.1.202

2、#在啟動的時候使用-join指定一個集群

#consul agent? -ui? -data-dir /data/consul0 -node=cn4 -bind=192.168.1.198 -config-dir /etc/consul.d -enable-script-checks=true? -datacenter=dc1? -join 192.168.1.202

3、使用-startjoin或-rejoin

#consul agent? -ui? -data-dir /data/consul0 -node=cn4 -bind=192.168.1.198 -config-dir /etc/consul.d -enable-script-checks=true? -datacenter=dc1? -rejoin

?

訪問ui:

http://192.168.1.198:8500/ui

端口:

8300:consul?agent服務relplaction、rpc(client-server)

8301:lan?gossip

8302:wan?gossip

8500:http?api端口

8600:DNS服務端口

?

3)服務注冊

采用的是配置文件的方式,(官方推薦)首先創建一個目錄用于存放定義服務的配置文件

#mkdir /etc/consul.d/

啟動服務的時候要使用-config-dir?參數指定。

下面給出一個服務定義:

#cat?web.json

?

復制代碼

{"service":{"name":"web","tags":["rails"],"port":80,"check":{"name":"ping","script":"curl -s localhost:80","interval":"3s"}}
}

復制代碼

?

如果這樣啟動consul后,會發現consul的日志里面一直報錯,因為我們沒有啟動80端口的服務,下面給出我寫的一個go程序:

#cat? web.go

復制代碼

package main
import ("io""log""net/http""strconv""fmt"
)
var iCnt  int = 0;func helloHandler(w http.ResponseWriter, r*http.request)  {iCnt++;str :="Hell eorld ! friend("+ strconv.Itoa(iCnt)+")"io.WriteString(w,str)fmt.Println(str)
}func main(){ht :=http.HanderFunc(helloHandler)if ht != nil {http.Handle("/hello",ht)}err := http.ListenAndServe(":80",nil)if err != nil{log.Fatal("ListenAndserve:",err.Error())}
}

復制代碼

?

?

#需要一個goalong的環境:

#go? build -o? web? web.go

#./web

此時就可以在沒有運行web服務的機器上面執行DNS查詢:

#?dig @127.0.0.1 -p 8600 web.service.consul SRV

;; ANSWER SECTION:
web.service.consul. 0 IN SRV 1 1 80 cn2.node.dc1.consul.
web.service.consul. 0 IN SRV 1 1 80 cn3.node.dc1.consul.

;; ADDITIONAL SECTION:
cn2.node.dc1.consul. 0 IN A 192.168.1.201
cn2.node.dc1.consul. 0 IN TXT "consul-network-segment="
cn3.node.dc1.consul. 0 IN A 192.168.1.200
cn3.node.dc1.consul. 0 IN TXT "consul-network-segment="

;; Query time: 17 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: 四 1月 04 14:39:32 CST 2018
;; MSG SIZE rcvd: 229

可以看到服務已經注冊到集群里面了。?

使用dns查詢,默認域名格式NAME.service.consul,NAME就是web.json里面定義的service的name。可以自己指定域和端口:-domain、-dns-port 53?

為了方便使用consul集群的注冊使用,所以寫了一個三節點client的注冊腳本,方便統一注冊服務和管理。還利用到了nfs,將服務文件共享到集群。

復制代碼

#!/usr/bin/env python
#encoding: utf8
#decription: registered a service to consul
from subprocess import call
import syshosts = {"b1":"10.10.1.01:8500","b2":"10.10.7.1:8500","b3":"10.10.8.21:8500"}def consul_relaod():if (len(sys.argv) != 2) or sys.argv[1] == '-h':print(("Usage: {0} [option] :{1} ,if you wang update all of them,you must use 'all'").format(sys.argv[0],hosts.keys()))sys.exit()elif(sys.argv[1] == 'all'):for i in hosts.keys():call(("consul reload -http-addr {}").format(hosts[i]),shell=True)else:call(("consul reload -http-addr {}").format(hosts[sys.argv[1]]),shell=True)if __name__ == '__main__':consul_relaod()

復制代碼

hosts是client節點列表。可以只注冊其中的一個節點,輸入hosts中對應的key,也可以輸入all,注冊到所有節點;nfs共享的是/etc/consul.d目錄。

4)健康檢查

check使用來做服務的健康檢查的,可以擁有多個,也可以不使用支持多種方式檢查。check必須是script或者TTL類型,如果是TTL類型則ttl變量必須被提供。script是consul主動去檢查服務的健康狀況,ttl是服務主動向consul報告自己的狀況。新版本的consul不在使用script來表示,使用args,如果是https服務的健康檢查,可以使用args這種腳本的方式實現,因為consul默認不支持https的健康檢查。

script?check:

"check": {

? ? "args": ["/data/scripts/kubeadm-ha-0.sh",""],

? ? "interval": "10s"

}

?

http check:

{

? "check": {

? ? ? ?"id": "api",

? ? ? ?"name": "HTTP API? 500",

? ? ? ?"http": "http://loclhost:500/health",

? ? ? ? "interval": "10s",

? ? ? ? "timeout": "1s"

}

}

?

tcp? check:

{

? "check": {

? ? ? "id": "ssh",

? ? ? "name": "ssh TCP 26622",

? ? ? "tcp": "localhost:26622",

? ? ? "interval": "10s",

? ? ? "timeout": "1s"

?}

}

?

ttl? check:

{

? ?"check": {

? ? ? ?"id": "web-app",

? ? ? ?"name": "Web APP status",

? ? ? ?"notes": "Web APP does a curl? internally every 10 seconds",

? ? ? ?"ttl": "30s"

}

}

?

三、更新consul版本為最新版本1.2.3.

版本更新特性:

https://github.com/hashicorp/consul/blob/v1.2.3/CHANGELOG.md

復制代碼

FEATURES:agent: New Cloud Auto-join provider: Kubernetes (K8S) [GH-4635]
http: Added support for "Authorization: Bearer" head in addition to the X-Consul-Token header. [GH-4483]
dns: Added a way to specify SRV weights for each service instance to allow weighted DNS load-balancing. [GH-4198]
dns: Include EDNS-ECS options in EDNS responses where appropriate: see RFC 7871 [GH-4647]
IMPROVEMENTS:ui: Switch to fullscreen layout for lists and detail, left aligned forms [GH-4435]
connect: TLS certificate readiness now performs x509 certificate verification to determine whether the cert is usable. [GH-4540]
ui: The syntax highlighting/code editor is now on by default [GH-4651]
ui: Fallback to showing Node.Address if Service.Address is not set [GH-4579]

復制代碼

ui較之前有很大改變:

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248854.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248854.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248854.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#動態加載dll,dll目錄指定

<?xml version"1.0"?><configuration><startup> <supportedRuntime version"v4.0" sku".NETFramework,Versionv4.0"/></startup> <runtime> <assemblyBinding xmlns"urn:schemas-microsoft-com:a…

RestFramework之認證組件

一、認證組件的介紹 對于認證&#xff0c;我們一般有三種方式&#xff0c;即cookie, session,token, cookie,是將信息存放在客戶端(瀏覽器上)&#xff0c;信息不安全&#xff1b;session,把信息放在服務器數據庫中&#xff0c;但是要是信息量較大&#xff0c;對服務器的壓力就會…

圖解基于 Node.js 實現前后端分離 - CSDN博客

因為會上出了個意外&#xff0c;ppt圖片全部丟失&#xff0c;只好對著白板跟大家交流了半個多小時。由于我做演講不喜歡寫太多的文字&#xff0c;沒有圖片的情況下講漏了一些內容。這篇文章是我在會上分享內容對照ppt進行地整理。 基本介紹 首先從一個重要的概念“模板”說起…

java基礎之XML

目錄 java基礎之XML1. XML解析概述2. DOM4J介紹2.1 常用包2.2 內置元素2.2 Element類2.3 Attribute類2.4 常用操作3. 代碼演示3.1 DOM4J讀取xml文件3.2 DOM4J創建xml文件3.2 DOM4J修改xml文件java基礎之XML XML是一種通用的數據交換格式,它的平臺無關性、語言無關性、系統無關性…

CF176E Archaeology(set用法提示)

題目大意&#xff1a; 給一棵樹&#xff0c;每次激活或熄滅一個點&#xff0c;每次問這些點都聯通起來所需的最小總邊權 分析&#xff1a; 若根據dfs序給所有點排序&#xff0c;為$v1,v2,v3....vk$&#xff0c;那么答案就是$(dis(v1,v2)dis(v2,v3)...dis(vk-1,vk)dis(vk,v1))/2…

網上整理的對于Rest和Restful api的理解 - 那啥快看 - 博客園

一、什么是Rest? REST不是"rest"這個單詞&#xff0c;而是幾個單詞縮寫 -- REpresentational State Transfer 直接翻譯&#xff1a;表現層狀態轉移&#xff0c;但這個翻譯正常人根本看不懂&#xff0c;找到的一種最好理解的說法是&#xff0c;URL定位資源&#xff…

P1101 單詞方陣(DFS)

題目描述 給一n \times nnn的字母方陣&#xff0c;內可能蘊含多個“yizhong”單詞。單詞在方陣中是沿著同一方向連續擺放的。擺放可沿著 88個方向的任一方向&#xff0c;同一單詞擺放時不再改變方向&#xff0c;單詞與單詞之間可以交叉,因此有可能共用字母。輸出時&#xff0c;…

企業級rancher搭建Kubernetes(采用rancher管理平臺搭建k8s)

一、簡介 Rancher簡介 來源官方&#xff1a;https://www.cnrancher.com/ Rancher是一個開源的企業級容器管理平臺。通過Rancher&#xff0c;企業再也不必自己使用一系列的開源軟件去從頭搭建容器服務平臺。Rancher提供了在生產環境中使用的管理Docker和Kubernetes的全棧化容器部…

[工具]java_sublime的快速使用

目錄 使用 : 怎么運行: 調整字體: 使用 : 新建--->寫好代碼后-->另存為尾綴是.java的文件 怎么運行: 在你另存為的目錄下cmd調用控制臺輸入dos指令--->執行javac 文件名.java(有.java尾綴)(編譯為.class文件)--->java 文件名(沒有.class尾綴設計者認為執行的是…

基于SOA的銀行系統架構

Part-1 【簡述】 1.通過引入面向服務架構&#xff08;SOA&#xff09;&#xff0c;企業服務總線&#xff08;ESB&#xff09;&#xff0c;適配器&#xff08;Adapter&#xff09;及面向構件等技術&#xff0c;嘗試打造一個統一業務流程服務平臺&#xff0c;實現面向流程的服務…

一次前后端分離的實踐

前后端分離該如何做? 這個問題&#xff0c;不同的技術人員&#xff0c;由于所處的崗位不一樣&#xff0c;給出的答案都不一樣。 前后端分離的問題&#xff0c;不僅僅是技術上的選型問題&#xff0c;還涉及到整個團隊在認知、職責、流程上面重新定義的問題&#xff0c;這也是為…

queryList爬蟲獲取內容的幾種方法總結 queryList給抓取的內容增加html追加元素html 代碼實例...

//簡略內容: 1. $data1 $ql->find(.two img)->map(function($item){return $item->alt; }); // 等價下面這句話 $data2 $ql->find(.two img)->attrs(alt);2. $texts $ql->find(.two>a)->texts(); $htmls $ql->find(#one span)->htmls();3. $…

C++解析-外傳篇(1):異常處理深度解析

0.目錄 1.異常的最終處理 2.結束函數terminate() 3.小結 1.異常的最終處理 問題&#xff1a; 如果在main函數中拋出異常會發生什么&#xff1f; 如果異常不處理&#xff0c;最后會傳到哪里&#xff1f; 下面的代碼的輸出什么&#xff1f; 示例——異常的最終處理&#xff1f;&a…

《淺談架構之路:前后端分離模式》 - 山人行 - 博客園

前言&#xff1a;分離模式 對前后端分離研究了一段時間&#xff0c;恰逢公司有一個大項目決定嘗試使用前后端分離模式進行&#xff0c;便參與其中。該項目從2016年初立項至今&#xff0c;平平穩穩得度過&#xff0c;但也涌現出越來越多的問題&#xff0c;絕對不是說前后端分離模…

springboot快速集成swagger

今天技術總監說&#xff1a;小明&#xff0c;我們本次3.0改造&#xff0c;使用swagger2.0作為前后端分離的接口規范&#xff0c;它可以一鍵生成前后端的API,一勞永逸……小明&#xff1a;&#xff1f;&#xff1f;&#xff1f; Spring Boot 框架是目前非常流行的微服務框架&…

php curl處理get和post請求

CURL 是一個利用URL語法規定來傳輸文件和數據的工具&#xff0c;支持很多協議&#xff0c;如HTTP、FTP、TELNET等。最爽的是&#xff0c;PHP也支持 CURL 庫。使用PHP的CURL 庫可以簡單和有效地去抓網頁。你只需要運行一個腳本&#xff0c;然后分析一下你所抓取的網頁&#xff0…

【Web】JavaWeb項目為什么我們要放棄jsp?為什么要前后端解耦?為什么要前后端分離?2.0版,為分布式架構打基礎。 - CSDN博客

前戲 前后端分離已成為互聯網項目開發的業界標準使用方式&#xff0c;通過nginxtomcat的方式&#xff08;也可以中間加一個nodejs&#xff09;有效的進行解耦&#xff0c; 并且前后端分離會為以后的大型分布式架構、彈性計算架構、微服務架構、多端化服務&#xff08;多種客戶…

MongoDB升級導致啟動失敗

起因 最近項目使用MongoDB,但是作為一個技術菜鳥&#xff0c;NoSQL數據庫我還真不會用&#xff0c;于是我就在自己的阿里云服務器上安裝了一個MongoDB4.0.9。 現象 但是當我使用yum -y update升級以后&#xff0c;MongoDB無法啟動了&#xff0c;即使重裝刪除了MongDB的文件了還…

測者的測試技術手冊:揭開java method的一個秘密--巨型函數

揭開java method的一個秘密&#xff1a;巨型函數 相信&#xff0c;很多人都不知道Java的Method的上限為64K。本文將超過這個上限的函數叫做巨型函數。 巨型函數的問題 1、如果代碼超過了這個限制&#xff0c;Java編譯器就報"Code too large to complier"的錯誤。 2、…

前端攻略系列(二) - 前端各種面試題

幸運且光榮的被老大安排了一個任務 - “去整理些前端面試題”。年前確實不是招人的好時候&#xff0c;所以我們前端團隊經過了超負荷的運轉&#xff0c;終于堅持過了春節。春節以后就開始招人啦&#xff0c;這套題考察的目標就是基礎基礎再基礎&#xff0c;嘿嘿。 事先聲明&…