comm

package
v0.0.0-...-e3e94bd Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 4, 2024 License: Apache-2.0 Imports: 20 Imported by: 0

Documentation

Index

Constants

View Source
const (
	DefaultMaxRecvMsgSize    = 100 * 1024 * 1024
	DefaultMaxSendMsgSize    = 100 * 1024 * 1024
	DefaultConnectionTimeout = 5 * time.Second
)

Variables

View Source
var (
	ErrClientHandshakeNotImplemented = errors.New("pkg/comm: client handshake are not implemented with serverCreds")
	ErrServerHandshakeNotImplemented = errors.New("pkg/comm: server handshake are not implemented with clientCreds")
	ErrOverrideHostnameNotSupported  = errors.New("pkg/comm: OverrideServerName is not supported")
)
View Source
var (
	DefaultKeepaliveOptions = KeepaliveOptions{
		ClientPingServerInterval:    time.Minute,
		ClientPingServerTimeout:     20 * time.Second,
		ServerPingClientInterval:    2 * time.Hour,
		ServerPingClientTimeout:     20 * time.Second,
		ClientPingServerMinInterval: time.Minute,
	}
)
View Source
var (
	DefaultTLSCipherSuites = []uint16{
		tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
	}
)

Functions

This section is empty.

Types

type ClientConfig

type ClientConfig struct {
	// 创建 TLS 连接时用到的选项
	SecureOptions SecureOptions

	// 保持连接活跃的选项,包括:
	//	Client:
	//		- 客户端向服务端发送 ping 的时间间隔
	//		- 客户端等待服务端回应 ping 的超时时间
	//		- 允许客户端向服务端发送 ping 的最短时间间隔
	//	Server:
	//		- 服务端向客户端发送 ping 的时间间隔
	//		- 服务端等待客户端回应 ping 的超时时间
	KeepaliveOptions KeepaliveOptions

	// 客户端与服务端建立连接的超时等待时间
	DialTimeout time.Duration

	// 以非阻塞的形式创建连接
	AsyncConnect bool

	// 客户端允许接收的消息最大大小
	MaxRecvMsgSize int

	// 客户端允许发送的消息最大大小
	MaxSendMsgSize int
}

func (ClientConfig) Dial

func (cc ClientConfig) Dial(address string) (*grpc.ClientConn, error)

func (ClientConfig) GetGRPCDialOptions

func (cc ClientConfig) GetGRPCDialOptions() ([]grpc.DialOption, error)

type GRPCServer

type GRPCServer struct {
	// contains filtered or unexported fields
}

func NewGRPCServer

func NewGRPCServer(address string, serverConfig ServerConfig) (*GRPCServer, error)

func NewGRPCServerFromListener

func NewGRPCServerFromListener(listener net.Listener, serverConfig ServerConfig) (*GRPCServer, error)

func (*GRPCServer) Address

func (gs *GRPCServer) Address() string

func (*GRPCServer) Listener

func (gs *GRPCServer) Listener() net.Listener

func (*GRPCServer) MutualTLSRequired

func (gs *GRPCServer) MutualTLSRequired() bool

MutualTLSRequired 是否需要验证客户端身份。

func (*GRPCServer) Server

func (gs *GRPCServer) Server() *grpc.Server

func (*GRPCServer) ServerCertificate

func (gs *GRPCServer) ServerCertificate() tls.Certificate

ServerCertificate 返回服务端的身份证书。

func (*GRPCServer) SetClientRootCAs

func (gs *GRPCServer) SetClientRootCAs(clientRoots [][]byte) error

SetClientRootCAs 设置验证客户端身份的 CA 证书。

func (*GRPCServer) SetServerCertificate

func (gs *GRPCServer) SetServerCertificate(cert tls.Certificate)

func (*GRPCServer) Start

func (gs *GRPCServer) Start() error

func (*GRPCServer) Stop

func (gs *GRPCServer) Stop()

func (*GRPCServer) TLSEnabled

func (gs *GRPCServer) TLSEnabled() bool

TLSEnabled 只是返回 GRPCServer 的 TLS 配置是否不为空。

type KeepaliveOptions

type KeepaliveOptions struct {
	// ClientPingServerInterval 客户端在看不到服务端的活动时,为了检查服务端的状态,ping 服务端的时间间隔。
	ClientPingServerInterval time.Duration

	// ClientPingServerTimeout 客户端 ping 服务端后,等待的超时时间,如果在该时间段内没有收到服务端的回复,则会关闭连接。
	ClientPingServerTimeout time.Duration

	// ServerPingClientInterval 服务端在看不到客户端的活动时,为了检查客户端的状态,ping 客户端的时间间隔。
	ServerPingClientInterval time.Duration

	// ServerPingClientTimeout 服务端 ping 客户端后,等待的超时时间,如果在该时间段内没有收到客户端的回复,则会关闭连接。
	ServerPingClientTimeout time.Duration

	// ClientPingServerMinInterval 允许客户端 ping 服务端的最短时间间隔,时间间隔太短的话,客户端会 ping 的过于频繁,那么服务端可以关闭与客户端的连接。
	ClientPingServerMinInterval time.Duration
}

func (*KeepaliveOptions) ToGRPCDialOptions

