国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

這篇具有很好參考價值的文章主要介紹了[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一.服務(wù)發(fā)現(xiàn)介紹

  1. 引入

上一節(jié)講解了使用 gRPC創(chuàng)建微服務(wù),客戶端的一個接口可能需要調(diào)用 N個服務(wù),而不同服務(wù)可能存在 不同的服務(wù)器,這時,客戶端就必須知道所有服務(wù)的 網(wǎng)絡(luò)位置(ip+port),來進(jìn)行連接服務(wù)器操作,如下圖所示:
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

以往的做法是把服務(wù)的地址放在配置文件或者數(shù)據(jù)庫中,這樣就有以下幾個問題:

  • 需要配置N個服務(wù)的網(wǎng)絡(luò)位置,加大配置的復(fù)雜性

  • 服務(wù)的網(wǎng)絡(luò)位置變化,需要改變每個調(diào)用者的配置

  • 集群的情況下,難以做負(fù)載(反向代理的方式除外)

總結(jié)起來一句話: 服務(wù)多了,配置很麻煩,問題一大堆

所以現(xiàn)在就選擇服務(wù)發(fā)現(xiàn)來解決這些問題,具體設(shè)計如下:

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
與之前解決方法不同的是,加了個 服務(wù)發(fā)現(xiàn)模塊,服務(wù)端把當(dāng)前自己的網(wǎng)絡(luò)位置 注冊到服務(wù)發(fā)現(xiàn)模塊(這里注冊的意思就是告訴),服務(wù)發(fā)現(xiàn)就以 K-V的方式記錄下,K一般是 服務(wù)名,V就是 IP:PORT,服務(wù)發(fā)現(xiàn)模塊 定時的輪詢查看這些服務(wù)能不能訪問的了(這就是 健康檢查),客戶端在調(diào)用服務(wù)A-N的時候,就跑去服務(wù)發(fā)現(xiàn)模塊問下它們的網(wǎng)絡(luò)位置,然后再調(diào)用它們的服務(wù),這樣的方式就可以解決上面的問題了, 客戶端完全不需要記錄這些服務(wù)的網(wǎng)絡(luò)位置, 客戶端和服務(wù)端完全解耦!
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

常見的服務(wù)發(fā)現(xiàn)框架有:Etcd、mdns、Consul、Zookeeper

  • consul 常應(yīng)用于grpc 、 go-micro

  • mdns:以前mdns是go-micro中默認(rèn)自帶的服務(wù)發(fā)現(xiàn)go-micro的默認(rèn)服務(wù)發(fā)現(xiàn)也是consul

  • etcd:k8s 內(nèi)嵌的服務(wù)發(fā)現(xiàn)

  • zookeeper:java中較常用

這里選擇服務(wù)發(fā)現(xiàn)框架consul來做一個詳細(xì)介紹

  1. consul介紹

Consul是Go語言寫的開源 的服務(wù)器發(fā)現(xiàn)軟件,用于實現(xiàn) 分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置,包含 多個組件,作為一個整體,它為基礎(chǔ)設(shè)施提供服務(wù)發(fā)現(xiàn)和服務(wù)配置的工具,提供以下關(guān)鍵特性:
  • 服務(wù)發(fā)現(xiàn):consul通過DNS或者HTTP接口使服務(wù)注冊服務(wù)發(fā)現(xiàn)變的很容易,一些外部服務(wù),例如saas提供的也可以一樣注冊,consul采用Raft一致性協(xié)議算法來保證服務(wù)的高可用,使用GOSSIP協(xié)議管理成員廣播消息

  • 健康檢查:健康檢測使consul可以快速的告警在集群中的操作,和服務(wù)發(fā)現(xiàn)的集成,可以防止服務(wù)轉(zhuǎn)發(fā)到故障的服務(wù)上面(心跳機(jī)制)

  • 鍵/值存儲:一個用來存儲動態(tài)配置的系統(tǒng),提供簡單的HTTP接口,可以在任何地方操作

  • 多數(shù)據(jù)中心方案支持:無需復(fù)雜的配置,即可支持任意數(shù)量的區(qū)域

  • 簡易安裝:安裝包僅包含一個二進(jìn)制文件,支持跨平臺,可與Docker等輕量級容器實現(xiàn)無縫對接

  • 提供Web管理界面:官方提供web管理界面

官方建議:最好是三臺或者三臺以上的consul在運行,同名服務(wù)最好是三臺或三臺以上,默認(rèn)可
以搭建集群

官網(wǎng):https://www.consul.io/

Git地址:https://github.com/hashicorp/consul

  1. consul安裝

Consul用Golang實現(xiàn),因此具有天然可移植性 (支持 Linux、windows和macOS),安裝包僅包含一個可執(zhí)行文件, Consul安裝非常簡單,只需要下載對應(yīng)系統(tǒng)的軟件包并解壓后就可使用

(1). windows電腦安裝consul

1).下載consul
下載地址: https://www.consul.io/downloads
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
2).解壓consul到一個目錄
把consul解壓到E盤
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
3).配置consul到環(huán)境變量
a.電腦左下方設(shè)置選項
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
b.選擇系統(tǒng)
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
c.關(guān)于->高級系統(tǒng)設(shè)置
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
d.選擇'環(huán)境變量'
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
e.配置consul到環(huán)境變量
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
4).測試consul是否安裝成功
重啟計算機(jī),命令行運行 consul -v, 出現(xiàn)如下代碼,說明安裝成功
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

(2).Mac電腦安裝consul

方法一
運行以下命令即可
brew tap hashicorp/tap
brew install hashicorp/tap/consul
方法二
和windows類似
1).下載consul
2).減壓consul到一個目錄 配置consul到環(huán)境變量
或者下載解壓后,將文件放置在 /usr/local/bin 目錄下
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
3).查看安裝情況
consul --version

(3).Linux電腦安裝consul

方法一
Ubuntu安裝步驟
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com
$(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install consul
CentOS安裝步驟
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo
https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install consul
方法二
和windows/mac安裝類似
1).下載consul
2).減壓consul到一個目錄 配置consul到環(huán)境變量
[root@localhost ~]# mkdir -p usr/local/consul
[root@localhost ~]# unzip consul_1.11.4_linux_arm64.zip -d /usr/local/consul/
[root@localhost ~]# cd /usr/local/consul/
[root@localhost ~]# ./consul -v
如果要全局使用請把consul加入到環(huán)境變量,或者下載解壓后,將文件放置在 /usr/local/bin 目錄下
3).安裝驗證
安裝 Consul后,通過執(zhí)行 consul命令,可以看到命令列表的輸出
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
ok,consul在各個環(huán)境安裝完成

二. consul的使用

  1. consul的角色

完成consul的安裝后,必須運行 agent, agent可以運行為 server模式、 client模式或者 dev模式, 每個數(shù)據(jù)中心至少必須擁 有一臺serve,建議在一個集群中有 3或者5個server,因為部署單一server,在出現(xiàn)失敗時,也許會不可避免的出現(xiàn)數(shù)據(jù)丟失
  • client客戶端角色: 將 HTTP 和 DNS 接口請求轉(zhuǎn)發(fā)給局域網(wǎng)內(nèi)的Server服務(wù)端集群

  • server服務(wù)端角色 :保存配置信息、實現(xiàn)高可用集群、在局域網(wǎng)內(nèi)與本地客戶端通訊、通過廣域網(wǎng)與其他數(shù)據(jù)中心通訊等, 每個數(shù)據(jù)中心(集群)的 server 數(shù)量推薦為3個或是5個

  • 開發(fā)模式:主要用于開發(fā)階段(dev模式也是server模式)

