概述
dtm支持多种协议,包括通用类协议HTTP,gRPC,和微服务协议,如go-zero:
HTTP
HTTP作为前端与后端交互中最通用的协议,通常也用于后端内部的通讯协议。
dtm服务器启动时,默认监听36789端口,提供http服务。您可以使用dtm-labs/client/dtmcli这个SDK,使用HTTP的最简示例,可以参考dtmcli-qs
更多高级的HTTP使用示例,可以参考dtm-examples下的带有http的文件内容
如果您接入的是HTTP之上的微服务协议,目前您可能需要自己将相关的微服务以独立的HTTP服务提供出来,dtm后续可能会接入类似SpringCloud这样的微服务协议
gRPC
gRPC广泛应用于后端微服务中,大量云原生应用,大量微服务框架,构建在此协议之上,应用非常广泛
dtm服务器启动时,默认监听36790端口,提供gRPC服务。对于通过gRPC协议使用dtm的用户,您可以使用dtm-labs/clientdtmgrpc这个SDK,使用gRPC的最简示例,可以参考dtmgrpc-qs
更多高级的gRPC使用示例,可以参考dtm-examples下的带有grpc的文件内容
微服务协议
当前已有许多微服务框架被广泛应用,为了方便用户能够在自己的微服务框架中直接使用dtm,dtm采用插件的方式,支持了多个微服务框架。
go-zero
dtm首先接入了go-zero,这是一个一开源就很火爆的微服务框架,在对接的过程中,获得了框架作者的大量支持,相关的代码主要由框架作者完成,我们只是做了最后的代码整理,以及相关的文档编写。
接入详情参见 go-zero
kratos
dtm已接入了bilibili开源的kratos,该功能主要由lei liu完成,非常感谢lei liu的杰出贡献
接入详情参见 kratos
springcloud
dtm已经支持了springcloud协议,包括springcloud-alibaba,springcloud-netflix。该功能主要由Kui Liao完成,非常感谢Kui Liao的杰出贡献
接入详情参见dtmcli-java
polaris
dtm接入了腾讯开源的polaris,以及polaris之上的微服务框架,对接过程中,获得了腾讯同学的大力支持,由腾讯的同学ychensha提供了PR。
dtm从v1.6.3开始原生支持grpc-polaris微服务框架
具体的接入指南待完善
ego
EGO是一个集成了各种工程实践的框架。通过组件化的设计模式,保证了业务方能够统一的调用方式启动各种组件。
dtm从v1.16.3开始原生支持ego,该微服务驱动由vicnoah完成,非常感谢vicnoah的接触贡献
详细使用方式参考 https://github.com/dtm-labs/dtmdriver-clients/tree/main/ego
其他
其他gRPC之上的微服务框架协议,正在快速接入中,如果您有相关的需求或者您是框架维护者,欢迎联系我(微信yedf2008),我们将非常乐意接入您的微服务框架
具体如何让您的微服务框架接入dtm,参考下面的 微服务接入指南
微服务对接指南
此文档主要针对框架维护者,普通用户无需关注
dtm支持gRPC协议之上的微服务框架接入,即采用gRPC Resolver机制的微服务框架,下面先看一个如何使用一个自定义的协议
运行一个接入示例
dtm做了一个最简协议示例:protocol1,方便框架维护者接入,按照如下步骤能够运行这个协议的应用:
- 配置dtm服务器,并运行
MicroService:
Driver: 'dtm-driver-protocol1'
- 运行一个使用dtm的APP
# dtm-labs/dtmdriver-clients
go run protocol1/main.go
至此您可以看到类似这样的日志,这个简单的协议已经运行起来了:
2021/12/03 15:27:13.65 types.go:43 grpc client called: protocol1://localhost:36790/dtmgimp.Dtm/NewGid result: Gid:"c0a803b8_4psHCRxQ1kA" err: <nil>
2021/12/03 15:27:13 TransOut 30 from user 1
2021/12/03 15:27:13 TransIn 30 to user 2
更加完整的运行示例可以参考go-zero
接入步骤
接入步骤如下:
- 实现dtm-labs/dtmdriver里面的接口
- 提一个PR给dtm,在dtm导入您实现了dtmdriver的包
- 配置dtm服务器,使用您的驱动
- 执行dtmdriver.Use,注册您的驱动,之后就可以使用dtmgrpc
步骤1:dtmdriver接口
此接口定义如下
// Driver interface to do service register and discover
type Driver interface {
// GetName return the name of the driver
GetName() string
// RegisterGrpcResolver register the grpc resolver to handle custom scheme
RegisterGrpcResolver()
// RegisterGrpcService register dtm endpoint to target
RegisterGrpcService(target string, endpoint string) error
// ParseServerMethod parse the uri to server and method.
// server will be passed to grpc.Dial, and method to grpc.ClientConn.invoke
ParseServerMethod(uri string) (server string, method string, err error)
}
GetName
返回微服务框架的驱动名称,一般以”dtm-driver-“作为前缀,例如”dtm-driver-gozero”。
它会被dtm服务器和dtm客户端用到
RegisterGrpcResolver
您需要在这个函数里,注册您的grpc的resolver,这样grpc调用时,会使用您的服务发现
RegisterGrpcService
在您的微服务框架中,您可能需要将dtm服务,注册到您的服务发现组件里。dtm服务启动之后,会调用您的这个函数,并传递dtm配置中的Target和Endpoint
ParseServerMethod
由于各个微服务框架,对于协议中的URL,dtm需要将它拆分成server和method两部分,然后创建连接并调用。但是不同微服务协议,通常有不同的拆解方式,因此dtm服务器和SDK将调用这个接口完成拆分
init
您实现了Driver之后,请将您的Driver注册到dtmdriver中,如下所示:
func init() {
dtmdriver.Register(&protocol1Driver{})
}
步骤2:提PR给DTM
如果您完成了驱动的编写,您可以提PR给dtm,dtm团队将及时给您反馈,评估您的需求。您的PR内容类似于:
import _ "github.com/dtm-labs/dtmdriver-gozero"
步骤3:配置运行dtm
配置dtm支持您的自定义协议,示例如下:
MicroService:
Driver: 'dtm-driver-gozero' # 填写您的驱动名称
Target: 'etcd://localhost:2379/dtmservice' # dtm服务将注册到这个url
EndPoint: 'localhost:36790' # dtm服务的ip端口
步骤4:使用dtm SDK
dtm的grpc协议SDK为dtmgrpc,您先调用dtmdriver.Use(“dtm-driver-gozero”),告知dtmgrpc使用这个驱动来解析url。
然后您就可以正常使用dtmgrpc来访问dtm了