go kit微服務,服務註冊與發現,負載均衡(二)

2021-10-07 06:34:52 字數 4576 閱讀 6598

負載均衡

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

拉取服務list
func

(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 位址 埠等 目前,服務發現主要分為兩種模式,客戶端模式與服務端模式 在客戶端模式下,首先要到服務註冊中心獲取服務列表,然後...

聊聊微服務的服務註冊與發現

摘要 乙個好的服務註冊發現中介軟體,應該是能完整地滿足服務開發和治理的基礎功能,然後才是效能和高可用。如果沒有想清楚前面的功能,再高的可用性和效能都是浮雲。最後,安全也同樣重要。下面將從 服務註冊 服務發現 容災和高可用三個大方面來回答這些問題的主流做法。聊起微服務的服務註冊與發現,很多人立馬就會脫...