turbo engine
cd apps/tools
go run main.go create service --path ../echo
输入包名: echo
输入服务名: Echo (注意服务器用大写开头)
完成后,会在上一级目录创建Echo服务的基础结构和代码:
echo
├─api
│ ├─proto rpc协议
│ └─rpc rpc包装类存放的地方,由工具自动生成
├─conf 配置文件目录
├─echo Echo服务
├─internal 内部使用的共用代码放在这里
└─mod 服务需要的module放在这里
proto目录下新建echo.go,内容如下:
type Echo struct {
Ver string `version:"1.0.0"`
XXX interface{}
// custom method begin
Echo func(string) (string, error)
// custom method end
}
func init() {
reg["Echo"] = new(Echo)
}
定义了一个Echo方法,接收一个字符串,原样返回字符串.
进入proto目录,运行proto_test.go里面的方法TestCreate,将在rpc目录下,生成包装类echo_rpc_wrap.go
go run main.go create module --path ../echo/mod/echo
package name:echo
module name:Echo
执行后将在echo/mod/echo下新建一个echo.go
实现rpc的Echo方法, 在echo/mod/echo目录下新建echo_rpc.go:
package echo
type EchoServer struct {
}
func (e *EchoServer) Echo(input string) (string, error) {
return input, nil
}
回到echo/mod/echo/echo.go
改写如下方法:
func (m *Echo) OnStart(ctx context.Context) error {
m.Module.OnStart(ctx)
// subscribe subject
rpc.SetEchoProvider(m.Srv, "", &EchoServer{}) // 关联rpc接口与实现
// subscribe subject end
return nil
}
打开echo/echo/echo.go
import "turboengine/apps/echo/mod/echo"
func (s *Echo) OnPrepare(srv coreapi.Service, args map[string]string) error {
s.Service.OnPrepare(srv, args)
// use plugin
// use plugin end
// add module
m := module.New(&echo.Echo{}, false)
srv.AddModule(m)
// add module end
return nil
}
这样一个带有Echo接口的服务就开发完成了
我们在其它服务中,调用Echo这个方法:
import "turboengine/apps/echo/api/rpc"
// 查找echo服务
dest := srv.SelectService("Echo", api.LOAD_BALANCE_HASH, 0)
if dest.IsNil() {
log.Error("echo not found")
return
}
// 创建一个EchoConsumer
echo := rpc.NewEchoConsumer(srv, "", dest, time.Second*3)
// 远程调用
go func() {
res, err := echo.Echo("hello") // 同步调用
log.Info("echo:%s", res)
}()