类库类代码指为了更方便的使用第三方类库而封装的辅助类代码,这些代码也通常是在代码调用链的底层,专注于完成某方面特定的功能,可能会带有一点点 dapr 的逻辑。
工具类代码处于代码依赖关系的倒数第二层底层,仅仅比工具类代码高一层。
类库类代码指为了更方便的使用第三方类库而封装的辅助类代码,这些代码也通常是在代码调用链的底层,专注于完成某方面特定的功能,可能会带有一点点 dapr 的逻辑。
工具类代码处于代码依赖关系的倒数第二层底层,仅仅比工具类代码高一层。
Dapr grpc package中的 util.go文件的源码分析,目前只有用于转换state参数类型的两个方法。
stateConsistencyToString 方法将 StateOptions_StateConsistency 转为 string:
func stateConsistencyToString(c commonv1pb.StateOptions_StateConsistency) string {
switch c {
case commonv1pb.StateOptions_CONSISTENCY_EVENTUAL:
return "eventual"
case commonv1pb.StateOptions_CONSISTENCY_STRONG:
return "strong"
}
return ""
}
方法 方法将 StateOptions_StateConsistency 转为 string:
func stateConcurrencyToString(c commonv1pb.StateOptions_StateConcurrency) string {
switch c {
case commonv1pb.StateOptions_CONCURRENCY_FIRST_WRITE:
return "first-write"
case commonv1pb.StateOptions_CONCURRENCY_LAST_WRITE:
return "last-write"
}
return ""
}
Dapr grpc package中的 port.go文件的源码分析,只有一个 GetFreePort 方法用于获取一个空闲的端口。
GetFreePort 方法从操作系统获取一个空闲可用的端口:
// GetFreePort returns a free port from the OS
func GetFreePort() (int, error) {
addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
if err != nil {
return 0, err
}
l, err := net.ListenTCP("tcp", addr)
if err != nil {
return 0, err
}
defer l.Close()
return l.Addr().(*net.TCPAddr).Port, nil
}
通过将端口设置为0, 来让操作系统自动分配一个可用的端口。注意返回时一定要关闭这个连接。
Dapr grpc package中的 dial.go文件的源码分析,目前只有用于建连获取地址前缀的一个方法。
GetDialAddressPrefix 为给定的 DaprMode 返回 dial 前缀,用于gPRC 客户端连接:
// GetDialAddressPrefix returns a dial prefix for a gRPC client connections
// For a given DaprMode.
func GetDialAddressPrefix(mode modes.DaprMode) string {
if runtime.GOOS == "windows" {
return ""
}
switch mode {
case modes.KubernetesMode:
return "dns:///"
default:
return ""
}
}
注意:Kubernetes 模式下 返回 “dns:///”
调用场景,只在 grpc.go 的 GetGRPCConnection() 方法中被调用:
// GetGRPCConnection returns a new grpc connection for a given address and inits one if doesn't exist
func (g *Manager) GetGRPCConnection(address, id string, namespace string, skipTLS, recreateIfExists, sslEnabled bool) (*grpc.ClientConn, error) {
dialPrefix := GetDialAddressPrefix(g.mode)
......
conn, err := grpc.DialContext(ctx, dialPrefix+address, opts...)
......
}