Overview

dtm supports a variety of protocols, including generic class protocols HTTP, gRPC, and microservice protocols such as go-zero.

HTTP

HTTP as the most common protocol in front-end and back-end interaction, usually also used for back-end internal communication protocol.

When dtm server starts, it listens to port 36789 by default to provide HTTP service. You can use the SDK client/dtmcli for a minimalist example of using HTTP, see dtmcli-qs

For more advanced HTTP usage examples, please refer to the file with http under dtm-examples

If you are accessing a microservice protocol on top of HTTP, you may need to provide the relevant microservice as a standalone HTTP service yourself for now, dtm may later support a microservice protocol like SpringCloud

gRPC

gRPC is widely used in back-end microservices, a lot of cloud-native applications, a lot of microservice frameworks, built on top of this protocol, very widely used

When dtm server starts, it listens to port 36790 by default to provide gRPC services. For users using dtm via gRPC protocol, we recommend you to use the SDK dtm-labs/clientdtmgrpc, for a minimal example of using gRPC, please refer to dtmgrpc-qs

For more advanced gRPC usage examples, please refer to the file with grpc under dtm-examples

Microservice protocols

Currently there are many microservice frameworks that are widely used. In order to facilitate users to use dtm directly in their own microservice frameworks, dtm uses a plug-in approach to support multiple microservice frameworks on top of gRPC.

go-zero

dtm first support to go-zero, which is a very hot microservices framework as soon as it is open source.

See go-zero

polaris

dtm has supported to Tencent's open source polaris and the microservices framework on top of polaris. During the developing, we got a lot of support from Tencent staff, and PR was provided by Tencent staff ychensha.

dtm supports grpc-polaris microservices framework natively from v1.6.3

The specific access guide is to be improved

Other

Other microservice framework protocols on top of gRPC are being supported quickly, if you have related needs or you are a framework maintainer, please contact me (WeChat yedf2008), we will be happy to support your microservice framework!

For details on how to get your microservice framework to dtm, please refer to the following microservice interface guide

Microservices Support Guide

This document is mainly for framework maintainers, ordinary users do not need to pay attention to

dtm supports access to microservice frameworks on top of the gRPC protocol, i.e., microservice frameworks that use the gRPC Resolver mechanism, see below for an example of how to use a custom protocol

To run an example

dtm made a minimalist protocol example: protocol1, to facilitate access to the framework maintainer, follow the steps below to be able to run the application of this protocol.

  • Configure the dtm server and run
MicroService:
  Driver: 'dtm-driver-protocol1'
  • Run an app that uses dtm
# dtm-labs/dtmdriver-clients
go run protocol1/main.go

At this point you can see a log like this, and the simple protocol is up and running.

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

A more complete runtime example can be found in go-zero

access steps

The access steps are as follows.

  • Implement the interface inside dtm-labs/dtmdriver
  • Submit a PR to dtm and import the package you have implemented in dtmdriver in dtm
  • Configure the dtm server to use your driver
  • Execute dtmdriver.Use, register your driver, and then you can use dtmgrpc

A complete example can be found here dtmdriver-clients

Step 1: dtmdriver interface

This interface is defined as follows

// 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

Returns the driver name of the microservice framework, usually prefixed with "dtm-driver-", e.g. "dtm-driver-gozero".

It will be used by dtm server and dtm client

RegisterGrpcResolver

You need to register your grpc's resolver in this function, so that when grpc calls it, it will use your service discovery

RegisterGrpcService

In your microservices framework, you may need to register the dtm service to your service discovery component. dtm service will call your function after it starts and pass the Target and Endpoint of the dtm configuration

ParseServerMethod

Due to the individual microservice frameworks, for the URL in the protocol, dtm needs to split it into two parts, server and method, and then create the connection and call it. However, different microservice protocols usually have different ways of splitting, so dtm server and SDK will call this interface to complete the splitting

init

After you have implemented Driver, please register your Driver with dtmdriver as follows:

func init() {
	dtmdriver.Register(&protocol1Driver{})
}

Step 2: Raise PR to DTM

If you have finished writing the driver, you can submit a PR to dtm and the dtm team will give you timely feedback and evaluate your requirements. The content of your PR is similar to.

import _ "github.com/dtm-labs/dtmdriver-gozero"

Step 3: Configure running dtm

Configure dtm to support your custom protocol, an example is as follows.

MicroService:
  Driver: 'dtm-driver-gozero' # Fill in your driver name
  Target: 'etcd://localhost:2379/dtmservice' # dtm service will be registered to this url
  EndPoint: 'localhost:36790' # ip port of dtm service

Step 4: Using the dtm SDK

dtm's grpc protocol SDK is dtmgrpc, you first call dtmdriver.Use("dtm-driver-gozero") to tell dtmgrpc to use this driver to parse the url.

Then you can use dtmgrpc to access dtm normally