Consul 在微服務架構中的應用與最佳實踐
一、consul 安裝
1、consul 安裝說明
- 下載 consul:https://releases.hashicorp.com/consul/ 從中選擇版本下載,得到 zip 壓縮包
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
-
consul agent
-
-bind=0.0.0.0 指定 consul 所在機器的 IP 地址。默認值:0.0.0.0
-
-http-port=8500 consul 自帶一個 web 訪問的默認端口:8500
-
-client=127.0.0.1 表明哪些機器可以訪問 consul 。默認本機。0.0.0.0 所有機器均可訪問。
-
-config-dir=foo 所有主動註冊服務的 描述信息
-
-data-dir=path 儲存所有註冊過來的 srv 機器的詳細信息。
-
-dev 開發者模式,直接以默認配置啓動 consul
-
-node=hostname 服務發現的名字。
-
-rejoin consul 啓動的時候,加入到的 consul 集羣
-
-server 以服務方式開啓 consul, 允許其他的 consul 連接到開啓的 consul 上 (形成集羣)。如果不加 -server, 表示以 “客戶端” 的方式開啓。不能被連接。
-
-ui 可以使用 web 頁面 來查看服務發現的詳情
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
啓動 Google 瀏覽器, 測試:
http://192.168.56.100:8500/ui/dc1/services
- 其他常用命令
root@dev:demo# consul members # 查看集羣有哪些成員
root@dev:demo# consul info # 查看當前 consul 的 IP 信息
root@dev:demo# consul leave # 優雅的關閉 consul 。—— 不優雅!Ctrl -c
4、註冊服務到 consul 並查看
- 服務註冊 web.json 文件
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