亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 利用go-kit組件進行服務注冊與發現和健康檢查的操作

利用go-kit組件進行服務注冊與發現和健康檢查的操作

熱門標簽:壽光微信地圖標注 涿州代理外呼系統 外呼系統用什么卡 excel地圖標注分布數據 外呼系統顯本地手機號 評價高的400電話辦理 百度地圖標注后傳給手機 阿克蘇地圖標注 電話機器人軟件免費

在go的微服務架構中

使用go-kit組件進行開發微服務

type Reg struct {
	Host string
	Port int
	Client consul.Client
}
func MakeReg (host string , port int) (*Reg , error) {
	reg := api.DefaultConfig()
	reg.Address = host + ":" + strconv.Itoa(port)
	apiclient , err = api.NewClient(reg)
	if err != nil {
		return nil , err
	}
	client := consul.NewClient(apiclient)
	return Reg{Host : host , Port : port ,Client : client} , nil
}
func (r Reg) Resiter (servicename , tag , host , seviceid ,checkinter ,healthcheckhttp ,deregisterafter string , port int) bool {
	congig := api.AgentServiceRegistration{
		Port : port ,
		Address : host ,
		Name := servicename,
		ID := serviceid,
		Ckeck : api.AgentServiceCheck{
			Interval : checkinter,
			HTTP : "http://" + host + ":" + healthcheckhttp ,
			DeregisterCriticalServiceAfter : deregisterafter,
		}
	}
	if err := r.Client.Register(config) ; err != nil {
		fmt.Println(err)
		return false
	}
	return true
}
func (r Reg) Deregister (serviceid string) bool {
	dreg := api.AgentServiceRegistration{ID : serviceid}
	if err != r.Client.Deregister(config) ; err != nil {
		fmt.Println(err)
		return false
	}
	return true
}
func (r Reg) discover (servicename , tag string ,passingonly bool) ( []*api.ServiceEntry ,error ) {
	if entries ,_ ,err := r.Client.Service(servicename , tag , passingonly , nil) ;err != nil {
		return nil ,err
	}else{
		return entries , nil
	}
}

補充:go-kit 與 grpc 結合實現注冊發現與負載均衡

介紹

grpc提供了簡單的負載均衡,需要自己實現服務發現resolve。我們既然要使用go-kit來治理微服務,那么我們就使用go-kit的注冊發現、負載均衡機制。

go-kit官方【stringsvc3】例子中使用的負載均衡方案是通過服務端轉發進行,翻找下源碼go-kit的服務注冊發現、負載均衡在【sd】包中。下面我們介紹怎么通過go-kit進行客戶端負載均衡。

go-kit提供的注冊中心

1、 etcd

2、 consul

3、 eureka

4、 zookeeper

go-kit提供的負載均衡

1、 random[隨機]

2、 roundRobin[輪詢]

只需實現Balancer接口,我們可以很容易的增加其它負載均衡機制

type Balancer interface {  
   Endpoint() (endpoint.Endpoint, error)  
}

etcd注冊發現

etcd和zookeeper類似是一個高可用、強一致性的存儲倉庫,擁有服務發現功能。 我們就通過go-kit提供的etcd包來實現服務注冊發現

服務端代碼

服務注冊

1、連接注冊中心

2、注冊當前服務

var (  
   //etcd服務地址  
   etcdServer = "127.0.0.1:2379"   
   //服務的信息目錄  
   prefix     = "/services/book/"    
   //當前啟動服務實例的地址  
   instance   = "127.0.0.1:50052"  
   //服務實例注冊的路徑  
   key        = prefix + instance    
   //服務實例注冊的val  
   value      = instance  
   ctx        = context.Background()  
   //服務監聽地址  
   serviceAddress = ":50052"  
)  
//etcd的連接參數  
options := etcdv3.ClientOptions{  
   DialTimeout: time.Second * 3,  
   DialKeepAlive: time.Second * 3,  
}  
//創建etcd連接  
client, err := etcdv3.NewClient(ctx, []string{etcdServer}, options)  
if err != nil {  
   panic(err)  
}  
// 創建注冊器  
registrar := etcdv3.NewRegistrar(client, etcdv3.Service{  
   Key:   key,  
   Value: value,  
}, log.NewNopLogger())  
// 注冊器啟動注冊  
registrar.Register()

完整代碼

