91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在golang中使用grpc實現負載均衡

發布時間:2021-05-19 16:38:45 來源:億速云 閱讀:283 作者:Leah 欄目:編程語言

這篇文章給大家介紹怎么在golang中使用grpc實現負載均衡,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

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

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
}

什么是golang

golang 是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言,其語法與 C語言相近,但并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能。

關于怎么在golang中使用grpc實現負載均衡就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

普宁市| 无为县| 金沙县| 鲁甸县| 东方市| 东光县| 冕宁县| 无为县| 兰坪| 兴海县| 东源县| 淮北市| 南郑县| 彭泽县| 皋兰县| 沾化县| 措美县| 托克托县| 洪雅县| 道真| 阜新| 闵行区| 鱼台县| 文化| 神池县| 惠安县| 正安县| 绥阳县| 崇仁县| 镇江市| 清苑县| 盐津县| 陆河县| 阜新市| 大同市| 临泽县| 霍城县| 德阳市| 苍南县| 石泉县| 玉环县|