func (ko *KeepaliveOptions) ToGRPCDialOptions() []grpc.DialOption

ToGRPCDialOptions 导出 grpc 连接中,客户端给服务端拨号时的选项:

  1. 客户端 ping 服务端的时间间隔:ClientPingServerInterval
  2. 客户端 ping 服务端后等待的超时时间:ClientPingServerTimeout
  3. 当 grpc 的连接上没有活动流时,客户端依然会给服务端发送 ping

func (*KeepaliveOptions) ToGRPCServerOptions

func (ko *KeepaliveOptions) ToGRPCServerOptions() []grpc.ServerOption

ToGRPCServerOptions 导出 grpc 连接中服务端的选项:

  1. 服务端 ping 客户端的时间间隔:ServerPingClientInterval
  2. 服务端 ping 客户端后等待的超时时间:ServerPingClientTimeout
  3. 服务端允许客户端 ping 自己的最短时间间隔:ClientPingServerMinInterval
  4. 当 grpc 的连接上没有活动流时,服务端依然允许客户端 ping 自己

type SecureOptions

type SecureOptions struct {
	// 建立握手连接时,验证客户端或服务端的证书。
	VerifyCertificate func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error

	// ASN.1 DER PEM 编码的 x509 证书。
	PublicKeyPEM []byte

	// ASN.1 DER PEM 编码的密钥,用于 TLS 通信。
	PrivateKeyPEM []byte

	// ASN.1 DER PEM 编码的证书,客户端用它来验证服务端的身份。
	ServerRootCAs [][]byte

	// ASN.1 DER PEM 编码的证书,服务端用它来验证客户端的身份。
	ClientRootCAs [][]byte

	// 是否使用 TLS 用于通信。
	UseTLS bool

	// 在进行身份验证的时候,是否需要客户端提供证书,如果服务端要验证客户端的身份,则该字段必须置为 true。
	RequireClientCert bool

	// TLS 支持的密码套件。
	CipherSuites []uint16

	// TODO 为什么要有时间偏移?
	TimeShift time.Duration

	// 用于验证返回证书上的主机名,除非给出 InsecureSkipVerify。除非是 IP 地址,否则它也会被包含在客户端的握手过程中,以支持虚拟主机。
	ServerNameOverride string
}

func (*SecureOptions) ClientCertificate

func (so *SecureOptions) ClientCertificate() (tls.Certificate, error)

ClientCertificate 根据 PEM 编码的 x509 公钥和私钥,生成一个 TLS 证书。

func (SecureOptions) ToTLSConfig

func (so SecureOptions) ToTLSConfig() (*tls.Config, error)

ToTLSConfig 根据 SecureOptions 解析得到 *tls.Config:

&tls.Config{
	MinVersion:				tls.VersionTLS12
	ServerName:				so.ServerNameOverride
	VerifyPeerCertificate:	so.VerifyCertificate
	RootCAs:				AppendCertsFromPEM(so.ServerRootCAs[i]) // 如果提供了验证服务端身份的 CA 证书的话
	Certificates:			append(Certificates, tls.X509KeyPair(so.PublicKeyPEM, so.PrivateKeyPEM)) // 需要客户端证书的情况下
	Time:					time.Now().Add((-1) * so.TimeShift)
}

type ServerConfig

type ServerConfig struct {
	ConnectionTimeout  time.Duration
	SecureOptions      SecureOptions
	KeepaliveOptions   KeepaliveOptions
	StreamInterceptors []grpc.StreamServerInterceptor
	UnaryInterceptors  []grpc.UnaryServerInterceptor
	Logger             *hlogging.HyperchainLogger
	HealthCheckEnabled bool
	ServerStatsHandler *ServerStatsHandler
	MaxRecvMsgSize     int
	MaxSendMsgSize     int
}

type ServerStatsHandler

type ServerStatsHandler struct {
	OpenedConnCounter metrics.Counter
	ClosedConnCounter metrics.Counter
}

func NewServerStatsHandler

func NewServerStatsHandler(p metrics.Provider) *ServerStatsHandler

func (*ServerStatsHandler) HandleConn

func (ssh *ServerStatsHandler) HandleConn(ctx context.Context, s stats.ConnStats)

HandleConn 处理 Conn 统计信息。统计建立起的连接数量和连接关闭的数量。

func (*ServerStatsHandler) HandleRPC

func (ssh *ServerStatsHandler) HandleRPC(ctx context.Context, s stats.RPCStats)

HandleRPC 处理 RPC 统计信息。(这里并没有实现该方法)

func (*ServerStatsHandler) TagConn

TagConn 可以为给定的上下文附加一些信息。返回的上下文将用于统计处理。对于连接统计处理,HandleConn 中用于此连接的上下文将从返回的上下文中导出。对于 RPC 统计处理:

  • 在服务器端,用于此连接上所有 RPC 的 HandleRPC 中的上下文将从返回的上下文中导出。
  • 在客户端,上下文不是从返回的上下文派生的。

(这里并没有实现该方法)

func (*ServerStatsHandler) TagRPC

TagRPC 可以为给定的上下文附加一些信息。在 RPC 的其余生命周期中使用的上下文将来自返回的上下文。(这里并没有实现该方法)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL