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

go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

etcd簡介

淺談etcd服務(wù)注冊與發(fā)現(xiàn)

etcd官網(wǎng)

etcd中文文檔

apt安裝etcd,啟動命令十分簡單etcd。

go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd

etcd分為v2版本和v3版本,命令有所不一樣,使用命令etcdctl h查看

go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd
如上圖所示并沒有出現(xiàn)API的版本,此時(shí)是使用默認(rèn)的v2版本,但是v2版本很多命令使用不了,因此切換為v3版本,命令如下:

# 設(shè)置命令為v3
export ETCDCTL_API=3

# 查看所有的key,會出現(xiàn)兩行,第一行key,第二行value
etcdctl get --prefix ""

go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd

etcd是一個(gè)k-v存儲的格式和redis類似,使用etcdctl set k v存儲數(shù)據(jù),使用etcdctl get k獲取數(shù)據(jù)。

go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd

go中使用etcd

安裝

go get go.etcd.io/etcd/clientv3

客戶端代碼

package main

import (
	"context"
	"fmt"
	"go.etcd.io/etcd/clientv3"
	"time"
)
// etcd client put/get demo
// use etcd/clientv3

func main() {
	cli, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"127.0.0.1:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		// handle error!
		fmt.Printf("connect to etcd failed, err:%v\n", err)
		return
	}
	fmt.Println("connect to etcd success")
	defer cli.Close()
	//put
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	_, err = cli.Put(ctx, "zhangsan", "yes")
	cancel()
	if err != nil {
		fmt.Printf("put to etcd failed, err:%v\n", err)
		return
	}
	// get
	ctx, cancel = context.WithTimeout(context.Background(), time.Second)
	resp, err := cli.Get(ctx, "zhangsan")
	cancel()
	if err != nil {
		fmt.Printf("get from etcd failed, err:%v\n", err)
		return
	}
	for _, ev := range resp.Kvs {
		fmt.Printf("%s:%s\n", ev.Key, ev.Value)
	}
}

啟動etcd服務(wù)器

etcd --listen-client-urls 'http://0.0.0.0:2379' --advertise-client-urls 'http://0.0.0.0:2379'

不要直接etcd啟動,會報(bào)錯(cuò)context deadline exceeded

go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd

運(yùn)行客戶端代碼
go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd
可以看出etcd是鍵值對存儲的。

go-zero使用etcd

etcd最具特色的功能是訂閱與發(fā)布監(jiān)測變更,在etcd作為服務(wù)注冊與查找時(shí),etcd提供了檢測功能,開啟該功能后會持續(xù)想etcd服務(wù)器發(fā)送心跳,如果服務(wù)停掉或者心跳停止,etcd服務(wù)器就會刪除該次記錄(服務(wù)器自主完成)。

一般來說,rpc服務(wù)連接etcd服務(wù)器發(fā)送心跳,實(shí)現(xiàn)服務(wù)到服務(wù)調(diào)度中心的注冊,服務(wù)名稱和地址被存儲到etcd服務(wù)器,另一個(gè)服務(wù)調(diào)用時(shí)不是直接連接rpc服務(wù)器,而是先根據(jù)服務(wù)名稱在etcd中找到ip地址,在通過ip地址調(diào)用服務(wù)。這樣以來服務(wù)名稱和其對于的地址就與源代碼解耦,在部署到不同ip的服務(wù)器時(shí)無需修改源代碼。

  1. 開啟etcd服務(wù)器

etcd --listen-client-urls 'http://0.0.0.0:2379' --advertise-client-urls 'http://0.0.0.0:2379'
go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd

  1. key存儲并開啟心跳檢測
package main

import (
	"context"
	"fmt"
	"go.etcd.io/etcd/clientv3"
	"time"
)

func main() {
	config := clientv3.Config{
		Endpoints:   []string{"localhost:2379"},
		DialTimeout: 5 * time.Second,
	}

	client, err := clientv3.New(config)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer client.Close()

	lease := clientv3.NewLease(client)                      // 創(chuàng)建一個(gè)心跳檢測
	leaseResp, err := lease.Grant(context.Background(), 10) // 配置檢測超時(shí) 10秒,查過檢測時(shí)間etcd服務(wù)器自動刪除k-v鍵值對
	if err != nil {
		fmt.Println(err)
		return
	}
	leaseRespChan, _ := lease.KeepAlive(context.Background(), leaseResp.ID) // 通過keeplive方法定期發(fā)送心跳

	kv := clientv3.NewKV(client)
	key := fmt.Sprintf("/services/http/%d", leaseResp.ID)
	value := `{"host": "localhost", "port": 2379}`
	fmt.Println("key", key)

	// 綁定帶有心跳的服務(wù)并將自身服務(wù)信息put到etcd中心
	_, err = kv.Put(context.Background(), key, value, clientv3.WithLease(leaseResp.ID))
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println("register service success")

	for {
		select {
		case i := <-leaseRespChan:
			fmt.Println("heart beat", i.String()) // 心跳信息
		}
	}
}

