/begonia

Primary LanguageGoMIT LicenseMIT

Begonia RPC

快速开始

概述

一个轻量级、API友好的RPC框架。目前仅支持Golang语言,Java、Node.js的支持正在计划中。

功能

  • client端 远程调用
  • server端 注册服务
  • 使用代码生成加速
  • 服务中心
  • 日志库、日志中心
  • 全链路追踪
  • 连接池
  • 心跳机制
  • 机器监控
  • 配置中心、多节点同步配置
  • 服务管理、自动扩容

证书

begonia 的源码允许用户在遵循 MIT 开源证书 规则的前提下使用。

安装

go get -u github.com/MashiroC/begonia
go get -u github.com/MashiroC/begonia/cmd/bgacenter
go get -u github.com/MashiroC/begonia/cmd/begonia

此时会下载begonia-rpc框架和begonia的命令行工具。推荐使用go mod

快速开始

详细的使用文档请点击 Begonia 使用文档

相关的设计,详细的文档请点击 Begonia 设计文档

框架中的架构、设计细节的设计文档正在编写中。

服务模式

(非必须)

如果需要服务中心来调度服务、提供远程的服务注册和内网穿透,可以使用服务中心模式。

在安装后,执行下面的命令来启动服务中心的进程。

$ bgacenter start

推荐使用脚本来将服务中心注册为一个系统服务。(脚本在写了在写了)

如果没有上述需求,可以像gRPC一样直接从客户端连接服务。

服务端

// server1.go
package main

import (
	"errors"
	"fmt"
	"github.com/MashiroC/begonia"
	"github.com/MashiroC/begonia/app/option"
	"time"
)

func main() {
    // 一般情况下,addr是服务中心的地址。
    s := begonia.NewServer(option.Addr(":12306")) 
    
	echoService := &EchoService{}

    // 会通过反射的方式把EchoService下面所有公开的方法注册到Echo服务上。
	s.Register("Echo", echoService)

	s.Wait()
}

type EchoService struct {}

// SayHello 函数的参数和返回值会被反射解析,注册为一个远程函数。
// 注册的函数没有特定的格式和写法。
func (*EchoService) SayHello(name string) string {
	fmt.Println("sayHello")
	return "😀Hello " + name
}

以上这份代码的调用和解析都是使用反射来实现的,如果想要更快的速度,更高的并发,可以使用代码生成模式。代码生成不需要你提供额外的描述文档,也不需要特定的格式,仅需要切换到你项目的跟目录,执行以下命令:

$ begonia -s -r ./

之前下载的命令行工具会自动扫描调用了begonia.Register函数的结构体。并在你结构体的同级目录生成${structName}.begonia.go文件,并且在初始化时使用代码生成相关的API,中间任何阶段不使用反射。

└─server1
    ├─server1.go
    └─EchoService.begonia.go

客户端

package main

import (
	"fmt"
	"github.com/MashiroC/begonia"
	"github.com/MashiroC/begonia/app/option"
	"sync"
	"time"
)

const (
	mode = "center"
)

func main() {
    c := begonia.NewClient(option.Addr(":12306"))

    // 获取一个服务
    s, err := c.Service("Echo")
	if err != nil {
		panic(err)
	}

    // 获取一个远程函数的同步调用
	testFun, err := s.FuncSync("SayHello")
	if err != nil {
		panic(err)
	}
    
    // 获得一个远程函数的异步调用
    testFunAsync, err := s.FuncAsync("SayHello")
    if err != nil {
		panic(err)
	}
    
    // 调用!
	testFunAsync(func(res interface{}, err error) {
		if err != nil {
			panic(err)
		}
		fmt.Println(res)
	}, "kieran")

	res, err = testFun("kieran")
	if err != nil {
		panic(err)
	}
    fmt.Println(res)
}

以上这个是使用反射调用的例子,在服务端可以使用代码生成直接生成调用文件。

$ begonia -s -c -r ./

执行后在服务的目录下会生成一个call目录,目录包含所有服务的调用代码。其中call.begonia.go是begonia客户端的初始化代码,可以修改替换。entity.begonia.go是注册服务上的结构体的声明。

└─server1
	├─call
		├─cli.begonia.go
		├─entity.begonia.go
		└─EchoService.begonia.go
    ├─server1.go
    └─EchoService.begonia.go

客户端可以将这段代码复制到自己的项目里直接调用:

package main

import (
	"fmt"
	"github.com/MashiroC/begonia/example/service/call"
)

func main() {
	res, err := call.SayHello("kieran")
	if err != nil {
		panic(err)
	}
	fmt.Println(res)
}