package main  
import (  
   "grpc-test/pb"  
   "context"  
   grpc_transport "github.com/go-kit/kit/transport/grpc"  
   "github.com/go-kit/kit/endpoint" 
   "google.golang.org/grpc" 
   "net" 
   "github.com/go-kit/kit/sd/etcdv3" 
   "github.com/go-kit/kit/log" 
   "time"
)  
type BookServer struct {  
   bookListHandler  grpc_transport.Handler  
   bookInfoHandler  grpc_transport.Handler  
}  
//通過grpc調用GetBookInfo時,GetBookInfo只做數據透傳, 調用BookServer中對應Handler.ServeGRPC轉交給go-kit處理  
func (s *BookServer) GetBookInfo(ctx context.Context, in *book.BookInfoParams) (*book.BookInfo, error) {  
   _, rsp, err := s.bookInfoHandler.ServeGRPC(ctx, in)  
   if err != nil {  
      return nil, err  
   }  
   return rsp.(*book.BookInfo),err  
}  
//通過grpc調用GetBookList時,GetBookList只做數據透傳, 調用BookServer中對應Handler.ServeGRPC轉交給go-kit處理  
func (s *BookServer) GetBookList(ctx context.Context, in *book.BookListParams) (*book.BookList, error) {  
   _, rsp, err := s.bookListHandler.ServeGRPC(ctx, in)  
   if err != nil {  
      return nil, err  
   }  
   return rsp.(*book.BookList),err  
}  
//創建bookList的EndPoint  
func makeGetBookListEndpoint() endpoint.Endpoint {  
   return func(ctx context.Context, request interface{}) (interface{}, error) {  
      //請求列表時返回 書籍列表  
      bl := new(book.BookList)  
      bl.BookList = append(bl.BookList, book.BookInfo{BookId:1,BookName:"21天精通php"})  
      bl.BookList = append(bl.BookList, book.BookInfo{BookId:2,BookName:"21天精通java"})  
      return bl,nil  
   }  
}  
//創建bookInfo的EndPoint  
func makeGetBookInfoEndpoint() endpoint.Endpoint {  
   return func(ctx context.Context, request interface{}) (interface{}, error) {  
      //請求詳情時返回 書籍信息  
      req := request.(*book.BookInfoParams)  
      b := new(book.BookInfo)  
      b.BookId = req.BookId  
      b.BookName = "21天精通php"  
      return b,nil  
   }  
}  
func decodeRequest(_ context.Context, req interface{}) (interface{}, error) {  
   return req, nil  
}  
func encodeResponse(_ context.Context, rsp interface{}) (interface{}, error) {  
   return rsp, nil  
}  
func main() {  
   var (  
      //etcd服務地址  
      etcdServer = "127.0.0.1:2379"  
      //服務的信息目錄  
      prefix     = "/services/book/"  
      //當前啟動服務實例的地址  
      instance   = "127.0.0.1:50052"  
      //服務實例注冊的路徑  
      key        = prefix + instance  
      //服務實例注冊的val  
      value      = instance  
      ctx        = context.Background()  
      //服務監聽地址  
      serviceAddress = ":50052"  
   )  
   //etcd的連接參數  
   options := etcdv3.ClientOptions{  
      DialTimeout: time.Second * 3,  
      DialKeepAlive: time.Second * 3,  
   }  
   //創建etcd連接  
   client, err := etcdv3.NewClient(ctx, []string{etcdServer}, options)  
   if err != nil {  
      panic(err)  
   }  
   // 創建注冊器  
   registrar := etcdv3.NewRegistrar(client, etcdv3.Service{  
      Key:   key,  
      Value: value,  
   }, log.NewNopLogger())  
   // 注冊器啟動注冊  
   registrar.Register()  
   bookServer := new(BookServer)  
   bookListHandler := grpc_transport.NewServer(  
      makeGetBookListEndpoint(),  
      decodeRequest,  
      encodeResponse,  
   )  
   bookServer.bookListHandler = bookListHandler  
   bookInfoHandler := grpc_transport.NewServer(  
      makeGetBookInfoEndpoint(),  
      decodeRequest,  
      encodeResponse,  
   )  
   bookServer.bookInfoHandler = bookInfoHandler  
   ls, _ := net.Listen("tcp", serviceAddress)  
   gs := grpc.NewServer(grpc.UnaryInterceptor(grpc_transport.Interceptor))  
   book.RegisterBookServiceServer(gs, bookServer)  
   gs.Serve(ls)  
}