go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd

如上圖所示,服務(wù)etcd心跳會一直發(fā)送到etcd服務(wù)器,那么可以在rpc服務(wù)下啟動一個(gè)心跳,一直檢測服務(wù)的狀態(tài),rpc服務(wù)如果宕機(jī)心跳停止,etcd服務(wù)器就會刪除該服務(wù)的k-v記錄。

etcd服務(wù)器的心跳檢測時(shí)etcd服務(wù)器自動完成的,開發(fā)者只需要配置心跳時(shí)間,調(diào)用心跳方法就可以了,服務(wù)器會根據(jù)心跳自動管理數(shù)據(jù)。

在go-zero中已經(jīng)集成了etcd,通過配置文件的形式,在goctl下都會有,如下配置:

Etcd:
  Hosts:
  - 127.0.0.1:2379
  Key: rpcservice.rpc

該部分配置etcd服務(wù)器的接口和key。配置etcd服務(wù)器后需要設(shè)置心跳,如下步驟:

  1. 下載etcd客戶端
go get  go.etcd.io/etcd/clientv3
  1. 配置客戶端調(diào)用心跳函數(shù)
//etcd服務(wù)端啟動
etcdConfig := clientv3.Config{
	Endpoints:   []string{"localhost:2379"},
	DialTimeout: 5 * time.Second,
}
//etcd客戶端
etcdClient, err := clientv3.New(etcdConfig)
if err != nil {
	println(err)
	return
}
defer etcdClient.Close()

//配置心跳
lease := clientv3.NewLease(etcdClient)
lgr, err := lease.Grant(context.Background(), 10) //10秒發(fā)送一次心跳
if err != nil {
	println(err)
	return
}
c2, _ := lease.KeepAlive(context.Background(), lgr.ID)

//通過客戶端獲取k-v存儲對象
k := clientv3.NewKV(etcdClient)
key := "order.rpc"        //可以同配置文件中獲取
value := "localhost:2379" //不同服務(wù)器的ip不一樣,這里設(shè)置為localhost或者通過方法獲取本機(jī)ip也可以
k.Put(context.Background(), key, value, clientv3.WithLease(lgr.ID))

//打印心跳檢測返回的數(shù)據(jù)
for {
	if len(c2) != 0 {
		fmt.Println("heart beat ", <-c2)
	}
}

報(bào)錯(cuò)如下:

# github.com/coreos/etcd/clientv3/balancer/picker
C:\Users\sspaas\go\pkg\mod\github.com\coreos\etcd@v3.3.27+incompatible\clientv3\balancer\picker\err.go:37:53: undefined: balancer.PickOptions
C:\Users\sspaas\go\pkg\mod\github.com\coreos\etcd@v3.3.27+incompatible\clientv3\balancer\picker\roundrobin_balanced.go:55:63: undefined: balancer.PickOptions
# github.com/coreos/etcd/clientv3/balancer/resolver/endpoint
C:\Users\sspaas\go\pkg\mod\github.com\coreos\etcd@v3.3.27+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:114:87: undefined: resolver.BuildOption
C:\Users\sspaas\go\pkg\mod\github.com\coreos\etcd@v3.3.27+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:182:40: undefined: resolver.ResolveNowOption

go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd
原因時(shí)grpc和etcd版本沖突問題參考

又報(bào)錯(cuò):
go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd
原因主要是etcd中使用的bbolt和grpc版本沖突引起參考

解決沖突后,在服務(wù)氣短通過檢測心跳的方式將rpc的名稱為ip的k-v存儲到rpc服務(wù)器中,然后通過其他客戶端通過服務(wù)名稱獲取值后進(jìn)行rpc遠(yuǎn)程調(diào)用即可。

客戶端程序

如果遇到zero集成的etcd和grpc有沖突的話,使用獨(dú)立的etcd,不要在使用zero集成的etcd。代碼如下:

package main

import (
	"context"
	"fmt"
	"time"

	"go.etcd.io/etcd/clientv3"
)

// etcd client put/get demo
// use etcd/clientv3

func main() {
	cli, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"127.0.0.1:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		// handle error!
		fmt.Printf("connect to etcd failed, err:%v\n", err)
		return
	}
	fmt.Println("connect to etcd success")
	defer cli.Close()
	//put
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	_, err = cli.Put(ctx, "zhangsan", "yes")
	cancel()
	if err != nil {
		fmt.Printf("put to etcd failed, err:%v\n", err)
		return
	}
	// get
	ctx, cancel = context.WithTimeout(context.Background(), time.Second)
	resp, err := cli.Get(ctx, "demo.rpc")
	cancel()
	if err != nil {
		fmt.Printf("get from etcd failed, err:%v\n", err)
		return
	}
	for _, ev := range resp.Kvs {
		fmt.Printf("%s:%s\n", ev.Key, ev.Value)
	}
}


