gateway协议转换原理探究

30 阅读1分钟

实现功能

实现http协议转grpc,可以动态加载,新增proto可以实时动态生效

原理探究

业务模块

业务模块需要有一个api的配置文件,二元组,一个是http的path,一个是pb的方法,如果不配置的话会生成默认的(模块名/service名/方法名)

    - path: /user/Add
      api: /test.User/Add
      method: POST

以上就是test模块user这个service下的add方法

gateway模块

业务模块发布gateway的时候,gateway会动态的去业务模块的gitlab仓库,读取业务模块的proto。

用map去解析http请求的所有字段,包括query和body里的。

采用pb的反射库:github.com/jhump/proto…

func mapMessage(input map[string]interface{}, msg *dynamic.Message) error {
	fields := msg.GetKnownFields()
	for _, f := range fields {
		fn := f.GetName()
		v, ok := input[fn]
		if !ok || v == nil {
			continue
		}
		c := messageConverter{f, v}
		res, err := mapValue(c)
		if err != nil {
			return wrapError(err, fn)
		}
		msg.SetField(f, res)
	}
	return nil
}