客戶端代碼

客戶端流程

1、 連接注冊中心

2、 獲取提供的服務

3、 監聽服務目錄變化,目錄變化更新本地緩存

4、 創建負載均衡器

5、 獲取請求的 endPoint

完整代碼

package main  
import (  
   "context"  
   "github.com/go-kit/kit/sd/etcdv3" 
   "time" 
   "github.com/go-kit/kit/sd" 
   "github.com/go-kit/kit/log" 
   "github.com/go-kit/kit/endpoint" 
   "io" 
   "github.com/go-kit/kit/sd/lb" 
   "grpc-test/pb" 
   "fmt" 
   "google.golang.org/grpc"
)  
func main() {  
   var (  
      //注冊中心地址  
      etcdServer = "127.0.0.1:2379"  
      //監聽的服務前綴  
      prefix     = "/services/book/"  
      ctx        = context.Background()  
   )  
   options := etcdv3.ClientOptions{  
      DialTimeout: time.Second * 3,  
      DialKeepAlive: time.Second * 3,  
   }  
   //連接注冊中心  
   client, err := etcdv3.NewClient(ctx, []string{etcdServer}, options)  
   if err != nil {  
      panic(err)  
   }  
   logger := log.NewNopLogger()  
   //創建實例管理器, 此管理器會Watch監聽etc中prefix的目錄變化更新緩存的服務實例數據  
   instancer, err := etcdv3.NewInstancer(client, prefix, logger)  
   if err != nil {  
      panic(err)  
   }  
   //創建端點管理器, 此管理器根據Factory和監聽的到實例創建endPoint并訂閱instancer的變化動態更新Factory創建的endPoint  
   endpointer := sd.NewEndpointer(instancer, reqFactory, logger)  
   //創建負載均衡器  
   balancer := lb.NewRoundRobin(endpointer)  
   /**  
   我們可以通過負載均衡器直接獲取請求的endPoint,發起請求  
   reqEndPoint,_ := balancer.Endpoint() 
   */  
   /**  
   也可以通過retry定義嘗試次數進行請求  
   */  
   reqEndPoint := lb.Retry(3, 3*time.Second, balancer)  
   //現在我們可以通過 endPoint 發起請求了  
   req := struct{}{}  
   if _, err = reqEndPoint(ctx, req); err != nil {  
      panic(err)  
   }  
}  
//通過傳入的 實例地址  創建對應的請求endPoint  
func reqFactory(instanceAddr string) (endpoint.Endpoint, io.Closer, error) {  
   return func(ctx context.Context, request interface{}) (interface{}, error) {  
      fmt.Println("請求服務: ", instanceAddr)
      conn, err := grpc.Dial(instanceAddr, grpc.WithInsecure())  
      if err != nil {  
         fmt.Println(err)  
         panic("connect error")  
      }  
      defer conn.Close()  
      bookClient := book.NewBookServiceClient(conn)  
      bi,_:=bookClient.GetBookInfo(context.Background(),book.BookInfoParams{BookId:1})  
      fmt.Println("獲取書籍詳情")  
      fmt.Println("bookId: 1", " => ", "bookName:", bi.BookName)  
      bl,_ := bookClient.GetBookList(context.Background(), book.BookListParams{Page:1, Limit:10})  
      fmt.Println("獲取書籍列表")  
      for _,b := range bl.BookList {  
         fmt.Println("bookId:", b.BookId, " => ", "bookName:", b.BookName)  
      }  
      return nil,nil  
   },nil,nil  
} 

測試

請求測試

請求服務: 127.0.0.1:50052
獲取書籍詳情
bookId: 1  =>  bookName: 21天精通php
獲取書籍列表
bookId: 1  =>  bookName: 21天精通php
bookId: 2  =>  bookName: 21天精通java

負載均衡測試

1、 修改server的注冊監聽端口,啟動多個server

instance   = "127.0.0.1:50052"  
serviceAddress = ":50052"

2、client發起多次請求

req := struct{}{}  
for i := 1; i = 8; i++ {  
   if _, err = reqEndPoint(ctx, req); err != nil {  
      panic(err)  
   }  
}

通過返回結果中記錄的請求地址,我們可以看到已經按照輪詢的方式請求不同的微服務實例。

