DMicro是一个高效、可扩展且简单易用的微服务框架。包含DRPC,DServer等多个组件。
其中DRPC组件是rpc框架,使用endpoint作为统一对象,为RPC Server,RPC Clinet提供统一的API封装。
DRPC组件特性:
- 易于理解,科学合理的多层抽象。
endpoint,session,handle,message,protoco,codec,transfer filter,plugin.
- 支持常见的消息通讯协议
json,prototbuf,http,jsronrpc,良好的抽象层让自定义消息协议变得简单快捷。 - 支持多种网络协议
tcp,unix,kcp,quic,websocket等。。。 - 全生命周期的插件埋点(多达27个埋点),让插件系统能实现的功能丰富多彩。
- 内置
auth,heartbeat,ignorecase,proxy,securebody等插件
- 内置
- 依托丰富的插件埋点,抽象出易于使用的
Event事件系统,让你的开发如虎添翼。 - 高性能的网络传输层,让性能不再是瓶颈。
- 客户端自动重拨。
- 配合
DServer组件,实现优雅的平滑重启,让你的服务时刻在线。 - 配合
Registry组件,实现服务注册。Registry组件抽象出合理的接口,方便接入多个服务注册中心,目前已实现etcd,mdns。
- 配合
Selector组件实现服务发现功能。 - 使用
metrics组件实现指标统计功能。
DServer应用管理组件帮助大家封装好了应用的全生命周期管理。
DServer组件特性:
- 采用
server,service,sandbox三层结构。 让业务专注于sandbox层,支持单进程,多进程模式。做到开发debug单进程,运行单/多进程可选。 - 完善合理的启动命令封装,支持
start,stop,reload,ctrl等命令。 - 不但支持
drpc组件,还支持ghttp等实现平滑重启接口的其他组件(如果不需要平滑重启,所有服务组件都支持) - 好用的命令行管理功能,让你能实时的管理正在运行的应用。
- 完善的进程管理组件
supervisor,支持对进程的全生命周期管理。
go get -u -v github.com/osgochina/dmicro推荐使用 go.mod:
require github.com/osgochina/dmicro latest
- import
import "github.com/osgochina/dmicro"国内镜像: https://gitee.com/osgochina/dmicro
golang版本 >= 1.16如何快速的通过简单的代码创建一个真正的rpc服务。 以下就是示例代码:
// rbc_server.go
package main
import (
"fmt"
"github.com/osgochina/dmicro/drpc"
"github.com/osgochina/dmicro/dserver"
"github.com/osgochina/dmicro/logger"
)
// DRpcSandBox 默认的服务
type DRpcSandBox struct {
dserver.BaseSandbox
endpoint drpc.Endpoint
}
func (that *DRpcSandBox) Name() string {
return "DRpcSandBox"
}
func (that *DRpcSandBox) Setup() error {
fmt.Println("DRpcSandBox Setup")
cfg := that.Config.EndpointConfig(that.Name())
cfg.ListenPort = 9091
cfg.PrintDetail = true
that.endpoint = drpc.NewEndpoint(cfg)
that.endpoint.RouteCall(new(Math))
return that.endpoint.ListenAndServe()
}
func (that *DRpcSandBox) Shutdown() error {
fmt.Println("DRpcSandBox Shutdown")
return that.endpoint.Close()
}
// Math rpc请求的最终处理器,必须集成drpc.CallCtx
type Math struct {
drpc.CallCtx
}
func (m *Math) Add(arg *[]int) (int, *drpc.Status) {
// test meta
logger.Infof("author: %s", m.PeekMeta("author"))
// add
var r int
for _, a := range *arg {
r += a
}
// response
return r, nil
}
func main() {
dserver.Authors = "[email protected]"
dserver.SetName("DMicro_drpc")
dserver.Setup(func(svr *dserver.DServer) {
err := svr.AddSandBox(new(DRpcSandBox))
if err != nil {
logger.Fatal(err)
}
})
}- 编译
$ go build rbc_server.go- 运行
$ ./rbc_server start服务已经建立完毕,如何通过client链接它呢?
package main
import (
"time"
"github.com/osgochina/dmicro/drpc"
"github.com/osgochina/dmicro/drpc/message"
"github.com/osgochina/dmicro/logger"
)
func main() {
cli := drpc.NewEndpoint(drpc.EndpointConfig{PrintDetail: true, RedialTimes: -1, RedialInterval: time.Second})
defer cli.Close()
sess, stat := cli.Dial("127.0.0.1:9091")
if !stat.OK() {
logger.Fatalf("%v", stat)
}
var result int
stat = sess.Call("/math/add",
[]int{1, 2, 3, 4, 5},
&result,
message.WithSetMeta("author", "liuzhiming"),
).Status()
if !stat.OK() {
logger.Fatalf("%v", stat)
}
logger.Printf("result: %d", result)
}通过以上的代码事例,大家基本可以了解drpc框架是怎么使用。
使用ctrl命令管理正在运行的server
- 打开新的命令行窗口运行
ctrl命令
$ ./rbc_server.exe ctl
____ ____
| _ \ / ___| ___ _ __ __ __ ___ _ __
| | | | \___ \ / _ \ | '__| \ \ / / / _ \ | '__|
| |_| | ___) | | __/ | | \ V / | __/ | |
|____/ |____/ \___| |_| \_/ \___| |_|
Version: No Version Info
Go Version: No Version Info
DMicro Version: v1.0.0
GF Version: v1.16.9
Git Commit: No Commit Info
Build Time: No Time Info
Authors: [email protected]
Install Path: D:\code\GolandProjects\dmicro\examples\simple_dserver\rbc_server.exe
DMicro_drpc »
- 运行
help命令,获取命令说明
DMicro_drpc » help
好用的服务管理工具
Commands:
=========
clear clear the screen
debug debug开关
exit exit the shell
help use 'help [command]' for command help
info, status, ps 查看当前服务状态
log 打印出服务的运行日志
reload 平滑重启服务
start 启动服务
stop 停止服务
version, v 打印当前程序的版本信息
DMicro_drpc »-
Registry服务注册 -
Selector服务发现 -
Eventbus事件总线 -
Supervisor进程管理 -
Metrics指标统计 -
OpenAPI文档自动生成 -
Code gen代码生成 -
Tracing链路追踪 -
Broker限流熔断
DMicro该项目的诞生离不开erpc和GoFrame两个优秀的项目。
其中drpc组件参考erpc项目的架构思想,依赖的基础库是GoFrame。