服務(wù)端程序

package main

import (
	"context"
	"fmt"
	"time"

	"go.etcd.io/etcd/clientv3"
)

func main() {
	config := clientv3.Config{
		Endpoints:   []string{"localhost:2379"},
		DialTimeout: 5 * time.Second,
	}

	client, err := clientv3.New(config)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer client.Close()

	lease := clientv3.NewLease(client)                      // 創(chuàng)建一個(gè)租約
	leaseResp, err := lease.Grant(context.Background(), 10) // 設(shè)置租約超時(shí) 10秒
	if err != nil {
		fmt.Println(err)
		return
	}
	leaseRespChan, _ := lease.KeepAlive(context.Background(), leaseResp.ID) // 通過keeplive定期發(fā)送心跳

	kv := clientv3.NewKV(client)
	key := "demo.rpc"
	value := "127.0.0.1:9000"
	fmt.Println("key", key)

	// 綁定帶有心跳的租約并將自身服務(wù)信息put到etcd中心
	_, err = kv.Put(context.Background(), key, value, clientv3.WithLease(leaseResp.ID))
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println("register service success")

	for {
		select {
		case i := <-leaseRespChan:
			fmt.Println("heart beat", i.String()) // 心跳信息
		}
	}
}

別忘了啟動etcd服務(wù)器

etcd --listen-client-urls 'http://0.0.0.0:2379' --advertise-client-urls 'http://0.0.0.0:2379'

go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd

服務(wù)端心跳
go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd
獲取鍵值對
go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn),SHARE,# go-zero,golang,微服務(wù),etcd

go語言學(xué)習(xí)網(wǎng)站文章來源地址http://www.zghlxwxcb.cn/news/detail-661525.html

