go使用consul實現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實現(xiàn)詳解
使用consul四大特性
1. 服務(wù)發(fā)現(xiàn):利用服務(wù)注冊,服務(wù)發(fā)現(xiàn)功能來實現(xiàn)服務(wù)治理。
2. 健康檢查:利用consul注冊的檢查檢查函數(shù)或腳本來判斷服務(wù)是否健康,若服務(wù)不存在則從注冊中心移除該服務(wù),減少故障服務(wù)請求。
3. k/v數(shù)據(jù)存儲:存儲kv數(shù)據(jù),可以作為服務(wù)配置中心來使用。
4. 多數(shù)據(jù)中心:可以建立多個consul集群通過inter網(wǎng)絡(luò)進行互聯(lián),進一步保證數(shù)據(jù)可用性。
通過docker安裝consul
docker pull consul:latest //運行單機 docker run -d --restart=always --name consul -d -p 8500:8500 consul /* 8500 http 端口,用于 http 接口和 web ui 8300 server rpc 端口,同一數(shù)據(jù)中心 consul server 之間通過該端口通信 8301 serf lan 端口,同一數(shù)據(jù)中心 consul client 通過該端口通信 8302 serf wan 端口,不同數(shù)據(jù)中心 consul server 通過該端口通信 8600 dns 端口,用于服務(wù)發(fā)現(xiàn) -bbostrap-expect 2: 集群至少兩臺服務(wù)器,才能選舉集群leader -ui:運行 web 控制臺 -bind: 監(jiān)聽網(wǎng)口,0.0.0.0 表示所有網(wǎng)口,如果不指定默認未127.0.0.1,則無法和容器通信 -client : 限制某些網(wǎng)口可以訪問 */ //集群 docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul:latest agent -server -bootstrap-expect 2 -ui -bind=0.0.0.0 -client=0.0.0.0 docker run --name consul2 -d -p 8501:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.2 docker run --name consul2 -d -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.2
實現(xiàn)代碼
以下代碼實現(xiàn)一個服務(wù)注冊,服務(wù)發(fā)現(xiàn),配置共享的功能:
package main
import (
"net"
"github.com/gin-gonic/gin"
"fmt"
"log"
"net/http"
consulapi "github.com/hashicorp/consul/api"
)
const (
consulAddress = "192.168.100.19:8500"
serviceId = "111"
)
func main() {
r := gin.Default()
// consul健康檢查回調(diào)函數(shù)
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "ok",
})
})
go http.ListenAndServe(":8081", r)
// 注冊服務(wù)到consul
ConsulRegister()
// 從consul中發(fā)現(xiàn)服務(wù)
ConsulFindServer()
ConsulCheckHeath()
ConsulKVTest()
// 取消consul注冊的服務(wù)
//ConsulDeRegister()
var str string
fmt.Scan(&str)
}
// 注冊服務(wù)到consul
func ConsulRegister() {
// 創(chuàng)建連接consul服務(wù)配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
// 創(chuàng)建注冊到consul的服務(wù)到
registration := new(consulapi.AgentServiceRegistration)
registration.ID = serviceId // 服務(wù)節(jié)點的名稱
registration.Name = "go-consul-test" // 服務(wù)名稱
registration.Port = 8081 // 服務(wù)端口
registration.Tags = []string{"go-consul-test"} // tag,可以為空
registration.Address = "192.168.3.42" // 服務(wù) IP 要確保consul可以訪問這個ip
// 增加consul健康檢查回調(diào)函數(shù)
check := new(consulapi.AgentServiceCheck)
check.HTTP = fmt.Sprintf("http://%s:%d", registration.Address, registration.Port)
check.Timeout = "5s"
check.Interval = "5s" // 健康檢查間隔
check.DeregisterCriticalServiceAfter = "30s" // 故障檢查失敗30s后 consul自動將注冊服務(wù)刪除
registration.Check = check
// 注冊服務(wù)到consul
err = client.Agent().ServiceRegister(registration)
if err == nil {
fmt.Println("ConsulRegister done")
}
}
// 取消consul注冊的服務(wù)
func ConsulDeRegister() {
// 創(chuàng)建連接consul服務(wù)配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
client.Agent().ServiceDeregister(serviceId)
}
// 從consul中發(fā)現(xiàn)服務(wù)
func ConsulFindServer() {
// 創(chuàng)建連接consul服務(wù)配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
// 獲取所有service
services, _ := client.Agent().Services()
for _, value := range services {
fmt.Println("address:", value.Address)
fmt.Println("port:", value.Port)
}
fmt.Println("=================================")
// 獲取指定service
service, _, err := client.Agent().Service(serviceId, nil)
if err == nil {
fmt.Println("address:", service.Address)
fmt.Println("port:", service.Port)
}
if err == nil {
fmt.Println("ConsulFindServer done")
}
}
func ConsulCheckHeath() {
// 創(chuàng)建連接consul服務(wù)配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
// 健康檢查
a, b, _ := client.Agent().AgentHealthServiceByID(serviceId)
fmt.Println("val1:", a)
fmt.Println("val2:", b)
fmt.Println("ConsulCheckHeath done")
}
func ConsulKVTest() {
// 創(chuàng)建連接consul服務(wù)配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
// KV, put值
values := "test"
key := "go-consul-test"
client.KV().Put(&consulapi.KVPair{Key: key, Flags: 0, Value: []byte(values)}, nil)
// KV get值
data, _, _ := client.KV().Get(key, nil)
fmt.Println("data:", string(data.Value))
// KV list
datas, _, _ := client.KV().List("go", nil)
for _, value := range datas {
fmt.Println("val:", value)
}
keys, _, _ := client.KV().Keys("go", "", nil)
fmt.Println("key:", keys)
fmt.Println("ConsulKVTest done")
}
func localIP() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
return ""
}
for _, address := range addrs {
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
return ipnet.IP.String()
}
}
}
return ""
}運行結(jié)果

以上就是go使用consul實現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實現(xiàn)詳解的詳細內(nèi)容,更多關(guān)于go consul服務(wù)發(fā)現(xiàn)配置共享的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關(guān)配置
這篇文章主要介紹了Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關(guān)配置,編輯器方面介紹了包括Vim和Eclipse,需要的朋友可以參考下2016-02-02

