/dmicro

dmicro是一个高效、可扩展且简单易用的微服务框架。包含drpc,dserver等组件。

Primary LanguageGoApache License 2.0Apache-2.0

dmicro logo

让你的Golang开发无比简单

GitHub release report card github issues github closed issues GoDoc view examples OSCS Status

概述

DMicro是一个高效、可扩展且简单易用的微服务框架。包含DRPC,DServer等多个组件。

其中DRPC组件是rpc框架,使用endpoint作为统一对象,为RPC ServerRPC Clinet提供统一的API封装。

DRPC组件特性:

  • 易于理解,科学合理的多层抽象。
    • endpoint,session,handle,message,protoco,codec,transfer filter,plugin.
  • 支持常见的消息通讯协议jsonprototbuf,http,jsronrpc,良好的抽象层让自定义消息协议变得简单快捷。
  • 支持多种网络协议tcp,unix,kcp,quic,websocket等。。。
  • 全生命周期的插件埋点(多达27个埋点),让插件系统能实现的功能丰富多彩。
    • 内置 auth,heartbeatignorecase,proxy,securebody等插件
  • 依托丰富的插件埋点,抽象出易于使用的Event事件系统,让你的开发如虎添翼。
  • 高性能的网络传输层,让性能不再是瓶颈。
  • 客户端自动重拨。
  • 配合DServer组件,实现优雅的平滑重启,让你的服务时刻在线。
  • 配合Registry组件,实现服务注册。
    • Registry组件抽象出合理的接口,方便接入多个服务注册中心,目前已实现etcd,mdns
  • 配合Selector组件实现服务发现功能。

DServer应用管理组件帮助大家封装好了应用的全生命周期管理。

DServer组件特性:

  • 采用server,service,sandbox三层结构。 让业务专注于sandbox层,支持单进程,多进程模式。做到开发debug单进程,运行单/多进程可选。
  • 完善合理的启动命令封装,支持start,stopreload,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

使用DServer创建rpc服务

如何快速的通过简单的代码创建一个真正的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 = "osgochina@gmail.com"
	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

创建普通rpc客户端

服务已经建立完毕,如何通过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命令

使用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:         osgochina@gmail.com
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 »

TODO

  • Registry 服务注册
  • Selector 服务发现
  • Eventbus 事件总线
  • Supervisor 进程管理
  • Code gen 代码生成
  • Tracing 链路追踪
  • Metrics 指标统计
  • Broker 限流熔断
  • OpenAPI 文档自动生成

感谢

DMicro该项目的诞生离不开erpcGoFrame两个优秀的项目。

其中drpc组件参考erpc项目的架构**,依赖的基础库是GoFrame