consul入門 consul入門

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(&regService)

    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")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章