<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
consul是一個開源服務註冊和服務發現的中心,可以用於微服務的註冊和服務之間的呼叫的發現,幫助上游服務找到下游服務的具體ip:port或者是domain,也可以使用dns的方式讓consul幫你去做轉發,具體介紹請看consul的官網,consul區分server-agent和client-agent,client-agent的作用一般來說就是用來轉發到server-agent的,所以本文只啟動server-agent,他們的詳細差距可以在google上查到,本文基於golang實現一個服務註冊和服務發現的demo。demo地址
consul有兩種部署模式,一種是直接在cvm上安裝consul的bin包,然後以server-agent的模式進行啟動,一種是用docker直接啟動映象,本文直接使用docker啟動映象,將這個映象的啟動引數設定為server-agent,在這種模式下,如果要使用服務發現的功能需要區分主機ip和容器ip 不能使用127.0.0.1這種ip去讓server維持go服務的心跳
本文使用的cvm系統為centos8,其他Linux發行版可以自行用包管理工具去安裝一下的前置依賴
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl start docker
使用上文指令碼一鍵安裝docker
docker pull consul
docker run -d -p 8500:8500 -v ~/consul:/consul/data -e CONSUL_BIND_INTERFACE='eth0' --name=consul1 consul agent -server -bootstrap -ui -client='0.0.0.0'
兩步啟動一個consul的server-agent,然後就可以通過ip:8500存取得到consul的一個web介面,如果ip存取不通可以使用下文的vscode的代理模式去存取或者是在自己廠商的cvm控制檯去開埠的存取策略,web介面如下
建立一個go專案
mkdir consul_demo
go mod init consul_demo
go get -u github.com/hashicorp/consul/api
touch main.go
// main.go package main import ( "bufio" "fmt" "net" consulapi "github.com/hashicorp/consul/api" ) type DiscoveryConfig struct { ID string Name string Tags []string Port int Address string } var consulAddress = "127.0.0.1:8500" func RegisterService(dis DiscoveryConfig) error { config := consulapi.DefaultConfig() config.Address = consulAddress client, err := consulapi.NewClient(config) if err != nil { fmt.Printf("create consul client : %vn", err.Error()) } registration := &consulapi.AgentServiceRegistration{ ID: dis.ID, Name: dis.Name, Port: dis.Port, Tags: dis.Tags, Address: dis.Address, } // 啟動tcp的健康檢測,注意address不能使用127.0.0.1或者localhost,因為consul-agent在docker容器裡,如果用這個的話, // consul會存取容器裡的port就會出錯,一直檢查不到範例 check := &consulapi.AgentServiceCheck{} check.TCP = fmt.Sprintf("%s:%d", registration.Address, registration.Port) check.Timeout = "5s" check.Interval = "5s" check.DeregisterCriticalServiceAfter = "60s" registration.Check = check if err := client.Agent().ServiceRegister(registration); err != nil { fmt.Printf("register to consul error: %vn", err.Error()) return err } return nil } func startTcp() { ls, err := net.Listen("tcp", ":10111") if err != nil { fmt.Printf("start tcp listener error: %vn", err.Error()) return } for { conn, err := ls.Accept() if err != nil { fmt.Printf("connect error: %vn", err.Error()) } go func(conn net.Conn) { _, err := bufio.NewWriter(conn).WriteString("hello consul") if err != nil { fmt.Printf("write conn error: %vn", err) } }(conn) } } func main() { ch := make(chan error) dis := DiscoveryConfig{ ID: "9527", Name: "main_service", Tags: []string{"a", "b"}, Port: 10111, Address: "192.168.0.124", //通過ifconfig檢視本機的eth0的ipv4地址 } go startTcp() RegisterService(dis) // 阻塞等待 <-ch }
然後我們執行這個程式碼
go run main.go
就可以看到consul的web介面上多了一個服務範例
如果不使用tcp作為健康檢查的方式,可以使用Http_server去實現,邏輯是一樣的,需要給consul返回一個訊息,讓consul確認你的心跳即可
check := &consulapi.AgentServiceCheck{} check.HTTP = fmt.Sprintf("http://%s:%d/", registration.Address, registration.Port)
func startHttp() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Printf("consul get uri: %sn", r.RequestURI) w.Write([]byte("hello consul")) }) if err := http.ListenAndServe(":10111", nil); err != nil { fmt.Printf("start http server error: %vn", err) } }
go startHttp()
服務發現其實就是通過http請求向consul請求指定的service下的範例,獲取到他們對應的ip:port和一些其他的元資訊,然後在使用者端根據需要篩選得出一個ip:port的範例進行通訊,由於向consul發起http請求的sdk已經在consul官方實現了,所以我們不需要自己建一個httpclient去呼叫這些api,而是直接構建一個struct交給sdk去查詢即可
package main import ( "fmt" "testing" consulapi "github.com/hashicorp/consul/api" ) func Discovery(serviceName string) []*consulapi.ServiceEntry { config := consulapi.DefaultConfig() config.Address = "127.0.0.1:8500" client, err := consulapi.NewClient(config) if err != nil { fmt.Printf("consul client error: %v", err) } service, _, err := client.Health().Service(serviceName, "", false, nil) if err != nil { fmt.Printf("consul client get serviceIp error: %v", err) } return service } func TestDiscoeryFromConsul(t *testing.T) { t.Logf("client discovery start") se := Discovery("main_service") for i := 0; i < len(se); i++ { t.Logf("the instance Node is %+vn", se[i].Node) t.Logf("the isntance Service is %+vn", se[i].Service) t.Logf("n") } }
ut的結果如下,證明我們通過consul找到了下游服務的ip:port即可發起通訊
[root@hecs-74066 consul_demo]# go test -v main_test.go
=== RUN TestDiscoeryFromConsul
main_test.go:25: client discovery start
main_test.go:28: the instance Node is &{ID:278ba4f1-0309-fc92-d641-a312b5797779 Node:241f8a20d7fb Address:172.17.0.2 Datacenter:dc1 TaggedAddresses:map[lan:172.17.0.2 lan_ipv4:172.17.0.2 wan:172.17.0.2 wan_ipv4:172.17.0.2] Meta:map[consul-network-segment:] CreateIndex:13 ModifyIndex:16 Partition: PeerName:}
main_test.go:29: the isntance Service is &{Kind: ID:9527 Service:main_service Tags:[a b] Meta:map[] Port:10111 Address:192.168.0.124 SocketPath: TaggedAddresses:map[lan_ipv4:{Address:192.168.0.124 Port:10111} wan_ipv4:{Address:192.168.0.124 Port:10111}] Weights:{Passing:1 Warning:1} EnableTagOverride:false CreateIndex:43 ModifyIndex:43 ContentHash: Proxy:0xc0000c44d0 Connect:0xc000091a50 PeerName: Namespace: Partition: Datacenter:}
main_test.go:30:
--- PASS: TestDiscoeryFromConsul (0.00s)
到此這篇關於一文詳解Golang中consul的基本使用的文章就介紹到這了,更多相關Golang consul內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45