国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

golang grpc 負載均衡的方法

2020-04-01 18:56:18
字體:
來源:轉載
供稿:網友

微服務架構里面,每個服務都會有很多節點,如果流量分配不均勻,會造成資源的浪費,甚至將一些機器壓垮,這個時候就需要負載均衡,最簡單的一種策略就是輪詢,順序依次選擇不同的節點訪問。

grpc 在客戶端提供了負載均衡的實現,并提供了服務地址解析和更新的接口(默認提供了 DNS 域名解析的支持),方便不同服務的集成

使用示例

conn, err := grpc.Dial(  "",  grpc.WithInsecure(),  // 負載均衡,使用 consul 作服務發現  grpc.WithBalancer(grpc.RoundRobin(grpclb.NewConsulResolver(    "127.0.0.1:8500", "grpc.health.v1.add",  ))),)

創建連接的時候可以使用 WithBalancer 選項來指定負載均衡策略,這里使用 RoundRobin 算法,其實就是輪詢策略

與 consul 的集成

有了負載均衡策略,還需要一個地址解析和更新策略,可以使用 DNS 服務來實現,但如果我們使用 consul 來做服務的注冊和發現,可以通過實現 ‘naming.Resolver' 和 ‘naming.Watcher' 接口來支持

  • naming.Resolver: 實現地址解析
  • naming.Watcher: 實現節點的變更,添加或者刪除
func NewConsulResolver(address string, service string) naming.Resolver {  return &consulResolver{    address: address,    service: service,  }}type consulResolver struct {  address string  service string}func (r *consulResolver) Resolve(target string) (naming.Watcher, error) {  config := api.DefaultConfig()  config.Address = r.address  client, err := api.NewClient(config)  if err != nil {    return nil, err  }  return &consulWatcher{    client: client,    service: r.service,    addrs:  map[string]struct{}{},  }, nil}type consulWatcher struct {  client  *api.Client  service  string  addrs   map[string]struct{}  lastIndex uint64}func (w *consulWatcher) Next() ([]*naming.Update, error) {  for {    services, metainfo, err := w.client.Health().Service(w.service, "", true, &api.QueryOptions{      WaitIndex: w.lastIndex, // 同步點,這個調用將一直阻塞,直到有新的更新    })    if err != nil {      logrus.Warn("error retrieving instances from Consul: %v", err)    }    w.lastIndex = metainfo.LastIndex    addrs := map[string]struct{}{}    for _, service := range services {      addrs[net.JoinHostPort(service.Service.Address, strconv.Itoa(service.Service.Port))] = struct{}{}    }    var updates []*naming.Update    for addr := range w.addrs {      if _, ok := addrs[addr]; !ok {        updates = append(updates, &naming.Update{Op: naming.Delete, Addr: addr})      }    }    for addr := range addrs {      if _, ok := w.addrs[addr]; !ok {        updates = append(updates, &naming.Update{Op: naming.Add, Addr: addr})      }    }    if len(updates) != 0 {      w.addrs = addrs      return updates, nil    }  }}func (w *consulWatcher) Close() {  // nothing to do}

參考鏈接

gRPC Name Resolution: https://github.com/grpc/grpc/blob/master/doc/naming.md

Load Balancing in gRPC: https://github.com/grpc/grpc/blob/master/doc/load-balancing.md

dns_resolver: https://github.com/grpc/grpc-go/blob/30fb59a4304034ce78ff68e21bd25776b1d79488/naming/dns_resolver.go

代碼地址: https://github.com/hatlonely/hellogolang/blob/master/sample/addservice/cmd/client/main.go

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永胜县| 凉城县| 沧州市| 荣成市| 沙坪坝区| 许昌县| 当阳市| 堆龙德庆县| 凤冈县| 江川县| 巢湖市| 明光市| 广宗县| 永顺县| 会理县| 武鸣县| 宜都市| 二手房| 河南省| 开远市| 郑州市| 大足县| 龙州县| 楚雄市| 万州区| 黄冈市| 鹤山市| 镇远县| 历史| 万州区| 乌拉特前旗| 甘肃省| 都安| 濮阳县| 永春县| 临泉县| 漳州市| 上蔡县| 宝丰县| 康马县| 安顺市|