consul安裝好之后,在使用之前,先了解一下consul都有哪些命令,使用命令 consul -h可以查看consul支持的所有參數(shù),而且每個參數(shù)里面還支持其他參數(shù)
C:\Users\zhoupenghui>consul -h
Usage: consul [--version] [--help] <command> [<args>]

Available commands are:
    acl             Interact with Consul's ACLs
    agent           Runs a Consul agent
    catalog         Interact with the catalog
    config          Interact with Consul's Centralized Configurations
    connect         Interact with Consul Connect
    debug           Records a debugging archive for operators
    event           Fire a new event
    exec            Executes a command on Consul nodes
    force-leave     Forces a member of the cluster to enter the "left" state
    info            Provides debugging information for operators.
    intention       Interact with Connect service intentions
    join            Tell Consul agent to join cluster
    keygen          Generates a new encryption key
    keyring         Manages gossip layer encryption keys
    kv              Interact with the key-value store
    leave           Gracefully leaves the Consul cluster and shuts down
    lock            Execute a command holding a lock
    login           Login to Consul using an auth method
    logout          Destroy a Consul token created with login
    maint           Controls node or service maintenance mode
    members         Lists the members of a Consul cluster
    monitor         Stream logs from a Consul agent
    operator        Provides cluster-level tools for Consul operators
    peering         Create and manage peering connections between Consul clusters
    reload          Triggers the agent to reload configuration files
    rtt             Estimates network round trip time between nodes
    services        Interact with services
    snapshot        Saves, restores and inspects snapshots of Consul server state
    tls             Builtin helpers for creating CAs and certificates
    troubleshoot    CLI tools for troubleshooting Consul service mesh
    validate        Validate config files/directories
    version         Prints the Consul version
    watch           Watch for changes in Consul
agent參數(shù)說明:指令是consul的核心,它運行agent來維護(hù)成員的重要信息、運行檢查、服務(wù)宣布、查詢處理等等
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
  1. consul agent -dev 開發(fā)者模式啟動consul

開發(fā)階段可以使用下面命令啟動consul ,執(zhí)行 consul agent -dev 啟動了一個consul 服務(wù)端
consul agent -dev
訪問 http://localhost:8500 可以打開Web管理界面,如下:
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
  1. consul和gRPC結(jié)合使用

(1).啟動consul

代碼中結(jié)合gRPC和consul使用時,需要先 啟動consul ,開發(fā)階段通過 consul agent -dev 啟動consul,在操作consul時使用的是 github.com/hashicorp/consul 這個包,需要先下載,可以通過命令 go get -u -v github.com/hashicorp/consul,或者在import中引入 github.com/hashicorp/consul/api后,使用go mod tidy來加載

(2).注冊一個服務(wù)到consul上

把上一節(jié)中的 hello grpc服務(wù)注冊到consul上,找到server/hello/main.go,編輯,代碼如下:
增加了 consul服務(wù)相關(guān)代碼,其它地方保存不變
package main

import (
    "context"
    "fmt"
    "net"
    "google.golang.org/grpc"
    "github.com/hashicorp/consul/api"
    "serverHello/proto/helloService"
)

//rpc遠(yuǎn)程調(diào)用的接口,需要實現(xiàn)hello.proto中定義的Hello服務(wù)接口,以及里面的方法
//1.定義遠(yuǎn)程調(diào)用的結(jié)構(gòu)體和方法,這個結(jié)構(gòu)體需要實現(xiàn)HelloServer的接口

type Hello struct{}

//SayHello方法參考hello.pb.go中的接口
/*
// HelloServer is the server API for Hello service.
type HelloServer interface {
    // 通過rpc來指定遠(yuǎn)程調(diào)用的方法:
    // SayHello方法, 這個方法里面實現(xiàn)對傳入的參數(shù)HelloReq, 以及返回的參數(shù)HelloRes進(jìn)行約束
    SayHello(context.Context, *HelloReq) (*HelloRes, error)
}
 */
func (this Hello) SayHello(c context.Context, req *helloService.HelloReq) (*helloService.HelloRes, error) {
    fmt.Println(req)
    return &helloService.HelloRes{
        Message: "你好" + req.Name,
    }, nil
}

func main() {
    //------------------------- consul服務(wù)相關(guān)----------------------
    //注冊consul服務(wù)
    //1、初始化consul配置
    consulConfig := api.DefaultConfig()
    //設(shè)置consul服務(wù)器地址: 默認(rèn)127.0.0.1:8500, 如果consul部署到其它服務(wù)器上,則填寫其它服務(wù)器地址
    //consulConfig.Address = "127.0.0.1:8500"
    //2、獲取consul操作對象
    consulClient, _ := api.NewClient(consulConfig)
    // 3、配置注冊服務(wù)的參數(shù)
    agentService := api.AgentServiceRegistration{
        ID:      "1",  // 服務(wù)id,順序填寫即可
        Tags:    []string{"test"},  // tag標(biāo)簽
        Name:    "HelloService",  //服務(wù)名稱, 注冊到服務(wù)發(fā)現(xiàn)(consul)的K
        Port:    8080, // 端口號: 需要與下面的監(jiān)聽, 指定 IP、port一致
        Address: "127.0.0.1",  // 當(dāng)前微服務(wù)部署地址: 結(jié)合Port在consul設(shè)置為V: 需要與下面的監(jiān)聽, 指定 IP、port一致
        Check: &api.AgentServiceCheck{  //健康檢測
            TCP:      "127.0.0.1:8080",  //前微服務(wù)部署地址,端口 : 需要與下面的監(jiān)聽, 指定 IP、port一致
            Timeout:  "5s",  // 超時時間
            Interval: "30s",  // 循環(huán)檢測間隔時間
        },
    }

    //4、注冊服務(wù)到consul上
    consulClient.Agent().ServiceRegister(&agentService)

    //------------------------- grpc相關(guān)----------------------
    //1. 初始一個 grpc 對象
    grpcServer := grpc.NewServer()
    //2. 注冊服務(wù)
    //helloService.RegisterHelloServer(grpcServer, &Hello{})
    // &Hello{}和 new(Hello)相同
    helloService.RegisterHelloServer(grpcServer, new(Hello))
    //3. 設(shè)置監(jiān)聽, 指定 IP、port
    listener, err := net.Listen("tcp", "127.0.0.1:8080")
    if err != nil {
        fmt.Println(err)
    }
    // 4退出關(guān)閉監(jiān)聽
    defer listener.Close()
    //5、啟動服務(wù)
    grpcServer.Serve(listener)
}

效果展示:

運行該main..go
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
consul界面展示效果如下:
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

說明HelloService微服務(wù)注冊到了consul這個服務(wù)發(fā)現(xiàn)中了

(3).在客戶端使用服務(wù)發(fā)現(xiàn)獲取hello微服務(wù)相關(guān)

把上一節(jié)中的 hello grpc服務(wù)客戶端代碼修改一下,通過consul獲取hello微服務(wù)相關(guān),找到server/client/main.go,編輯,增加了 consul服務(wù)相關(guān)代碼,在連接服務(wù)器的時候,使用consul返回的微服務(wù)地址, 其它地方保存不變,代碼如下:
package main

import (
    "client/proto/helloService"
    "context"
    "fmt"
    "google.golang.org/grpc"
    "github.com/hashicorp/consul/api"
    "google.golang.org/grpc/credentials/insecure"
    "strconv"
)