到了這里,關(guān)于go-zero微服務(wù)實(shí)戰(zhàn)——etcd服務(wù)注冊與發(fā)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • SpringCloudAlibaba微服務(wù)實(shí)戰(zhàn)系列(一)Nacos服務(wù)注冊發(fā)現(xiàn)

    SpringCloudAlibaba微服務(wù)實(shí)戰(zhàn)系列(一)Nacos服務(wù)注冊發(fā)現(xiàn)

    實(shí)戰(zhàn)前先做一個(gè)背景了解。 單體架構(gòu):近幾年技術(shù)的飛速發(fā)展,各種各樣的服務(wù)已經(jīng)進(jìn)入到網(wǎng)絡(luò)化。單體架構(gòu)發(fā)布時(shí)只需要打成一個(gè)war或jar包發(fā)布即可;而隨著業(yè)務(wù)量激增或網(wǎng)站流量的增加,必會暴露致命缺陷。 SOA:Service Oriented Architecture 面向服務(wù)的體系結(jié)構(gòu)。旨在提升代

    2024年02月15日
    瀏覽(47)
  • go-zero的服務(wù)發(fā)現(xiàn)源碼閱讀

    go-zero的服務(wù)發(fā)現(xiàn)源碼閱讀

    服務(wù)發(fā)現(xiàn)原理與grpc源碼解析_wangxiaoangg的博客-CSDN博客 ? go-zero rpc demo官方文檔:rpc編寫與調(diào)用 | go-zero 目錄 一 服務(wù)注冊 1.?創(chuàng)建rpc服務(wù) 2. 啟動rpc服務(wù) 3.?registerEtcd做了什么 4.?discov.NewPublisher 服務(wù)發(fā)布者 二 服務(wù)發(fā)現(xiàn) 1.定義注冊resolver 2.解析etcd地址創(chuàng)建鏈接 3.update方法 在看rp

    2024年02月06日
    瀏覽(16)
  • go-zero 開發(fā)之安裝 etcd

    本文只涉及 Linux 上的安裝。 二進(jìn)制安裝 下載二進(jìn)制安裝包 下載地址示例: 解壓二進(jìn)制安裝包 刪除二進(jìn)制安裝包 版本檢查 啟動 etcd 往 etcd 寫讀數(shù)據(jù) Docker 安裝 etcd 主要使用 Google 容器注冊表(gcr.io)下的 gcr.io/etcd-development/etcd 倉庫來存儲其容器鏡像。作為次要選項(xiàng),它還使

    2024年02月04日
    瀏覽(18)
  • Go gRPC etcd實(shí)現(xiàn)服務(wù)注冊發(fā)現(xiàn)與負(fù)載均衡

    Go gRPC etcd實(shí)現(xiàn)服務(wù)注冊發(fā)現(xiàn)與負(fù)載均衡

    如果不了解go + grpc 調(diào)用方式和實(shí)現(xiàn)細(xì)節(jié),可以參考上一篇文章 golang grpc配置使用實(shí)戰(zhàn)教程 技術(shù)點(diǎn) 版本 描述 golang 1.19 基礎(chǔ)版本 grpc v1.41.0 gRPC golang包 etcd server 3.5.0 注冊中心 etcd client v3.5.8 客戶端服務(wù)發(fā)現(xiàn)和負(fù)載均衡 服務(wù)注冊依賴etcd的 key-value操作,key作為gRPC服務(wù)唯一標(biāo)識,

    2024年02月05日
    瀏覽(37)
  • 使用go-zero快速構(gòu)建微服務(wù)

    使用go-zero快速構(gòu)建微服務(wù)

    本文是對 使用go-zero快速構(gòu)建微服務(wù) [1] 的親手實(shí)踐 編寫API Gateway代碼 mkdir api goctl api -o api/bookstore.api cd api goctl api go -api bookstore.api -dir . go run bookstore.go -f etc/bookstore-api.yaml 啟動API Gateway服務(wù),默認(rèn)偵聽在8888端口 因?yàn)槟J(rèn)生成的 api/etc/bookstore-api.yml 為: 按提示下載,再次運(yùn)行

    2024年02月13日
    瀏覽(25)
  • go-zero的rpc服務(wù)案例解析

    go-zero的rpc服務(wù)案例解析

    go-zero的遠(yuǎn)程調(diào)用服務(wù)是基于gRpc的gRPC教程與應(yīng)用。 zero使用使用gRpc需要安裝 protoc 插件,因?yàn)間Rpc基于protoc插件使用protocol buffers文件生成rpc服務(wù)器和api的代碼的。 gRPC 的代碼生成還依賴 protoc-gen-go,protoc-gen-go-grpc 插件來配合生成 Go 語言的 gRPC 代碼。 也可以使用go get命令安裝

    2024年02月13日
    瀏覽(21)
  • go-zero學(xué)習(xí) 第三章 微服務(wù)

    go-zero學(xué)習(xí) 第三章 微服務(wù)

    1.1 API服務(wù)模塊 goctl 使用 api 文件生成 api服務(wù) 命令: 1.2 RPC服務(wù)模塊 goctl 使用 protoc 文件生成 rpc服務(wù) 命令: 注意: --go_out 、 --go-grpc_out 、 --zrpc_out 三者配置的路徑需要完全一致,否則會報(bào)下列錯(cuò)誤。 基礎(chǔ)代碼:已生成基本的API服務(wù)、RPC服務(wù)。 這里以API服務(wù)調(diào)用RPC服務(wù)的登

    2024年02月16日
    瀏覽(21)
  • 【go-zero】go-zero阿里云oss 前端上傳文件到go-zero API服務(wù) 并在k8s pod中創(chuàng)建文件 并推送到阿里云oss 最佳實(shí)踐

    問題:在本地通過上傳文件,然后將文件推送到aliyun的oss中,是沒問題的 但是部署到了k8s中,則出現(xiàn)了問題,一直報(bào)錯(cuò)沒有創(chuàng)建的權(quán)限 思路:開始認(rèn)為應(yīng)該將該文件掛載到configmap中,然后通過這種方式修改了deployment和dockerfile。最終發(fā)現(xiàn)應(yīng)該是go的創(chuàng)建文件路徑方式搞錯(cuò)了,

    2024年02月13日
    瀏覽(29)
  • 微服務(wù)框架 go-zero logx 日志組件剖析

    微服務(wù)框架 go-zero logx 日志組件剖析

    上一篇我們說到咱們還剩下 addTenant 功能還未實(shí)現(xiàn),不知道有沒有兄弟感興趣去實(shí)驗(yàn)一波的,本篇文章進(jìn)行簡要補(bǔ)充 根據(jù)上一篇文章分析,其實(shí)我們只需要執(zhí)行如下幾步即可: 編寫 tenant.api,提供外部 addTenant 的 http 接口 編寫 tenant.api 提供一個(gè) POST http 的接口 / api /tenant/addt

    2024年02月11日
    瀏覽(23)
  • Go-Zero微服務(wù)快速入門和最佳實(shí)踐(一)

    并發(fā)編程和分布式微服務(wù) 是我們Gopher升職加薪的關(guān)鍵。 畢竟Go基礎(chǔ)很容易搞定,不管你是否有編程經(jīng)驗(yàn),都可以比較快速的入門Go語言進(jìn)行簡單項(xiàng)目的開發(fā)。 雖說好上手,但是想和別人拉開差距,提高自己的競爭力, 搞懂分布式微服務(wù)和并發(fā)編程還是灰常重要的,這也是我

    2024年04月28日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包