請求服務:  127.0.0.1:50051
        獲取書籍詳情
        bookId: 1  =>  bookName: 21天精通php
        獲取書籍列表
        bookId: 1  =>  bookName: 21天精通php
        bookId: 2  =>  bookName: 21天精通java
請求服務:  127.0.0.1:50052
        獲取書籍詳情
        bookId: 1  =>  bookName: 21天精通php
        獲取書籍列表
        bookId: 1  =>  bookName: 21天精通php
        bookId: 2  =>  bookName: 21天精通java
請求服務:  127.0.0.1:50051
        獲取書籍詳情
        bookId: 1  =>  bookName: 21天精通php
        獲取書籍列表
        bookId: 1  =>  bookName: 21天精通php
        bookId: 2  =>  bookName: 21天精通java
請求服務:  127.0.0.1:50052
        獲取書籍詳情
        bookId: 1  =>  bookName: 21天精通php
        獲取書籍列表
        bookId: 1  =>  bookName: 21天精通php
        bookId: 2  =>  bookName: 21天精通java
請求服務:  127.0.0.1:50051
        獲取書籍詳情
        bookId: 1  =>  bookName: 21天精通php
        獲取書籍列表
        bookId: 1  =>  bookName: 21天精通php
        bookId: 2  =>  bookName: 21天精通java
請求服務:  127.0.0.1:50052
        獲取書籍詳情
        bookId: 1  =>  bookName: 21天精通php
        獲取書籍列表
        bookId: 1  =>  bookName: 21天精通php
        bookId: 2  =>  bookName: 21天精通java
請求服務:  127.0.0.1:50051
        獲取書籍詳情
        bookId: 1  =>  bookName: 21天精通php
        獲取書籍列表
        bookId: 1  =>  bookName: 21天精通php
        bookId: 2  =>  bookName: 21天精通java
請求服務:  127.0.0.1:50052
        獲取書籍詳情
        bookId: 1  =>  bookName: 21天精通php
        獲取書籍列表
        bookId: 1  =>  bookName: 21天精通php
        bookId: 2  =>  bookName: 21天精通java
Process finished with exit code 0

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Goland 斷點調試Debug的操作
  • golang中的空slice案例
  • Go語言切片前或中間插入項與內置copy()函數詳解
  • golang中切片copy復制和等號復制的區別介紹
  • go語言中切片與內存復制 memcpy 的實現操作
  • Go語言中的UTF-8實現
  • go-kit組件使用hystrix中間件的操作

標簽:梅河口 銅川 重慶 汕頭 欽州 雞西 吐魯番 蘭州