func main() {
    //----------------------------consul相關(guān)---------------------------
    //初始化consul配置, 客戶端服務(wù)器需要一致
    consulConfig := api.DefaultConfig()
    //設(shè)置consul服務(wù)器地址: 默認(rèn)127.0.0.1:8500, 如果consul部署到其它服務(wù)器上,則填寫其它服務(wù)器地址
    //consulConfig.Address = "127.0.0.1:8500"
    //2、獲取consul操作對象
    consulClient, _ := api.NewClient(consulConfig)  //目前先屏蔽error,也可以獲取error進(jìn)行錯誤處理
    //3、獲取consul服務(wù)發(fā)現(xiàn)地址,返回的ServiceEntry是一個結(jié)構(gòu)體數(shù)組
    //參數(shù)說明:service:服務(wù)名稱,服務(wù)端設(shè)置的那個Name, tag:標(biāo)簽,服務(wù)端設(shè)置的那個Tags,, passingOnly bool, q: 參數(shù)
    serviceEntry, _, _ := consulClient.Health().Service("HelloService", "test", false, nil)
    //打印地址
    fmt.Println(serviceEntry[0].Service.Address)
    fmt.Println(serviceEntry[0].Service.Port)
    //拼接地址
    //strconv.Itoa: int轉(zhuǎn)string型
    address := serviceEntry[0].Service.Address + ":" + strconv.Itoa(serviceEntry[0].Service.Port)

    //----------------------------hello微服務(wù)相關(guān)------------------------------
    // 1、連接服務(wù)器
    /*
        credentials.NewClientTLSFromFile :從輸入的證書文件中為客戶端構(gòu)造TLS憑證。
        grpc.WithTransportCredentials :配置連接級別的安全憑證(例如,TLS/SSL),返回一個
        DialOption,用于連接服務(wù)器。
    */
    //把上面拼接的地址放入下面
    grpcClient, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials()))
    if err != nil {
        fmt.Println(err)
    }

    //2、注冊客戶端
    client := helloService.NewHelloClient(grpcClient)
    //3、調(diào)用服務(wù)端函數(shù), 實現(xiàn)HelloClient接口:SayHello()
    /*
        // HelloClient is the client API for Hello service.
        //
        // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
        type HelloClient interface {
            // 通過rpc來指定遠(yuǎn)程調(diào)用的方法:
            // SayHello方法, 這個方法里面實現(xiàn)對傳入的參數(shù)HelloReq, 以及返回的參數(shù)HelloRes進(jìn)行約束
            SayHello(ctx context.Context, in *HelloReq, opts ...grpc.CallOption) (*HelloRes, error)
        }
    */
    res, err1 := client.SayHello(context.Background(), &helloService.HelloReq{
        Name: "張三",
    })
    if err1 != nil {
        fmt.Printf("調(diào)用服務(wù)端代碼失敗: %s", err1)
        return
    }

    fmt.Printf("%#v\r\n", res)
    fmt.Printf("調(diào)用成功: %s", res.Message)
}

(4).校驗客戶端-服務(wù)發(fā)現(xiàn)-服務(wù)端功能是否成功

啟動consul
見上面操作
啟動服務(wù)端
見上面操作
啟動客戶端
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

校驗成功

(5).測試不同服務(wù)端口下,客戶端調(diào)用hello微服務(wù)操作

修改服務(wù)端hello微服務(wù)main.go中的端口號,改為8081,然后重新運行該微服務(wù),再使用客戶端請求服務(wù)發(fā)現(xiàn),看看返回的hello微服務(wù)對應(yīng)的端口號發(fā)生變化沒有,如果發(fā)生變化了,說明操作成功,以此為案例,開發(fā)者可以把微服務(wù)服務(wù)端部署到不同服務(wù)器上,并指定對應(yīng)的端口,從而實現(xiàn)微服務(wù)的負(fù)載均衡操作
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

F:\www\go-data\src\go_code\micro\grpc_demo\server\hello>go run .\main.go

name:"張三"

(6)實現(xiàn)goods微服務(wù)-服務(wù)發(fā)現(xiàn)-客戶端操作

把上一節(jié) goods微服務(wù)注冊到consul上,找到server/goods/main.go,編輯,代碼如下:
增加了 consul服務(wù)相關(guān)代碼,其它地方保存不變
package main

import (
    "context"
    "fmt"
    "github.com/hashicorp/consul/api"
    "goods/proto/goodsService"
    "net"
    "google.golang.org/grpc"
    "strconv"
)

//rpc遠(yuǎn)程調(diào)用的接口,需要實現(xiàn)goods.proto中定義的Goods服務(wù)接口,以及里面的方法
//1.定義遠(yuǎn)程調(diào)用的結(jié)構(gòu)體和方法,這個結(jié)構(gòu)體需要實現(xiàn)GoodsServer的接口

type Goods struct{}

//GoodsServer方法參考goods.pb.go中的接口
/*
// GoodsServer is the server API for Goods service.
type GoodsServer interface {
    // 通過rpc來指定遠(yuǎn)程調(diào)用的方法:
    // AddGoods方法:增加商品, 這個方法里面實現(xiàn)對傳入的參數(shù)AddGoodsReq, 以及返回的參數(shù)AddGoodsRes進(jìn)行約束
    AddGoods(context.Context, *AddGoodsReq) (*AddGoodsRes, error)
    // 獲取商品列表: GetGoodsReq 參數(shù)可為空, 返回參數(shù)GetGoodsRes是一個商品相關(guān)的切片
    GetGoods(context.Context, *GetGoodsReq) (*GetGoodsRes, error)
}
*/
//增加商品數(shù)據(jù)
func (this Goods) AddGoods(c context.Context, req *goodsService.AddGoodsReq) (*goodsService.AddGoodsRes, error) {
    fmt.Println(req)
    //模擬返回操作,正式項目在這里進(jìn)行數(shù)據(jù)庫的操作即可,根據(jù)操作結(jié)果,返回相關(guān)數(shù)據(jù)
    return &goodsService.AddGoodsRes{
        Message: "增加數(shù)據(jù)成功",
        Success: true,
    }, nil
}

//獲取商品列表
func (g Goods) GetGoods(c context.Context, req *goodsService.GetGoodsReq) (*goodsService.GetGoodsRes, error) {
    //  GoodsList []*GoodsModel
    var tempList []*goodsService.GoodsModel  //定義返回的商品列表切片
    //模擬從數(shù)據(jù)庫中獲取商品的請求,循環(huán)結(jié)果,把商品相關(guān)數(shù)據(jù)放入tempList切片中
    for i := 0; i < 10; i++ {
        tempList = append(tempList, &goodsService.GoodsModel{
            Title:   "商品" + strconv.Itoa(i),  // strconv.Itoa(i): 整型轉(zhuǎn)字符串類型
            Price:   float64(i),  //float64(i): 強(qiáng)制轉(zhuǎn)換整型為浮點型
            Content: "測試商品內(nèi)容" + strconv.Itoa(i),
        })
    }
    return &goodsService.GetGoodsRes{
        GoodsList: tempList,
    }, nil
}

