Consul 在微服務架構中的應用與最佳實踐

一、consul 安裝

1、consul 安裝說明

root@dev:opt#  cd /opt
root@dev:opt#  wget https://releases.hashicorp.com/consul/1.5.2/consul_1.5.2_linux_amd64.zip
root@dev:opt#  unzip consul_1.5.2_linux_amd64.zip
root@dev:opt#  mv consul /usr/local/bin/
root@dev:opt#  consul -h

2、consul 常用命令

root@dev:opt#  consul agent dev      # 開發dev模式啓動consul

3、測試上述命令

# 在終端中,鍵入
root@dev:~#  mkdir /etc/consul.d/
root@dev:opt#  consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=n1 -bind=192.168.56.100 -ui -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0

root@dev:demo#  consul members         # 查看集羣有哪些成員
root@dev:demo#  consul info           # 查看當前 consul 的 IP 信息
root@dev:demo#  consul leave          # 優雅的關閉 consul 。—— 不優雅!Ctrl -c

4、註冊服務到 consul 並查看

root@dev:demo#  vim /etc/consul.d/web.json
{
  "service": {
    "name": "bj38",
    "tags": ["it","test"],
    "port": 8800,
    "check": {
      "id": "api",
      "name": "xnq test",
      "http": "http://192.168.56.100:8800",
      "interval": "5s",
      "timeout": "1s"
    }
  }
}
root@dev:consul.d# consul reload       # 關閉consul 再重啓
root@dev:consul.d# curl -s http://127.0.0.1:8500/v1/catalog/service/bj38     # 使用命令查看是否註冊成功

二、consul 使用

1、啓動 consul

root@dev:consul.d#  consul agent -dev

2、pb/person.proto

 root@dev:pb#  protoc --go_out=plugins=grpc:./ *.proto
syntax = "proto3";
option go_package = "./person";
package pb;
message Person {
  string name = 1;
  int32 age = 2;
}
// 添加 rpc服務
service hello {
  rpc sayHello (Person) returns (Person);
}

3、consul_server.go

package main
import (
  "context"
  "demo/pb/person"
  "fmt"
  "github.com/hashicorp/consul/api"
  "google.golang.org/grpc"
  "net"
)
// 定義類
type Children struct {
}
// 綁定類方法, 實現藉口
func (this *Children)SayHello(ctx context.Context, p *person.Person) (*person.Person, error) {
  p.Name = "hello  " + p.Name
  return p, nil
}
func main()  {
  // 把grpc服務,註冊到consul上.
  // 1. 初始化consul 配置
  consulConfig := api.DefaultConfig()
  // 2. 創建 consul 對象
  consulClient, err := api.NewClient(consulConfig)
  if err != nil {
    fmt.Println("api.NewClient err:", err)
    return
  }
  // 3. 告訴consul, 即將註冊的服務的配置信息
  reg := api.AgentServiceRegistration {
    ID:"bj38",
    Tags:[]string{"grcp", "consul"},
    Name:"grpc And Consul",
    Address:"127.0.0.1",
    Port:8800,
    Check:&api.AgentServiceCheck{
      CheckID:"consul grpc test",
      TCP:"127.0.0.1:8800",
      Timeout:"1s",
      Interval:"5s",
    },
  }
  // 4. 註冊 grpc 服務到 consul 上
  consulClient.Agent().ServiceRegister(®)
  //////////////////////以下爲 grpc 服務遠程調用//////////////////////////////
  // 1.初始化 grpc 對象,
  grpcServer := grpc.NewServer()
  // 2.註冊服務
  person.RegisterHelloServer(grpcServer, new(Children))
  // 3.設置監聽, 指定 IP/port
  listener, err := net.Listen("tcp", "127.0.0.1:8800")
  if err != nil {
    fmt.Println("Listen err:", err)
    return
  }
  defer listener.Close()
  fmt.Println("服務啓動... ")
  // 4. 啓動服務
  grpcServer.Serve(listener)
}

4、consul_client.go

package main
import (
  "context"
  "demo/pb/person"
  "fmt"
  "github.com/hashicorp/consul/api"
  "google.golang.org/grpc"
  "strconv"
)
func main()  {
  // 初始化 consul 配置
  consulConfig := api.DefaultConfig()
  // 創建consul對象 -- (可以重新指定 consul 屬性: IP/Port , 也可以使用默認)
  consulClient, err := api.NewClient(consulConfig)
  // 服務發現. 從consuL上, 獲取健康的服務
  services, _, err := consulClient.Health().Service("grpc And Consul", "grcp", true, nil)
  // 簡單的負載均衡.
  addr := services[0].Service.Address + ":" + strconv.Itoa(services[0].Service.Port)
  //////////////////////以下爲 grpc 服務遠程調用//////////////////////////////
  // 1. 鏈接服務
  //grpcConn, _ := grpc.Dial("127.0.0.1:8800", grpc.WithInsecure())
  // 使用 服務發現consul 上的 IP/port 來與服務建立鏈接
  grpcConn, _ := grpc.Dial(addr, grpc.WithInsecure())
  // 2. 初始化 grpc 客戶端
  grpcClient := person.NewHelloClient(grpcConn)
  var person person.Person
  person.Name = "Andy"
  person.Age = 18
  // 3. 調用遠程函數
  p, err := grpcClient.SayHello(context.TODO(), &person)
  fmt.Println(p, err)
}

5、consul_deregister.go

package main
import "github.com/hashicorp/consul/api"
func main()  {
  // 1. 初始化 consul 配置
  consuConfig := api.DefaultConfig()
  // 2. 創建 consul 對象
  consulClient, _ := api.NewClient(consuConfig)
  // 3. 註銷服務
  consulClient.Agent().ServiceDeregister("bj38")
}

6、頁面查看註冊結果

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/qeaU6WJtg8O6m6d9CPLQLQ