RPC服务孵化


微服务孵化器是封装的rpcx框架,相比与直接使用原生rpcxserver,孵化器生成的server 增加了如下新特性:

  • Hooks: 与之前章节我们讲得用法一致
  • 安全退出: 防止出现请求中断的情况
  • 灵活的插件绑定机制: 提供可视化管理界面动态更改插件配置参数,
    我们已经沉淀了一些常见的微服务基础插件

总之,我们的目标是尽量减少人为的重复工作!

创建一个微服务

server 主入口文件
  1. package main
  2. import (
  3. "context"
  4. "github.com/tal-tech/odinPlugin/wrap"
  5. "github.com/tal-tech/xtools/addrutil"
  6. bs "github.com/tal-tech/hera/bootstrap"
  7. rpcxplugin "github.com/tal-tech/odinPlugin"
  8. "github.com/tal-tech/hera/rpcxserver"
  9. "github.com/tal-tech/xtools/confutil"
  10. )
  11. func main() {
  12. //加载配置文件,默认是 可执行文件所在目录的兄弟目录`conf`下的`conf.ini`
  13. //-app/
  14. // -bin/serverexe
  15. // -conf/conf.ini
  16. confutil.InitConfig()
  17. //获取当前机器的真实IP地址
  18. addr, err := addrutil.Extract("")
  19. if err != nil {
  20. panic(err)
  21. }
  22. //通过孵化器生成一个rpcx server实例
  23. s := rpcxserver.NewServer(rpcxserver.Addr(addr))
  24. //注册服务启动前执行函数
  25. s.AddBeforeServerStartFunc(bs.InitLogger(),
  26. bs.InitTraceLogger("HS-Golang", "0.1"),
  27. s.InitConfig(),
  28. s.InitRegistry(),
  29. //新增插件类型recovery、costwarn,注意顺序
  30. s.InitRpcxPlugin(rpcxplugin.RatelimitOption()),
  31. s.RegisterServiceWithPlugin("myRpcServerName", new(MyRpcServer), ""))
  32. //注册服务停止后执行函数
  33. s.AddAfterServerStopFunc(bs.CloseLogger())
  34. //启动服务
  35. err = s.Serve()
  36. if err != nil {
  37. panic(err)
  38. }
  39. }
  40. type MyRpcServer struct {
  41. //server 必须包含此匿名变量,否则无法应用插件功能
  42. *rpcxplugin.RpcxPlugin
  43. }
  44. type HelloArgs struct {
  45. Param string
  46. }
  47. type HelloResponse struct {
  48. Msg string
  49. }
  50. func (this *MyRpcServer) SayHello(ctx context.Context, args *HelloArgs, reply *HelloResponse) (err error) {
  51. tag := "rpc.MyRpcServer.SayHello"
  52. fn := func(w *wrap.Wrap) error {
  53. reply = &HelloResponse{
  54. Msg:args.Param,
  55. }
  56. return nil
  57. }
  58. return this.Wrapcall(ctx, tag, fn)
  59. }

编译

服务注册与发现的配置中心,支持etcdzookeeper 两种方式。
在编译的时候利用-tags参数选项来选择配置中心。
zookeeper为注册中心,则编译命令如下:

  1. $ go build -tags "zookeeper" -o myserver .

配置文件

任意位置创建一个conf.ini文件,假定和main.go 在同一目录

  1. [Server]
  2. ;网络协议
  3. network=tcp
  4. ;微服务端口
  5. port=18000
  6. [Registry]
  7. ;是否启用注册中心 on:启用 off:不启用
  8. status=on
  9. ;;注册中心地址,多个地址以空格分割
  10. addrs=127.0.0.1:2181 127.0.0.1:2182
  11. ;在配置中心的根目录
  12. basePath=/xes_test
  13. ;注册更新时间 1m表示一分钟
  14. updateInterval=1m
  15. ;注册服务的组,只有同组下的client/server 才能数据交互
  16. group=sam_test

启动服务
  1. $ ./myserver -c conf.ini -p /path_to_your_conf_dir
  2. use NUX_ROOTFS = as file system root2019/12/28 18:39:27 CONF INIT,path:conf.ini
  3. 2019/12/28 18:39:27 Conf,err:section 'Redis' not found
  4. 2019/12/28 18:39:27 Connected to 127.0.0.1:2181
  5. 2019/12/28 18:39:27 authenticated: id=175151211264791228, timeout=10000
  6. 2019/12/28 18:39:27 re-submitting `0` credentials after reconnect
  7. [18:39:27 CST 2019/12/28] [WARN] (config.go:23:561420000000001 localhost.localdomain) Rpcx-plugin Conf get filepath fail
  8. 2019/12/28 18:39:27 server.go:174: INFO : server pid:29437
  9. 2019/12/28 18:39:27 service.go:264: INFO : methodDoReregister has wrong number of ins:1
  10. 2019/12/28 18:39:27 service.go:264: INFO : methodGetMetadata has wrong number of ins:1
  11. 2019/12/28 18:39:27 service.go:264: INFO : methodSetReregister has wrong number of ins:2
  12. 2019/12/28 18:39:27 service.go:264: INFO : methodUpdate has wrong number of ins:1
  13. 2019/12/28 18:39:27 service.go:289: INFO : methodWrapcall reply type not a pointer:wrap.EndPoint
  14. [18:39:27 CST 2019/12/28] [INFO] (server.go:77:561420000000001 localhost.localdomain) RpcxServer server start listen on tcp@192.168.56.142:18000
  15. 2019/12/28 18:39:27 server.go:174: INFO : server pid:29437

一个标准的rpc微服务就建成了,接下您可以简单写一个rpcx client 进行测试!

实战案例

微服务框架Odin 就是我们用Hera孵化的案例,点我查看代码

有人可能会有疑问,怎么没有孵化rpcx客户端的功能?

其实,客户端的代码可以通过rigger自动生成! 在Odin帮助文档中有详细说明带我们一步步搭建自己的微服务