func main() {
    //------------------------- consul服務(wù)相關(guān)----------------------
    //注冊consul服務(wù)
    //1、初始化consul配置
    consulConfig := api.DefaultConfig()
    //設(shè)置consul服務(wù)器地址: 默認(rèn)127.0.0.1:8500, 如果consul部署到其它服務(wù)器上,則填寫其它服務(wù)器地址
    //consulConfig.Address = "127.0.0.1:8500"
    //2、獲取consul操作對象
    consulClient, _ := api.NewClient(consulConfig)
    // 3、配置注冊服務(wù)的參數(shù)
    agentService := api.AgentServiceRegistration{
        ID:      "1",  // 服務(wù)id,順序填寫即可
        Tags:    []string{"test"},  // tag標(biāo)簽
        Name:    "GoodsService",  //服務(wù)名稱, 注冊到服務(wù)發(fā)現(xiàn)(consul)的K
        Port:    8080, // 端口號: 需要與下面的監(jiān)聽, 指定 IP、port一致
        Address: "127.0.0.1",  // 當(dāng)前微服務(wù)部署地址: 結(jié)合Port在consul設(shè)置為V: 需要與下面的監(jiān)聽, 指定 IP、port一致
        Check: &api.AgentServiceCheck{  //健康檢測
            TCP:      "127.0.0.1:8080",  //前微服務(wù)部署地址,端口 : 需要與下面的監(jiān)聽, 指定 IP、port一致
            Timeout:  "5s",  // 超時時間
            Interval: "30s",  // 循環(huán)檢測間隔時間
        },
    }

    //4、注冊服務(wù)到consul上
    consulClient.Agent().ServiceRegister(&agentService)

    //1. 初始一個 grpc 對象
    grpcServer := grpc.NewServer()
    //2. 注冊服務(wù)
    //helloService.RegisterGoodsServer(grpcServer, &Goods{})
    // &Hello{}和 new(Hello)相同
    goodsService.RegisterGoodsServer(grpcServer, new(Goods))
    //3. 設(shè)置監(jiān)聽, 指定 IP、port
    listener, err := net.Listen("tcp", "127.0.0.1:8080")
    if err != nil {
        fmt.Println(err)
    }
    // 4退出關(guān)閉監(jiān)聽
    defer listener.Close()
    //5、啟動服務(wù)
    grpcServer.Serve(listener)
}

效果展示:

運行該main..go
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
consul界面展示效果如下:
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

說明GoodsService微服務(wù)注冊到了consul這個服務(wù)發(fā)現(xiàn)中了

(7).在客戶端使用服務(wù)發(fā)現(xiàn)獲取goods微服務(wù)相關(guān)

把上一節(jié)中的 goods grpc服務(wù)注冊客戶端代碼修改一下,通過consul獲取goods微服務(wù)相關(guān),找到server/goods/main.go,編輯,增加了 consul服務(wù)相關(guān)代碼,在連接服務(wù)器的時候,使用consul返回的微服務(wù)地址, 其它地方保存不變,代碼如下:
package main

import (
    "client/proto/goodsService"
    "context"
    "fmt"
    "github.com/hashicorp/consul/api"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials/insecure"
    "strconv"
)

func main() {
    //----------------------------consul相關(guān)---------------------------
    //初始化consul配置, 客戶端服務(wù)器需要一致
    consulConfig := api.DefaultConfig()
    //設(shè)置consul服務(wù)器地址: 默認(rèn)127.0.0.1:8500, 如果consul部署到其它服務(wù)器上,則填寫其它服務(wù)器地址
    //consulConfig.Address = "127.0.0.1:8500"
    //2、獲取consul操作對象
    consulClient, _ := api.NewClient(consulConfig)  //目前先屏蔽error,也可以獲取error進(jìn)行錯誤處理

    //3、獲取consul服務(wù)發(fā)現(xiàn)地址,返回的ServiceEntry是一個結(jié)構(gòu)體數(shù)組
    //參數(shù)說明:service:服務(wù)名稱,服務(wù)端設(shè)置的那個Name, tag:標(biāo)簽,服務(wù)端設(shè)置的那個Tags,, passingOnly bool, q: 參數(shù)
    //serviceEntry, _, _ := consulClient.Health().Service("HelloService", "test", false, nil)
    //打印地址
    //fmt.Println(serviceEntry[0].Service.Address)
    //fmt.Println(serviceEntry[0].Service.Port)
    //拼接地址
    //strconv.Itoa: int轉(zhuǎn)string型
    //address := serviceEntry[0].Service.Address + ":" + strconv.Itoa(serviceEntry[0].Service.Port)

    //----------------------------hello微服務(wù)相關(guān)------------------------------
    // 1、連接服務(wù)器
    /*
        credentials.NewClientTLSFromFile :從輸入的證書文件中為客戶端構(gòu)造TLS憑證。
        grpc.WithTransportCredentials :配置連接級別的安全憑證(例如,TLS/SSL),返回一個
        DialOption,用于連接服務(wù)器。
    */
    //把上面拼接的地址放入下面
    //grpcClient, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials()))
    //if err != nil {
    //    fmt.Println(err)
    //}

    //2、注冊客戶端
    //client := helloService.NewHelloClient(grpcClient)
    //3、調(diào)用服務(wù)端函數(shù), 實現(xiàn)HelloClient接口:SayHello()
    /*
        // HelloClient is the client API for Hello service.
        //
        // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
        type HelloClient interface {
            // 通過rpc來指定遠(yuǎn)程調(diào)用的方法:
            // SayHello方法, 這個方法里面實現(xiàn)對傳入的參數(shù)HelloReq, 以及返回的參數(shù)HelloRes進(jìn)行約束
            SayHello(ctx context.Context, in *HelloReq, opts ...grpc.CallOption) (*HelloRes, error)
        }
    */
    //res, err1 := client.SayHello(context.Background(), &helloService.HelloReq{
    //    Name: "張三",
    //})
    //if err1 != nil {
    //    fmt.Printf("調(diào)用服務(wù)端代碼失敗: %s", err1)
    //    return
    //}
    //
    //fmt.Printf("%#v\r\n", res)
    //fmt.Printf("調(diào)用成功: %s", res.Message)


    ----------------------------goods微服務(wù)相關(guān)--------------------------

    //3、獲取consul服務(wù)發(fā)現(xiàn)地址,返回的ServiceEntry是一個結(jié)構(gòu)體數(shù)組
    //參數(shù)說明:service:服務(wù)名稱,服務(wù)端設(shè)置的那個Name, tag:標(biāo)簽,服務(wù)端設(shè)置的那個Tags,, passingOnly bool, q: 參數(shù)
    serviceGoodsEntry, _, _ := consulClient.Health().Service("GoodsService", "test", false, nil)
    //打印地址
    fmt.Println(serviceGoodsEntry[0].Service.Address)
    fmt.Println(serviceGoodsEntry[0].Service.Port)
    //拼接地址
    //strconv.Itoa: int轉(zhuǎn)string型
    addressGoods := serviceGoodsEntry[0].Service.Address + ":" + strconv.Itoa(serviceGoodsEntry[0].Service.Port)

    // 1、連接服務(wù)器
    /*
        credentials.NewClientTLSFromFile :從輸入的證書文件中為客戶端構(gòu)造TLS憑證。
        grpc.WithTransportCredentials :配置連接級別的安全憑證(例如,TLS/SSL),返回一個
        DialOption,用于連接服務(wù)器。

    */
    grpcGoodsClient, err := grpc.Dial(addressGoods, grpc.WithTransportCredentials(insecure.NewCredentials()))

    if err != nil {
        fmt.Println(err)
    }
    //2、注冊客戶端
    clientGoods := goodsService.NewGoodsClient(grpcGoodsClient)
    //增加
    res1, _ := clientGoods.AddGoods(context.Background(), &goodsService.AddGoodsReq{
        Goods: &goodsService.GoodsModel{
            Title:   "測試商品",
            Price:   20,
            Content: "測試商品的內(nèi)容",
        },
    })
    fmt.Println(res1.Message)
    fmt.Println(res1.Success)

    //獲取商品數(shù)據(jù)
    res2, _ := clientGoods.GetGoods(context.Background(), &goodsService.GetGoodsReq{})
    fmt.Printf("%#v", res2.GoodsList)

    for i := 0; i < len(res2.GoodsList); i++ {
        fmt.Printf("%#v\r\n", res2.GoodsList[i])
    }
}

(8).校驗客戶端-服務(wù)發(fā)現(xiàn)-服務(wù)端功能是否成功

