grpc包实现了一个称为gRPC的RPC系统。关于gRPC的更多详细访问 grpc.io。 Constants const ( SupportPackageIsVersion3 = true SupportPackageIsVersion4 = true SupportPackageIsVersion5 = true ) 从生成的protocol buffer文件中引用SupportPackageIsVersion变量,以确保与所使用的gRPC版本兼容。最新的支持包版本为5。 保留较旧的版本是为了兼容性.。如果无法保持兼容性,则可以将其删除。 这些常量不应从任何其他代码中引用。 const PickFirstBalancerName = "pick_first" PickFirstBalancerName是pick_first负载均衡器的名字。 const Version = "1.26.0-dev" Version是当前gRPC版本。 Variables var DefaultBackoffConfig = BackoffConfig{ MaxDelay: 120 * time.Second, } DefaultBackoffConfig使用本文中的内容为backoff指定值。 弃用,改用ConnectParams代替。在整个1.x系列中都会支持它。 var EnableTracing bool EnableTracing控制是否使用golang.org/x/net/trace包跟踪RPC。仅应在此程序发送或接收任何RPC之前设置此项。 var ( // ErrClientConnClosing 表示此操作是非法的,因为ClientConn正在被关闭 // // 弃用: 用户不应该依赖此错误,使用Cancled状态码代替它 ErrClientConnClosing = status.Error(codes.Canceled, "grpc: the client connection is closing") )var ErrClientConnTimeout = errors.New("grpc: timed out when dialing") ErrClientConnTimeout表示ClientConn无法在指定的时间内建立底层连接。 弃用:grpc永远不会返回此错误,用户不应该引用它。 var ErrServerStopped = errors.New("grpc: the server has been stopped") ErrServerStopped表示此操作现在是非法的,因为服务器被停止了。 func Code func Code(err error) codes.Code 如果错误是由rpc系统产生的,那么Code返回错误代码,否则返回codes.Unknown。 弃用:使用status.Code代替。 func ErrorDesc func ErrorDesc(err error) string 如果错误是有rpc系统产生的,那么ErrorDesc返回错误的描述信息,否则返回err.Error(),当err为nil的时候返回空字符串。 弃用:使用status.Convert和Method方法代替它。 func Errorf func Errorf(c codes.Code, format string, a ...interface{}) error Errorf返回错误其中包含错误代码和描述信息,如果c的值是ok,那么返回nil。 弃用:使用status.Errorf代替。 func Invoke func Invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) error Invoke在线路上发送RPC请求,并在接收到响应后返回,这通常由生成的代码调用。 弃用:使用ClientConn.Invoke代替它。 func Method func Method(ctx context.Context) (string, bool) Metthod返回服务端上下文中method字符串,返回的字符串格式为"/service/method"。 func MethodFromServerStream func MethodFromServerStream(stream ServerStream) (string, bool) MethodFromServerStream返回输入流的method字符串,返回的字符串格式为"/service/method"。 func NewContextWithServerTransportStream func NewContextWithServerTransportStream(ctx context.Context, stream ServerTransportStream) context.Context NewContextWithServerTransportStream 从ctx创建一个新的上下文并将流附加到该上下文。此API是实验性的。 func SendHeader func SendHeader(ctx context.Context, md metadata.MD) error SendHeader发送标头元数据,做多只能调用一次,将发送由SetHeader()设置的提供的md和headers。 func SetHeader func SetHeader(ctx context.Context, md metadata.MD) error SetHeader设置标头元数据,当多次调用的时候,所有提供的元数据将会被合并。发生以下情况之一,将发送所有元数据: grpc.SendHeader()被调用 第一个响应被发送出去 RPC状态被发送(错误或成功) func SetTrailer func SetTrailer(ctx context.Context, md metadata.MD) error SetTrailer设置在RPC返回时将发送的trailer元数据,当多次调用时,所有提供的元数据将会被合并。 type Address type Address struct { // Addr是建立连接的服务器地址 Addr string // 元数据是与Addr相关的信息,用于做负载均衡决策 Metadata interface{} } Address代表客户端连接到的服务器。 弃用:使用balancer包 type BackoffConfig type BackoffConfig struct { // MaxDelay 是 backoff 延迟的上界 MaxDelay time.Duration } BackoffConfig定义缺省gRPCbackoff策略的参数。 弃用:使用ConnectParams代替,在1.x系列中都会支持。 type Balancer type Balancer interface { // 负责启动balancer的初始化工作。 // 例如,它可以启动名称解析并观察更新。它将会在dial时调用。 Start(target string, config BalancerConfig) error // 通知balancergRPC已经在addr地址连接到服务器。 // 一旦与addr的连接关闭或者丢失将会返回down。 // TODO: 目前还不清楚如何构造和利用down的有意义的错误参数, // 需要现实的需求来指导。 Up(addr Address) (down func(error)) // 获取与 ctx 对应的 RPC 的服务器地址。 // i) 如果它返回一个连接的地址,gRPC内部会在这个连接上发出到这个地址的RPC。 // ii) 如果它返回一个正在构建(有Notify(...)启动)但是还没有连接的地址, // 如果gRPC处于fail-fast连接处于TransientFailure或关闭的状态 ,那么gRPC内部构建失败, // 否则将在这个连接上发送RPC。 // iii) 如果它返回一个连接不存在的地址,gRPC内部将任务是一个错误, // 并且将使响应的RPC失败。 // 因此,在编写自定义balancer时,推荐使用以下规则。 // 如果ops.BlockingWait是true,它应该返回一个已经连接的地址或块(如果没有已连接的地址) // 在阻塞时,它应该尊重ctx的超时或取消。 // 如果opts.BlockingWait是false(对于fail-fast的RPC), // 它应该立即返回一个由Notify(...)通知的地址而不是块。 // 函数返回put,这个函数在rpc完成或者失败后被调用。 // put可以收集RPC统计数据并将其报告给远程负载均衡器。 // // 这个函数应该只返回错误的balancer而不能恢复它。 // 如果返回错误,gRPC 内部将使 RPC 失败。 Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) // 通知返回一个通道,gRPC内部使用该通道来监视gRPC需要连接的地址。 // 这些地址可能来自名称解析器或远程负载平衡器。 // gRPC内部会将其与现有的连接地址进行比较。 // 如果平衡器通知的地址不在现有的连接地址中,则gRPC将开始连接该地址。 // 如果现有连接地址中的地址不在通知列表中,则相应的连接会正常关闭。 // 否则,将不执行任何操作。 请注意,地址片必须是应连接的地址的完整列表。 // 它不是delta. Notify() <-chan []Address // 关闭 balancer Close() error } balancer为 rpc 选择网络地址。 弃用:使用balancer包,可能会在未来的1.x 版本中被删除。 func RoundRobin func RoundRobin(r naming.Resolver) Balancer RoundRobin返回一个Balancer,它选择地址循环,它使用r监视名称解析更新并相应更新可用的地址。 弃用:使用balancer/doundrobin,可能在将来的1.x版本中删除。 type BalancerConfig type BalancerConfig struct { // DialCreds是Balancer实施可用于拨号到远程负载均衡器服务器的传输凭据。 // 如果Balancer实现不需要安全地与另一方通话,则可以忽略此设置。 DialCreds credentials.TransportCredentials // Dialer是Balancer实现可用于拨打到远程负载均衡器服务器的自定义拨号器。 // Balancer实现如果不需要与远程平衡器通信,可以忽略此操作。 Dialer func(context.Context, string) (net.Conn, error) } BalancerConfig指定Balancer的配置。 弃用:使用balancer包,可能在将来的1.x版本中删除。 type BalancerGetOptions type BalancerGetOptions struct { // Blockingwait 指定当没有连接地址时 Get 是否应该阻塞。 BlockingWait bool } Balancergetutions 配置 Get 调用。 弃用:使用balancer包,可能在将来的1.x版本中删除。 type CallOption type CallOption interface { // contains filtered or unexported methods } CallOption在调用开始前配置它,或在完成之后从调用中提取信息。 func CallContentSubtype func CallContentSubtype(contentSubtype string) CallOption Callcontentsubtype 返回一个 CallOption,该 CallOption 将为调用设置 content-subtype。 例如,如果 content-subtype 是“ json” ,那么连接上的 Content-Type 将是application / grpc + json。 Content-type 中包含内容子类型之前,会将其转换为小写形式。更多细节请参见这里。 如果不使用 ForceCodec,那么将使用 content-subtype 在 RegisterCodec 控制的注册表中查找要使用的 Codec。 有关注册的详细信息,请参阅 RegisterCodec 上的文档。 内容子类型的查找不区分大小写。 如果没有找到这样的编解码器,调用将导致代码错误。 如果还使用了 ForceCodec,那么该 Codec 将用于所有请求和响应消息,对于请求,其内容子类型设置为给定的 contentSubtype。 func CallCustomCodec func CallCustomCodec(codec Codec) CallOption Callcustomcodec 的行为类似于 ForceCodec,但是接受 grpc.Codec 而不是 encoding.Codec。 弃用: 使用 ForceCodec代替它。 func FailFast func FailFast(failFast bool) CallOption FailFast 是 WaitForReady 的反义词。 弃用:使用WaitForReady func ForceCodec func ForceCodec(codec encoding.Codec) CallOption Forcecodec 返回一个 CallOption,它将设置给定的 Codec 用于调用的所有请求和响应消息。 调用 String ()的结果将以不区分大小写的方式用作 content-subtype。 更多关于Content-Type的细节看这里。有关 Codec 和 content-subtype 之间交互的更多细节,请参阅 RegisterCodec 和 CallContentSubtype 的文档。 这个函数是为高级用户提供的; 更喜欢只使用 CallContentSubtype 来选择已注册的编解码器。 这是一个实验性的 API。 func Header func Header(md *metadata.MD) CallOption Header 返回一个 CallOptions,用于检索普通 RPC 的 Header 元数据。 func MaxCallRecvMsgSize func MaxCallRecvMsgSize(s int) CallOption