【GO】31.grpc 客户端负载均衡源码分析

news/2024/7/10 1:57:31 标签: golang, 负载均衡, 开发语言

这篇文章是记录自己查看客户端grpc负载均衡源码的过程,并没有太详细的讲解,参考价值不大,可以直接跳过,主要给自己看的。

一.主要接口:Balancer Resolver

1.Balancer定义

Resolver定义

具体位置为

1.grpc源码对解析器(resolver)Builder接口有三个结构体进行实现:dns,passthrough,unix。在clientconn.go文件中通过引用包在相应包的初始化方法中进行了注册

2.进入internal/resolver/passthrough/passthrough.go文件中init初始化函数中看到了将passthroughBuilder进行了注册。调用了resolver包的Register函数

func init() {
    resolver.Register(&passthroughBuilder{})
}

3.Register将注册后的结构保存在全局变量m中,是一个map。key为Scheme,value为Builder接口。我们看到grpc默认的scheme是passthrough即透传什么也不做

package resolver

import (
    "context"
    "net"
    "net/url"
    "strings"

    "google.golang.org/grpc/attributes"
    "google.golang.org/grpc/credentials"
    "google.golang.org/grpc/internal/pretty"
    "google.golang.org/grpc/serviceconfig"
)

var (
    // m is a map from scheme to resolver builder.
    m = make(map[string]Builder)
    // defaultScheme is the default scheme to use.
    defaultScheme = "passthrough"
)

// TODO(bar) install dns resolver in init(){}.

// Register registers the resolver builder to the resolver map. b.Scheme will be
// used as the scheme registered with this builder.
//
// NOTE: this function must only be called during initialization time (i.e. in
// an init() function), and is not thread-safe. If multiple Resolvers are
// registered with the same name, the one registered last will take effect.
func Register(b Builder) {
    m[b.Scheme()] = b
}

// Get returns the resolver builder registered with the given scheme.
//
// If no builder is register with the scheme, nil will be returned.
func Get(scheme string) Builder {
    if b, ok := m[scheme]; ok {
        return b
    }
    return nil
}

4.再看下passthroughBuilder,看到它实现了Buider接口,Build方法返回实现Resolver接口的结构passthroughResolver。其中passthroughBuilder用来创建解析器,passthroughResolver为创建的解析器

package passthrough

import (
    "errors"

    "google.golang.org/grpc/resolver"
)

const scheme = "passthrough"

type passthroughBuilder struct{}

func (*passthroughBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
    if target.Endpoint() == "" && opts.Dialer == nil {
        return nil, errors.New("passthrough: received empty target in Build()")
    }
    r := &passthroughResolver{
        target: target,
        cc:     cc,
    }
    r.start()
    return r, nil
}

func (*passthroughBuilder) Scheme() string {
    return scheme
}

type passthroughResolver struct {
    target resolver.Target
    cc     resolver.ClientConn
}

func (r *passthroughResolver) start() {
    r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: r.target.Endpoint()}}})
}

func (*passthroughResolver) ResolveNow(o resolver.ResolveNowOptions) {}

func (*passthroughResolver) Close() {}

func init() {
    resolver.Register(&passthroughBuilder{})
}

5.这段代码中返回的resolverBuilder就是从上面找到注册的builder,resolver.Get就是1.3中对应的代码

7.生成解析器的封装newCCResolverWrapper,并调用build将创建解析器,这个过程中调用了解析器的start方法,这个方法比较重要的是做了两件事情。1.触发选择balancer信号。2.触发状态修改(其中有负载均衡即连接的创建)

上面分别向ccBalancerWrapper的channel中发送了switchToUpdate和ccStateUpdate

balancer选择逻辑

baseBalancer会将所有地址都创建一个连接

invoke的时候,会调用picker选择连接

以上路径最终调用这个方法,可以看到是轮询使用连接


http://www.niftyadmin.cn/n/105105.html

相关文章

比特数据结构与算法(第四章_中_续②)堆解决Topk问题(最小的k个数)

TopK问题介绍:在N个数中找出最大/小的前K个 (比如在1000个数中找出最大/小的前10个)以前的方法:冒泡排序。时间复杂度: O(N^2)现在找最大的k个数的方法:方法1:堆排序降序,前N个就是最…

高级前端面试题汇总

iframe 有那些优点和缺点? iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。 优点: 用来加载速度较慢的内容(如广告)可以使脚本可以并行下载可以实现跨子域通信 缺点: iframe 会…

我的Android前沿技术—— Artifactory私服 搭建

我们说的私服,其实指的是企业局域网内的软件包依赖库。 说到软件库,就会牵扯出另一个概念——包管理器。 包管理器是在电脑中自动安装、配置、卸载和升级软件包的工具组合。包管理器由于其便捷性,被越来越多的新技术所采纳,从老…

漫谈丨集团企业的电子档案怎么管?

今天聊聊集团企业电子档案建设的话题,根据这么多年的项目实践经验,可以从以下4个角度解决。 一般情况下,集团企业档案电子化是由集团本部顶层设计,下属产业集团企业试点执行,数据需要隔离,独立应用。 集团…

2023-2-27 刷题情况

求出最多标记下标 题目描述 给你一个下标从 0 开始的整数数组 nums 。 一开始&#xff0c;所有下标都没有被标记。你可以执行以下操作任意次&#xff1a; 选择两个 互不相同且未标记 的下标 i 和 j &#xff0c;满足 2 * nums[i] < nums[j] &#xff0c;标记下标 i 和 j…

图解鼠标事件的 ScreenX ,LayerX,clientX,PageX,offsetX,X

前言&#xff1a; 完在上一篇文章 &#x1f381;如何实现原生 JS 的拖拽效果我中使用到了 MouseEvent 事件对象身上的 clienX 的属性&#xff0c;但同时我也注意到了事件对象身上关于 X 的相关属性还有很多&#xff0c;并且在移动端开发中&#xff0c;这些属性需要频繁的用到&a…

计算机网络-- 分类、体系结构(day03)

计算机网络的分类 计算机网络的性能指标 速率 数据块&#xff08;文件&#xff09;的大小单位是以2^10(1024)为一个级别递增。 例如&#xff1a; 1MB大小的文件&#xff0c;在网速为1Mbps发送的时间需要多少 文件大小的M是2进制来表示的&#xff0c;网速的M为10进制来表示的 …

尚医通(二十五)就医提醒和预约统计

目录一、就医提醒1、搭建定时任务模块二、后台管理系统-预约统计功能1、开发每天预约数据接口2、封装远程调用接口3、搭建统计分析模块4、整合统计功能前端一、就医提醒 我们通过定时任务&#xff0c;每天8点执行&#xff0c;提醒就诊 1、搭建定时任务模块 &#xff08;1&…