啟動consul
見上面操作
啟動服務(wù)端
見上面操作
啟動客戶端
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

校驗成功

(9).注銷服務(wù)

package main

import "github.com/hashicorp/consul/api"

func main(){
? ? //初始化consul配置,客戶端服務(wù)器需要一致
? ? consulConfig := api.DefaultConfig()
 ? ?consulConfig.Address = "192.168.1.132:8500" //consul服務(wù)器的地址
? ? //獲取consul操作對象
? ? registerClient,_ := api.NewClient(consulConfig)
? ? //注銷服務(wù)ServiceDeregister(ServerID),ServerID: 微服務(wù)服務(wù)端服務(wù)發(fā)現(xiàn)id
? ? registerClient.Agent().ServiceDeregister("1")
    // http://localhost:8500  可以查看詳情
}

三.consul集群,監(jiān)控檢查,服務(wù)發(fā)現(xiàn)

通過上面例子已經(jīng)可以實現(xiàn) 注冊服務(wù)、 發(fā)現(xiàn)服務(wù)了,下面給大家詳細(xì)的講解一下consul中的 服務(wù)端以及 客戶端
  1. 簡介

Consul 是 HashiCorp 公司推出的開源工具,用于實現(xiàn) 分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置,Consul 是 分布式的高可用的、 可橫向擴(kuò)展的,完成consul的安裝后,必須運行 agent代理, agent可以運行為 server模式client模式
  • 服務(wù)模式(server模式): 主要參與維護(hù)集群狀態(tài),響應(yīng)RPC查詢,與其他數(shù)據(jù)中心交換WAN gossip ,以及向上級或遠(yuǎn)程數(shù)據(jù)中心轉(zhuǎn)發(fā)查詢,并且會將數(shù)據(jù)持久化,推薦使用3到5臺機(jī)器

  • 客戶模式(client模式):客戶模式下ConsulAgent是一個非常輕量級的進(jìn)程,它消耗最小的資源開銷和少量的網(wǎng)絡(luò)帶寬,提供注冊服務(wù),運行健康檢查,并將查詢轉(zhuǎn)發(fā)給服務(wù)器,客戶端是相對無狀態(tài)的,客戶端執(zhí)行的唯一后臺活動是LANgossip池,不負(fù)責(zé)數(shù)據(jù)的持久化,客戶模式不能單獨存在,必須要有一個服務(wù)模式的Consul

  • 數(shù)據(jù)中心:一個數(shù)據(jù)中心由多個ServerClient模式Consul組成,多個數(shù)據(jù)中心通過WAN通信,每個數(shù)據(jù)中心(數(shù)據(jù)中心是一個大型的計算機(jī)系統(tǒng)集群,通常由成千上萬臺計算機(jī)、存儲設(shè)備、網(wǎng)絡(luò)設(shè)備、電源設(shè)備、冷卻設(shè)備等組成,以提供高效、可靠的計算和存儲能力,主要功能是提供云計算、虛擬化、存儲和數(shù)據(jù)處理等服務(wù),以滿足企業(yè)、政府機(jī)構(gòu)和個人的計算和數(shù)據(jù)存儲需求,是現(xiàn)代企業(yè)和政府機(jī)構(gòu)不可或缺的基礎(chǔ)設(shè)施之一)至少必須擁有一臺server,建議在一個集群中有3或者5個server,部署單一server,在出現(xiàn)失敗時,會不可避免的出現(xiàn)數(shù)據(jù)丟失

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
圖片上 datacenter 分成上下兩個部分, 但是這兩個部分又不是完全隔離的,他們之間通過 WAN GOSSIP 進(jìn)行報文交互,單個 datacenter 中,節(jié)點被劃分成兩種顏色, 紅色的 server, 紫色的 client, 他們之間通過 GRPC 進(jìn)行通信(業(yè)務(wù)數(shù)據(jù)), 除此之外, Client 和 Server 之間通過還有一條 LAN Gosssip 進(jìn)行通信,比如,當(dāng) Server 節(jié)點增加,或者 down 機(jī)后,Client 可以獲取對應(yīng)的 Server列表,去除或者增加 Server 列表,同一個 Consul agent 程序,啟動的時候,通過制定不同的參數(shù)來運行 Server 和 Client 模式,也就是說 client 和 server 本質(zhì)上都是 Client Agent
一個client是一個非常 輕量級的進(jìn)程,用于 注冊服務(wù),運行 健康檢查轉(zhuǎn)發(fā)對server的查詢,每個數(shù)據(jù)中心 至少必須擁有一個server,agent必須在集群中的每個主機(jī)上運行,
注意:
server也可以用于注冊服務(wù),比如前面運行的 consul agent -dev ,但是正式上線后一般 通過client注冊服務(wù),使用保存配置信息、實現(xiàn)高可用集群、通過廣域網(wǎng)與其他數(shù)據(jù)中心通訊等

Server功能

  • 參與共識仲裁(raft)

  • 存儲機(jī)器狀態(tài)(日志存儲)

  • 處理查詢

  • 維護(hù)周邊(LAN/WAN) 節(jié)點之間的關(guān)系

Client功能

  • 負(fù)責(zé)通過該節(jié)點注冊到 Consul 微服務(wù)的健康檢查

  • 將客戶端的注冊請求和查詢轉(zhuǎn)換為 server 的 RPC 請求

  • 維護(hù)周邊各節(jié)點(LAN/WAN) 的關(guān)系

  1. Client-Server 模式

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

Consul 的架構(gòu)升級為 client-Server 模式,服務(wù)注冊不再向 Consul-Server進(jìn)行注冊,而是向服務(wù)所在機(jī)器的 Consul-client 進(jìn)行注冊,通過 Consul-Client 將注冊信息同步 Consul-Server 機(jī)器中

  1. 純 Server 模式

Zookeeper 就是這種模,client server 本質(zhì)上都是 consul 的 agent, 只是 角色不同,架構(gòu)圖如下:
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
  1. 架構(gòu)的問題

純 server 模式架構(gòu)的問題

高可用服務(wù)實例注冊時配置的 consul-host 是負(fù)載均衡地址,服務(wù)注冊到集群后,由集群中的一個節(jié)點負(fù)責(zé)對該實例進(jìn)行健康檢查,假如有這樣的情況:服務(wù)A,服務(wù)B,都注冊到 Service1 ,也就是由 Service1 對 服務(wù)A,服務(wù)B 進(jìn)行健康檢查,當(dāng) Service1 宕機(jī)時,這樣會導(dǎo)致 服務(wù)A,服務(wù)B 在注冊列表中消失,導(dǎo)致無法無法訪問到,但是其實服務(wù)本身沒有問題。服務(wù)注銷:當(dāng)服務(wù)從注冊中心注銷時,由于是負(fù)載均衡的,可能會導(dǎo)致服務(wù)注銷失敗,因為要在Service1 上注銷,有可能負(fù)載均衡到 Service2 上進(jìn)行注銷,導(dǎo)致注銷失敗,解決的辦法:遍歷集群中所有節(jié)點進(jìn)行注銷

Client-Server 架構(gòu)的問題

高可用服務(wù)實例向本級別 consul-client 進(jìn)行注冊,如果 consul-client 不可用,只影響 consul-client 所在機(jī)器的服務(wù)實例,不影響另外一臺機(jī)器上的實例。服務(wù)注銷服務(wù)注銷值需要在 consul-client 上進(jìn)行注銷,不需要經(jīng)過負(fù)載均衡

  1. 基于 Client-Server架構(gòu)服務(wù)注冊時序圖

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