巨人網絡通訊聲明:本文標題《利用go-kit組件進行服務注冊與發現和健康檢查的操作》,本文關鍵詞  利用,go-kit,組件,進行,服務,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《利用go-kit組件進行服務注冊與發現和健康檢查的操作》相關的同類信息!
  • 本頁收集關于利用go-kit組件進行服務注冊與發現和健康檢查的操作的相關信息資訊供網民參考!
  • 推薦文章
    久久国产精品自线拍免费| 欧美激情一区二区三区在线播放 | 国产极品白嫩美女在线观看看| 黄视频网站在线免费观看| 超级乱淫伦动漫| 国产伦久视频免费观看 视频| 国产成人欧美一区二区三区的| 免费毛片基地| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 91麻豆精品国产片在线观看| 毛片成人永久免费视频| 欧美1卡一卡二卡三新区| 黄视频网站在线免费观看| 人人干人人草| 香蕉视频一级| 免费毛片基地| 91麻豆国产级在线| 国产不卡在线观看视频| 欧美一级视频免费观看| 久久国产一区二区| 久久99这里只有精品国产| 99久久精品国产国产毛片| 久久国产一久久高清| 韩国毛片免费大片| 精品国产香蕉伊思人在线又爽又黄| 91麻豆国产级在线| 精品视频在线观看免费| 国产原创中文字幕| 日本特黄特色aaa大片免费| 国产麻豆精品hdvideoss| 久久精品道一区二区三区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 久久成人亚洲| 四虎精品在线观看| 可以在线看黄的网站| 国产不卡在线看| 精品国产亚洲人成在线| 国产成人精品综合久久久| 国产高清视频免费| 麻豆污视频| 欧美日本二区| 黄视频网站在线免费观看| 亚州视频一区二区| 韩国三级香港三级日本三级| 国产网站在线| 亚洲 男人 天堂| 日本免费看视频| 国产成a人片在线观看视频| 97视频免费在线| 久久国产一区二区| 久久久久久久免费视频| 精品视频在线观看免费| 成人影院久久久久久影院| 黄色免费三级| 韩国三级香港三级日本三级la| 日日夜人人澡人人澡人人看免| 国产伦精品一区三区视频| 国产a视频| 国产91精品一区| 二级片在线观看| 999久久久免费精品国产牛牛| 亚欧成人毛片一区二区三区四区| 日日夜夜婷婷| 国产视频一区二区三区四区 | 国产一区国产二区国产三区| 国产不卡在线观看视频| 久草免费在线视频| 精品久久久久久综合网| 日韩在线观看网站| 欧美18性精品| 天天做人人爱夜夜爽2020 | 国产a视频| 日韩在线观看免费完整版视频| 国产不卡在线播放| 午夜激情视频在线播放| 国产综合成人观看在线| 久久久久久久久综合影视网| 国产不卡在线看| 精品美女| 可以在线看黄的网站| 韩国三级视频网站| 国产极品精频在线观看| 国产一级强片在线观看| 国产精品自拍一区| 欧美一级视频免费| 黄色福利| 毛片高清| 亚洲精品永久一区| 午夜激情视频在线播放| 欧美激情一区二区三区在线 | 免费的黄色小视频| 成人a大片在线观看| 国产视频久久久久| 精品国产一区二区三区久 | 国产一区二区精品久久91| 九九精品在线播放| 青青久在线视频| 四虎影视久久久| 色综合久久久久综合体桃花网| 黄色免费网站在线| 色综合久久天天综合| 国产伦精品一区三区视频| 高清一级毛片一本到免费观看| 毛片成人永久免费视频| 欧美a免费| 久久久久久久网| 日本乱中文字幕系列 | 高清一级淫片a级中文字幕| 999精品在线| a级毛片免费观看网站| 一本伊大人香蕉高清在线观看| 精品国产三级a| 免费的黄色小视频| 日韩一级黄色片| 久草免费在线视频| 日韩一级精品视频在线观看| 韩国毛片 免费| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚飞与亚基在线观看| 国产网站在线| 91麻豆国产| 一级毛片看真人在线视频| 欧美1区| 青青久久网| 毛片电影网| 九九精品在线播放| 欧美一级视频免费观看| 精品国产一区二区三区久久久狼| 亚洲 激情| 国产综合成人观看在线| 91麻豆高清国产在线播放| 99色播| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产网站麻豆精品视频| 可以在线看黄的网站| 国产国语对白一级毛片| 精品国产一区二区三区久久久蜜臀| 麻豆污视频| 国产一区二区精品久久91| 成人免费网站久久久| 久久精品免视看国产明星| 日韩在线观看视频黄| 国产成人精品综合| 九九免费精品视频| 九九精品在线播放| 深夜做爰性大片中文| 免费的黄视频| 亚飞与亚基在线观看| 成人免费高清视频| 亚洲精品中文字幕久久久久久| 精品视频在线观看免费| 久久国产影院| 国产视频久久久久| 久久久久久久久综合影视网| 精品毛片视频| 你懂的福利视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩专区第一页| 亚洲第一页乱| 天天色成人| 美女免费毛片| 亚洲精品影院| 一级毛片看真人在线视频| 精品视频在线观看免费| 青青久在线视频| 国产原创中文字幕| 国产不卡福利| 日韩专区亚洲综合久久| 九九九网站| 国产亚洲精品aaa大片| 99久久精品费精品国产一区二区| 99色视频| 黄视频网站在线免费观看| 国产伦久视频免费观看视频| 日本特黄特色aaa大片免费| 精品国产一区二区三区精东影业 | 免费毛片基地| 国产国语在线播放视频| 精品视频一区二区三区| 一本高清在线| 欧美国产日韩在线| 99久久精品国产国产毛片| 国产福利免费观看| 天天做日日爱夜夜爽| 精品久久久久久免费影院| 日韩免费在线视频| 韩国三级视频网站| 国产一区国产二区国产三区| 欧美激情在线精品video| 成人免费高清视频| 成人免费网站视频ww| 99久久视频| 精品国产一区二区三区久| 超级乱淫黄漫画免费| 国产伦久视频免费观看 视频| 青草国产在线| 欧美日本韩国| 国产一区精品| 精品久久久久久免费影院| 91麻豆精品国产自产在线观看一区|