consul入門
consul是用於服務發現的一個框架,在實際的RPC調用中起到一個服務管理的作用;服務器提供者啓動時告知consul自己的IP、Port以及服務信息,服務調用者從consul查詢自己需要使用的服務的IP、Port;consul並不參與到業務當中
consul安裝
這裏使用docker安裝
docker pull consul
docker run -d --name consul -p 8500:8500 consul agent -dev -client=0.0.0.0
啓動之後可以從瀏覽器直接訪問8080端口,即可查看consul狀態信息;
consul服務註冊
這裏使用grpc作爲樣例演示,grpc入門見Go語言proto使用入門
package main
import (
context "context"
"fmt"
"net"
"github.com/hashicorp/consul/api"
grpc "google.golang.org/grpc"
)
type RPCService struct {
}
func (srv *RPCService) SayHello(ctx context.Context, req *Request) (*Response, error) {
name := req.Name
return &Response{Error: 0, Ans: "Hello" + name}, nil
}
func main() {
//1, 初始化consul配置, 默認即可
consulConf := api.DefaultConfig()
consulConf.Address = "192.168.56.103:8500" //consul服務器地址
//2, 創建consul對象
consulClient, _ := api.NewClient(consulConf)
//3, 註冊的服務信息
regService := api.AgentServiceRegistration{
ID: "ii18", //服務ID
Tags: []string{"consul_ii18"}, //服務別名
Name: "Consul Service ii18", //服務名
Address: "192.168.56.1", //服務地址
Port: 8080, //服務端口
Check: &api.AgentServiceCheck{ //服務健康檢查
CheckID: "Consul Service ii18 check",
TCP: "192.168.56.1:8080",
Timeout: "1s",
Interval: "5s",
},
}
//註冊服務到consul上
consulClient.Agent().ServiceRegister(®Service)
grpcSrv := grpc.NewServer()
RegisterIi14Server(grpcSrv, new(RPCService))
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("net Listen error", err)
}
grpcSrv.Serve(listener)
}
相比於普通的RPC服務而言,只是多了一步將服務信息告知consul的部分
consul服務發現
package main
import (
context "context"
"fmt"
"strconv"
"github.com/hashicorp/consul/api"
grpc "google.golang.org/grpc"
)
func main() {
//初始化consul配置
consulConf := api.DefaultConfig()
consulConf.Address = "192.168.56.103:8500"
//創建consul對象
consuleClient, _ := api.NewClient(consulConf)
/*
服務發現:第一個參數是服務名,第二個參數是服務tag(別名),第三個參數是否通過健康檢查,第四個參數默認nil即可
返回第一個參數是服務切片(因爲集羣會有多個服務地址,取其一使用即可)
第二個參數是額外查詢信息,第三個參數是error錯誤信息
*/
serviceEntry, _, err := consuleClient.Health().Service("Consul Service ii18", "consul_ii18", true, nil)
fmt.Println("serviceEntry[0]: ", serviceEntry[0].Service.Address, serviceEntry[0].Service.Port)
if err != nil || len(serviceEntry) == 0 {
return
}
//使用上述查詢出來的地址進行連接
conn, err := grpc.Dial(serviceEntry[0].Service.Address+":"+strconv.Itoa(serviceEntry[0].Service.Port), grpc.WithInsecure())
if err != nil {
fmt.Println("grpc Dial error", err)
return
}
client := NewIi14Client(conn)
rep, err := client.SayHello(context.TODO(), &Request{Name: "zy"})
if err == nil {
fmt.Println("execute succ", rep.Ans)
}
}
相比於普通的RPC調用而言,只是多了一步從consul中獲取服務器地址的部分而已;consul更大的意義在於集羣控制。
consul註銷
consulClient.Agent().ServiceDeregister("ii18")