服務(wù)端口

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
  • 8300: 只存在于Server模式,選取Leader節(jié)點(Raft協(xié)議),為Leader節(jié)點和Client節(jié)點的提供RPC調(diào)用

  • 8301: LAN網(wǎng)中集群數(shù)據(jù)同步的通信端口(Gossip協(xié)議),也是加入集群的通信端口

  • 8302: 只存在于Server模式,WAN網(wǎng)中集群數(shù)據(jù)同步的通信端口(Gossip協(xié)議),也是加入集群的通信端口,主要支持?jǐn)?shù)據(jù)中心與數(shù)據(jù)中心之間交互通過WLAN(8302端口)

  • 8500: 提供Http服務(wù)(或web界面)

  • 8600: 提供DNS服務(wù)端口

8301和8302接口作用類似,主要區(qū)分在于8301用于LAN網(wǎng)絡(luò),8302用于WAN網(wǎng)絡(luò),它們都可以用于加入consul集群(數(shù)據(jù)中心一致就是在一個集群),將各數(shù)據(jù)中心連接則使用8302端口

實現(xiàn)原理

核心原理在于亮點:
  • 集群信息之間的高效同步機(jī)制,保障拓?fù)渥儎优c控制信號的及時同步

  • server 集群內(nèi)日志存儲強(qiáng)一致性

他們主要基于兩個協(xié)議來實現(xiàn):
  • Gossip 協(xié)議,在集群內(nèi)消息傳遞

  • 使用 raft 協(xié)議保障日志的一致性

案例講解

架構(gòu)圖
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
步驟
(1).部署集群
首先需要有一個正常的Consul集群,有Server,有 Leader(主服務(wù)領(lǐng)導(dǎo)),這里在服務(wù)器Server1、Server2、Server3上分別部署了Consul Server
(2).選舉Leader節(jié)點
假設(shè)選舉了Server2上的 Consul Server 節(jié)點為Leader,這些服務(wù)器上最好只部署Consul程序,以盡量維護(hù)Consul Server的穩(wěn)定
(3).注冊服務(wù)
然后在服務(wù)器Server5和Server7上通過Consul Client分別注冊Service A、B、C,這里每個Service 分別部署在了 兩個服務(wù)器上,這樣可以避免Service的 單點問題,服務(wù)注冊到Consul可以通過 HTTP API(8500 端口)的方式,也可以通過 Consul 配置文件的方式
(4).Consul Client轉(zhuǎn)發(fā)注冊消息
Consul Client 可以認(rèn)為是無狀態(tài)的,它將注冊信息通過 RPC轉(zhuǎn)發(fā)到Consul Server,服務(wù)信息保存在Server的各個節(jié)點中,并且通過 Raft實現(xiàn)了 強(qiáng)一致性
(5).服務(wù)發(fā)起通信請求
最后在服務(wù)器Server6中Service D需要訪問Service B,這時候Service D首先訪問本機(jī)Consul Client提供的HTTP API,本機(jī)Client會將請求轉(zhuǎn)發(fā)到 Consul Server,Consul Server查詢到Service B當(dāng)前的信息返回,最終Service D拿到了Service B的所有部署的IP和端口,然后就可以選擇Service B的其中一個部署并向其發(fā)起請求了
  1. 集群配置

準(zhǔn)備四個虛擬機(jī),安裝好consul等相關(guān)軟件(安裝見上面講解),三個虛擬機(jī)作為服務(wù)端(ip參考:192.168.1.129,192.168.1.130,192.168.1.131,),一個作為客戶端(ip參考:192.168.1.132), 虛擬機(jī)查詢consul如下:
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

其他虛擬機(jī)也是一致的,進(jìn)行集群配置測試操作后

(1).啟動服務(wù)端

啟動服務(wù)端命令如下:

$ consul agent -server -bootstrap-expect 3 -node=server_01 -
bind=192.168.1.129 -ui -data-dir=/root/usr/local/consul/data -client 0.0.0.0

$ consul agent -server -bootstrap-expect 3 -node=server_02 -
bind=192.168.1.130 -ui -data-dir=/root/usr/local/consul/data -client 0.0.0.0

$ consul agent -server -bootstrap-expect 3 -node=server_03 -
bind=192.168.1.131 -ui -data-dir=/root/usr/local/consul/data -client 0.0.0.0

#額外參數(shù):
-advertise=106.52.1.126 -datacenter=myDataCenter-CentOS  -enable-script-checks=true -config-dir=/etc/consul.d/consul.d -server-port=8300 -serf-lan-port=8301 -serf-wan-port=8302 -http-port=8500 -dns-port=8600 
需要先在/etc/下面創(chuàng)建consul.d目錄,上面參數(shù)說明:
-server : 定義agent運行在 server模式,表示以Server模式啟動,沒有設(shè)置-server表示Client方式啟動
-bootstrap-expect :在一個 datacenter(數(shù)據(jù)中心)中期望提供的server節(jié)點數(shù)目,當(dāng)該值提供的時候, consul一直等到達(dá)到指定sever數(shù)目的時候才會引導(dǎo)整個集群,該標(biāo)記不能和bootstrap,通俗來講,就是 構(gòu)成集群的最小數(shù)量
共用(注意:bootstrap-expect值必須是server的數(shù)量)
-bind :集群通信的ip,該地址用來在集群內(nèi)部的通訊,集群內(nèi)的所有節(jié)點到地址都必須是可達(dá)的,默認(rèn)是0.0.0.0 ,表示所有ip
-node :節(jié)點在集群中的名稱,在一個集群中必須是唯一的,默認(rèn)是該節(jié)點的主機(jī)名
-ui : 啟動web界面 :8500,啟動后臺管理,默認(rèn) http://ip:8500訪問
-rejoin :使consul啟動的時候加入集群中。
-config-dir :配置文件目錄,里面所有以.json結(jié)尾的文件都會被加載
-client :consul服務(wù)偵聽地址,這個地址提供HTTP、DNS、RPC等服務(wù),默認(rèn)是127.0.0.1所以不對外提供服務(wù),如果要對外提供服務(wù)改成0.0.0.0, ,表示所有ip
data-dir :提供一個目錄用來存放agent的狀態(tài),所有的agent允許都需要該目錄,該目錄
必須是穩(wěn)定的,系統(tǒng)重啟后都繼續(xù)存在,通俗來講就是 數(shù)據(jù)存放目錄

額外參數(shù)
enable-script-checks=true: 允許使用腳本進(jìn)行監(jiān)控檢查
advertise=IP: 告訴集群其他節(jié)點你通過這個ip來和我通信,默認(rèn)使用bind綁定的ip
datacenter=dataCenterName: 數(shù)據(jù)中心名稱
server-port=8300:選取Leader節(jié)點(raft協(xié)議通信)和提供RPC調(diào)用的
serf-lan-port=8301: 集群通信端口,用在LAN網(wǎng)
serf-wan-port=8302: 數(shù)據(jù)中心通信端口,用在WAN網(wǎng)
http-port=8500: 提供Http服務(wù)的端口
dns-port=8600: 提供Dns服務(wù)的端口

(2).啟動客戶端

運行cosnul agent以client模式
$ consul agent -data-dir=/root/usr/local/consul/data -node=client-01 -
bind=192.168.1.132 -ui -client 0.0.0.0

(3).關(guān)聯(lián)集群

以server-01為Leader,分別在server-02、server-03、client-01節(jié)點上面運行下面命令建立集群關(guān)系
consul join 192.168.1.129
注意:分別 關(guān)閉對應(yīng)服務(wù)器的防火墻(systemctl stop firewalld),或者允許對應(yīng)端口

(4).具體操作

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
啟動服務(wù)端
把下面命令分別在對應(yīng)虛擬機(jī)上運行
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

