負載均衡
consul 是 hashicorp 公司推出的開源工具,用於實現分布式系統的服務發現與配置。與其他分布式服務註冊與發現的方案,consul的方案更「一站式」,內建了服務註冊與發現框 架、具有以下性質:
分布一致性協議實現、
健康檢查、
key/value儲存、
多資料中心方案,
不再需要依賴其他工具(比如zookeeper等)。
使用起來也較 為簡單。consul使用go語言編寫,因此具有天然可移植性(支援linux、windows和mac os x);安裝包僅包含乙個可執行檔案,方便部署,與docker等輕量級容器可無縫配合 。
基於 mozilla public license 2.0 的協議進行開源. consul 支援健康檢查,並允許 http 和 dns 協議呼叫 api 儲存鍵值對.
一致性協議採用 raft 演算法,用來保證服務的高可用. 使用 gossip 協議管理成員和廣播訊息, 並且支援 acl 訪問控制.
這裡使用consul,當然用etcd等也ok
詳細內容參見官網文件:
首先搭建乙個註冊中心,可以直接docker起,這裡部署乙個單節點
sudo docker run --name=consul -itd -p 8500:8500 consul agent -server -bootstrap -ui -client 0.0.0.0
執行結果如下
說明:
測試訪問虛擬機器位址加8500埠即可訪問consul介面,此時還沒有任何資料
其餘略,參考官方文件:
go get github.com/hashicorp/consul/api
**註冊的本質還是http請求,但是consul自帶的api包幫我們實現很多功能,不bb,上**
首先宣告乙個控制類,並實現連線consul服務的方法
type consulcontrl struct
func
connconsul
(addr string)(
*consulcontrl,
error
)
服務註冊
這裡我自己寫了乙個預設的配置
func
(c * consulcontrl)
regist
(config *api.agentserviceregistration)
error
else
, port:
666,
address:
"192.168.10.106"
, enabletagoverride:
false
, meta:
map[
string
]string
, weights:
&api.agentweights
, check:
&api.agentservicecheck,}
}var err error
if err = c.client.
agent()
.serviceregister
(c.config)
;err!=
nilreturn
nil}
服務反註冊func
(c * consulcontrl)
deregister()
error
拉取服務listfunc
(c*consulcontrl)
servicelist()
(map
[string
]*api.agentservice,
error
)
服務發現//consul方法
func
(c *consulcontrl)
getserviceconfiguration
(serverid string)(
*api.agentservice,
error
)//結合gokit的服務發現
//返回乙個發現例項,引用:github.com/go-kit/kit/sd/consul
func
(c * consulcontrl)
getinstancer
(service string
,tage [
]string
)*consul.instancer
測試**go
func()
if s.
regist
(nil)!=
nil list,err :=s.
servicelist()
if err!=
nil fmt.
printf
("%v\n"
,*list[
"mytestserver"])
self ,err := s.
getserviceconfiguration
("mytestserver"
)if err!=
nil fmt.
printf
("%v\n"
,self)
s.deregister()}()
輸出列印
結合服務發現,寫乙個建立負載均衡的方法
//新增引用 kithttp "github.com/go-kit/kit/transport/http"
)//newclient建立乙個http的客戶端,先編碼函式,再解碼函式,和server相反
}//結合服務發現建立負載均衡
//第乙個引數中的util.defaultconsul是consulcontrl
per:= sd.
newendpointer
(util.defaultconsul.
getinstancer
(service,tag)
,f,logf)
//建立輪詢負載均衡
return lb.
newroundrobin
(per)
//建立隨機負載均衡
//return lb.newrandom(per,time.now().unixnano())
}
生成乙個子服務的負載均衡
//連線consul後,建立負載均衡
)
使用這個負載均衡
//具體的業務呼叫
func
(u *userservice)
getname
(userid int
)string
//執行這個方法
resp,err:=
end(context.
background()
,nil
)if err!=
nilreturn resp.
(string
)}
未完待續 微服務2,3,4 註冊與發現
格物致知,格註冊與發現。服務發現承載服務提供與消費者之間的橋梁,各個微服務與服務發現元件使用心跳機制進行通訊。服務發現元件如果長時間無法與某微服務例項通訊,就會登出該例項。spring cloud提供了多種服務發現元件的支援,如eureka,consul 和 zookeeper等 單節點eureka...
微服務 Consul(服務註冊發現)
類似dns伺服器會根據我們的網域名稱解析出乙個ip位址,然後去請求這個ip來獲取我們想要的資料,它可以讓我們只需說我想要什麼服務即可,而不必去關心服務提供者的具體網路位置 ip 位址 埠等 目前,服務發現主要分為兩種模式,客戶端模式與服務端模式 在客戶端模式下,首先要到服務註冊中心獲取服務列表,然後...
聊聊微服務的服務註冊與發現
摘要 乙個好的服務註冊發現中介軟體,應該是能完整地滿足服務開發和治理的基礎功能,然後才是效能和高可用。如果沒有想清楚前面的功能,再高的可用性和效能都是浮雲。最後,安全也同樣重要。下面將從 服務註冊 服務發現 容災和高可用三個大方面來回答這些問題的主流做法。聊起微服務的服務註冊與發現,很多人立馬就會脫...