服務注冊:
package main import ( "log" "github.com/gin-gonic/gin" consulapi "github.com/hashicorp/consul/api" "fmt" "net/http" ) func main() { // 服務注冊 registerServer() r := gin.Default() r.GET("/ping", heathCheck) r.Run() } // consul 服務注冊 func registerServer() { // 創建consul客戶端 config := consulapi.DefaultConfig() config.Address = "172.16.30.129:8500" client, err := consulapi.NewClient(config) if err != nil { log.Fatal("consul client error : ", err) } registration := new(consulapi.AgentServiceRegistration) registration.ID = "c1" // 服務節點的名稱 registration.Name = "wsp" // 服務名稱 registration.Port = 8080 // 服務端口 registration.Tags = []string{"wsp"} // tag,可以為空 registration.Address = "192.168.43.253" // 服務 IP // 健康檢查 支持http及grpc 回調接口 checkPort := 8080 registration.Check = &consulapi.AgentServiceCheck{ // 健康檢查 HTTP: fmt.Sprintf("http://%s:%d%s", registration.Address, checkPort, "/ping"), Timeout: "3s", // 超時時間 Interval: "5s", // 健康檢查間隔 DeregisterCriticalServiceAfter: "30s", //check失敗后30秒刪除本服務,注銷時間,相當於過期時間 // GRPC: fmt.Sprintf("%v:%v/%v", IP, r.Port, r.Service),// grpc 支持,執行健康檢查的地址,service 會傳到 Health.Check 函數中 } // 服務注冊 err = client.Agent().ServiceRegister(registration) if err != nil { log.Fatal("register server error : ", err) } } // consul 健康檢測 func heathCheck(c *gin.Context) { c.JSON(http.StatusOK, "ok") }
服務發現:
package main import ( "log" consulapi "github.com/hashicorp/consul/api" "fmt" ) func main() { // 服務發現 discoverServer() } // consul 服務注冊 func discoverServer() { // 創建consul客戶端 config := consulapi.DefaultConfig() config.Address = "172.16.30.129:8500" client, err := consulapi.NewClient(config) if err != nil { log.Fatal("consul client error : ", err) } // 服務發現 services, _, err := client.Health().Service("wsp", "wsp", true, &consulapi.QueryOptions{}) if err != nil { log.Println("error retrieving instances from Consul: %v", err) } // service 遍歷 for _, service := range services { fmt.Println("service.Service.Address:", service.Service.Address, "service.Service.Port:", service.Service.Port) } }
kv存儲:
package main import ( "log" consulapi "github.com/hashicorp/consul/api" "fmt" "code.admaster.co/social/tuice-wechat/data" ) func main() { // 創建consul客戶端 config := consulapi.DefaultConfig() config.Address = "172.16.30.129:8500" client, err := consulapi.NewClient(config) if err != nil { log.Fatal("consul client error : ", err) } //kv := &consulapi.KVPair{Key:"wsp", Value:[]byte(`{"level":"info"}`)} //client.KV().Put(kv, nil) data, _ , _ := client.KV().Get("wsp", nil) fmt.Println(string(data.Value)) }
watch機制:
package main import ( "log" "github.com/gin-gonic/gin" consulapi "github.com/hashicorp/consul/api" "fmt" "net/http" ) func main() { r := gin.Default() r.GET("/watch", heathCheck2) r.Run(":8081") } // consul 健康檢測 func heathCheck2(c *gin.Context) { config := consulapi.DefaultConfig() config.Address = "172.16.30.129:8500" client, err := consulapi.NewClient(config) if err != nil { log.Fatal("consul client error : ", err) } data, _ , _ := client.KV().Get("wsp", nil) fmt.Println(string(data.Value)) c.JSON(http.StatusOK, "ok") }
配置文件:
{ "watches": [ { "type": "key", "key": "wsp", "handler_type": "http", "http_handler_config": { "path":"http://192.168.43.253:8081/watch", "method": "GET", "timeout": "10s", "tls_skip_verify": false } } ] }