上面三條命令分別在對應(yīng)虛擬機(jī)運行成功后,再啟動客戶端

啟動客戶端
把下面命令分別在對應(yīng)虛擬機(jī)上運行
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

操作完后,三臺服務(wù)端,一臺客戶端就啟動完成了,

關(guān)聯(lián)
以server-01(192.168.1.129)為Leader,分別在server-02、server-03、client-01節(jié)點上面運行下面命令建立集群關(guān)系, consul join 192.168.1.129
consul join 192.168.1.129
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

這樣以server-01為Leader的集群就創(chuàng)建好了,瀏覽器打開web ui,可以看見:在server-01的服務(wù)器上,關(guān)聯(lián)了三個服務(wù)(2個服務(wù)端,1個客戶端),圖示如下:

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

好了,集群就搭建好了

(5).查看consul成員和集群狀態(tài)

consul members
節(jié)點 網(wǎng)絡(luò)地址 狀態(tài) 類型 版本 協(xié)議 數(shù)據(jù)中心 分管部分
Node Address Status Type Build Protocol DC Partition Segment
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
  1. Consul集群實現(xiàn)微服務(wù)

以上面代碼為案例,先注冊服務(wù)到server里面,把Hello微服務(wù)注冊到這個consul中,代碼只需修改server/hello/main.go中的consulConfig.Address=192.138.1.132:8500,以及Hello微服務(wù)啟動的地址,比如把127.0.0.1修改為本機(jī)地址192.168.1.111,這樣才能讓server和微服務(wù)服務(wù)器通訊,Goods微服務(wù)也類似操作,這里一個微服務(wù)對應(yīng)一個client,當(dāng)然,也可以在一個client中注冊多個微服務(wù),不過這樣的話對架構(gòu)不好

注意:需要配置consul集群地址,其中 consulConfig.Address = "192.168.234.132:8500" 為集群客戶端地址 AgentServiceRegistration 中的地址需要和當(dāng)前程序運行服務(wù)器的地址統(tǒng)一起來
package main

import (
    "context"
    "fmt"
    "net"
    "google.golang.org/grpc"
    "github.com/hashicorp/consul/api"
    "serverHello/proto/helloService"
)

//rpc遠(yuǎn)程調(diào)用的接口,需要實現(xiàn)hello.proto中定義的Hello服務(wù)接口,以及里面的方法
//1.定義遠(yuǎn)程調(diào)用的結(jié)構(gòu)體和方法,這個結(jié)構(gòu)體需要實現(xiàn)HelloServer的接口

type Hello struct{}

//SayHello方法參考hello.pb.go中的接口
/*
// HelloServer is the server API for Hello service.
type HelloServer interface {
    // 通過rpc來指定遠(yuǎn)程調(diào)用的方法:
    // SayHello方法, 這個方法里面實現(xiàn)對傳入的參數(shù)HelloReq, 以及返回的參數(shù)HelloRes進(jìn)行約束
    SayHello(context.Context, *HelloReq) (*HelloRes, error)
}
 */
func (this Hello) SayHello(c context.Context, req *helloService.HelloReq) (*helloService.HelloRes, error) {
    fmt.Println(req)
    return &helloService.HelloRes{
        Message: "你好" + req.Name,
    }, nil
}

func main() {
    //------------------------- consul服務(wù)相關(guān)----------------------
    //注冊consul服務(wù)
    //1、初始化consul配置
    consulConfig := api.DefaultConfig()
    //設(shè)置consul服務(wù)器地址: 默認(rèn)127.0.0.1:8500, 如果consul部署到其它服務(wù)器上,則填寫其它服務(wù)器地址 
    consulConfig.Address = "192.168.1.132:8500"
    //2、獲取consul操作對象
    consulClient, _ := api.NewClient(consulConfig)
    // 3、配置注冊服務(wù)的參數(shù)
    agentService := api.AgentServiceRegistration{
        ID:      "1",  // 服務(wù)id,順序填寫即可
        Tags:    []string{"test"},  // tag標(biāo)簽
        Name:    "HelloService",  //服務(wù)名稱, 注冊到服務(wù)發(fā)現(xiàn)(consul)的K
        Port:    8082, // 端口號: 需要與下面的監(jiān)聽, 指定 IP、port一致
        Address: "192.1678.1.111",  // 當(dāng)前微服務(wù)部署地址: 結(jié)合Port在consul設(shè)置為V: 需要與下面的監(jiān)聽, 指定 IP、port一致
        Check: &api.AgentServiceCheck{  //健康檢測
            TCP:      "192.1678.1.111:8082",  //前微服務(wù)部署地址,端口 : 需要與下面的監(jiān)聽, 指定 IP、port一致
            Timeout:  "5s",  // 超時時間
            Interval: "30s",  // 循環(huán)檢測間隔時間
        },
    }

    //4、注冊服務(wù)到consul上
    consulClient.Agent().ServiceRegister(&agentService)

    //------------------------- grpc相關(guān)----------------------
    //1. 初始一個 grpc 對象
    grpcServer := grpc.NewServer()
    //2. 注冊服務(wù)
    //helloService.RegisterHelloServer(grpcServer, &Hello{})
    // &Hello{}和 new(Hello)相同
    helloService.RegisterHelloServer(grpcServer, new(Hello))
    //3. 設(shè)置監(jiān)聽, 指定 IP、port
    listener, err := net.Listen("tcp", "192.1678.1.111:8082")
    if err != nil {
        fmt.Println(err)
    }
    // 4退出關(guān)閉監(jiān)聽
    defer listener.Close()
    //5、啟動服務(wù)
    grpcServer.Serve(listener)
}

修改完后,和上面啟動微服務(wù)操作一致,啟動完后,查看,如下:Leader上已經(jīng)注冊好了相關(guān)微服務(wù)了

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

然后修改微服務(wù)客服端代碼,讓consulConfig.Address = "192.168.1.132:8500"(一般連接的是consul客戶端),這樣就訪問到consul的客戶端client-01了,從客戶端就可以獲取微服務(wù)對應(yīng)數(shù)據(jù)了

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
  1. 退出集群

可以使用 Ctrl-C 優(yōu)雅的關(guān)閉Agent,中斷Agent之后可以看到服務(wù)離開了集群并關(guān)閉,在退出中,Consul提醒其他集群成員,這個節(jié)點離開了,如果強(qiáng)行殺掉進(jìn)程,集群的其他成員應(yīng)該能檢測到這個節(jié)點失效了,當(dāng)一個成員離開,他的服務(wù)和檢測也會從目錄中移除,當(dāng)一個成員失效了,他的健康狀況被簡單的標(biāo)記為危險,但是不會從目錄中移除,Consul會 自動嘗試對失效的節(jié)點進(jìn)行重連,允許他從某些網(wǎng)絡(luò)條件下恢復(fù)過來,離開的節(jié)點則不會再繼續(xù)聯(lián)系,此外,如果一個agent作為一個服務(wù)器,一個優(yōu)雅的離開是很重要的,可以避免引起潛在的可用性故障影響達(dá)成一致性協(xié)議
停止server-01 測試程序是否正常,在對應(yīng)consul服務(wù)優(yōu)雅的退出運行命令 consul leave即可
[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

然后使用命令consul members在其他三臺consul服務(wù)器上查看server-01是否停止

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

server-01停止了,在瀏覽器上,consul web server-01查詢,發(fā)現(xiàn)打不開了

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群

而在其他server consul web ui 上可以打開,并且Leader已經(jīng)發(fā)生變化(因為server-01停止了), 這樣就實現(xiàn)了負(fù)載均衡操作,客戶端訪問微服務(wù)就不會掛掉

[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群
上面講解的是一個客戶端的案例,當(dāng)然也可以一個微服務(wù)對應(yīng)一個客戶端,這樣當(dāng)一個服務(wù)器掛掉的話,就只會影響一個微服務(wù),其他的微服務(wù)不會受到影響

[上一節(jié)][golang 微服務(wù)] 4. gRPC介紹,Protobuf結(jié)合gRPC 創(chuàng)建微服務(wù)

[下一節(jié)][golang 微服務(wù)] 6. GRPC微服務(wù)集群+Consul集群+grpc-consul-resolver案例演示文章來源地址http://www.zghlxwxcb.cn/news/detail-477717.html

到了這里,關(guān)于[golang 微服務(wù)] 5. 微服務(wù)服務(wù)發(fā)現(xiàn)介紹,安裝以及consul的使用,Consul集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • prometheus基于consul的服務(wù)發(fā)現(xiàn)

    prometheus基于consul的服務(wù)發(fā)現(xiàn)

    https://developer.hashicorp.com/consul/install http://IP:8500/ui/ vim /app/consul/etc/nodes.json consul reload #加載配置文件 增加如下配置 systemctl restart prometheus 可以發(fā)現(xiàn)現(xiàn)在獲取的Targets里面有consul的字段 https://www.bilibili.com/video/BV1PT4y1P7bX/?from=searchseid=851756632097160928

    2024年02月20日
    瀏覽(17)
  • docker consul 服務(wù)注冊與發(fā)現(xiàn)

    Docker consul的容器服務(wù)更新與發(fā)現(xiàn) ------------------------------------ Consul ------------------------------------ (1)什么是服務(wù)注冊與發(fā)現(xiàn) 服務(wù)注冊與發(fā)現(xiàn)是微服務(wù)架構(gòu)中不可或缺的重要組件。起初服務(wù)都是單節(jié)點的,不保障高可用性,也不考慮服務(wù)的壓力承載,服務(wù)之間調(diào)用單純的通過接

    2024年02月09日
    瀏覽(16)
  • Docker consul、容器服務(wù)更新與發(fā)現(xiàn)

    Docker consul、容器服務(wù)更新與發(fā)現(xiàn)

    Consul服務(wù)器:192.168.188.17,consul服務(wù),nginx服務(wù),consul-template守護(hù)進(jìn)程 Registrator服務(wù)器:192.168.188.11,registrator容器,nginx容器 建立consul服務(wù)器 mkdir /opt/consul cp consul_0.9.2_linux_amd64.zip /opt/consul cd /opt/consul unzip consul_0.9.2_linux_amd64.zip mv consul /usr/local/bin/ 設(shè)置代理 在后臺啟動consul服務(wù)

    2024年01月19日
    瀏覽(29)
  • Docker consul容器服務(wù)自動發(fā)現(xiàn)和更新

    Docker consul容器服務(wù)自動發(fā)現(xiàn)和更新

    目錄 一、什么是服務(wù)注冊與發(fā)現(xiàn)???????? 二、Docker-consul集群 1.Docker-consul 2.registrator 3.Consul-template 三、Docker-consul實現(xiàn)過程 四、Docker-consul集群配置 1.下載consul服務(wù) 2.web服務(wù)器啟動多例nginx容器,使用registrator自動發(fā)現(xiàn) 3.使用nginx做反向代理,使用Consul-template配置自動修改配

    2024年02月10日
    瀏覽(25)
  • 【Docker】Consul的容器服務(wù)更新與發(fā)現(xiàn)

    【Docker】Consul的容器服務(wù)更新與發(fā)現(xiàn)

    服務(wù)注冊與發(fā)現(xiàn)是微服務(wù)架構(gòu)中不可或缺的重要組件。起初服務(wù)都是單節(jié)點的,不保障高可用性,也不考慮服務(wù)的壓力承載,服務(wù)之間調(diào)用單純的通過接口訪問。直到后來出現(xiàn)了多個節(jié)點的分布式架構(gòu),起初的解決手段是在服務(wù)前端負(fù)載均衡,這樣前端必須要知道所有后端服

    2024年02月15日
    瀏覽(23)
  • Docker consul 容器服務(wù)自動發(fā)現(xiàn)和更新

    Docker consul 容器服務(wù)自動發(fā)現(xiàn)和更新

    目錄 一、什么是服務(wù)注冊與發(fā)現(xiàn) 二、Docker-consul集群 1.Docker-consul consul提供的一些關(guān)鍵特性 2.registrator 3.Consul-template 三、Docker-consul實現(xiàn)過程 以配置nginx負(fù)載均衡為例 先配置consul-agent ,有兩種模式server和client 四、Docker-consul集群配置 下載consul服務(wù) 常用啟動選項 web服務(wù)器啟動多

    2024年02月10日
    瀏覽(22)
  • Eureka、Zookeeper、Consul服務(wù)注冊與發(fā)現(xiàn)

    Eureka、Zookeeper、Consul服務(wù)注冊與發(fā)現(xiàn)

    一、Eureka服務(wù)注冊與發(fā)現(xiàn) 1.1 概念 Eureka 是 Netflix 公司開源的一個服務(wù)注冊與發(fā)現(xiàn)的組件 。 Eureka 和其他 Netflix 公司的服務(wù)組件(例如負(fù)載均衡、熔斷器、網(wǎng)關(guān)等) 一起,被 Spring Cloud 社區(qū)整合為Spring-Cloud-Netflix 模塊。 Eureka 包含兩個組件:Eureka Server (注冊中心) 和 Eureka Clien

    2024年02月02日
    瀏覽(21)
  • Docker 之 Consul容器服務(wù)更新與發(fā)現(xiàn)

    Docker 之 Consul容器服務(wù)更新與發(fā)現(xiàn)

    服務(wù)注冊與發(fā)現(xiàn)是微服務(wù)架構(gòu)中不可或缺的重要組件。起初服務(wù)都是單節(jié)點的,不保障高可用性,也不考慮服務(wù)的壓力承載,服務(wù)之間調(diào)用單純的通過接口訪問。直到后來出現(xiàn)了多個節(jié)點的分布式架構(gòu),起初的解決手段是在服務(wù)前端負(fù)載均衡,這樣前端必須要知道所有后端服

    2024年02月15日
    瀏覽(31)
  • Docker consul的容器服務(wù)更新與發(fā)現(xiàn)

    Docker consul的容器服務(wù)更新與發(fā)現(xiàn)

    什么是服務(wù)注冊與發(fā)現(xiàn) 服務(wù)注冊與發(fā)現(xiàn)是微服務(wù)架構(gòu)中不可或缺的重要組件。起初服務(wù)都是單節(jié)點的,不保障高可用性,也不考慮服務(wù)的壓力承載,服務(wù)之間調(diào)用單純的通過接口訪問。直到后來出現(xiàn)了多個節(jié)點的分布式架構(gòu),起初的解決手段是在服務(wù)前端負(fù)載均衡,這樣前端

    2024年02月08日
    瀏覽(22)
  • Docker consul的容器服務(wù)注冊與發(fā)現(xiàn)

    Docker consul的容器服務(wù)注冊與發(fā)現(xiàn)

    nacos(轉(zhuǎn)給微服務(wù))、Eureka和consul一樣,也是服務(wù)注冊與發(fā)現(xiàn) 服務(wù)注冊與發(fā)現(xiàn)是微服務(wù)架構(gòu)中不可或缺的重要組件。起初服務(wù)都是單節(jié)點的,不保障高可用性,也不考慮服務(wù)的壓力承載,服務(wù)之間調(diào)用單純的通過接口訪問。直到后來出現(xiàn)了多個節(jié)點的分布式架構(gòu),起初的解決

    2024年02月11日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包