实现功能
实现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的反射库:https://github.com/jhump/protoreflect,去动态的加载生成proto的对象,并基于filedName赋值【要求filedName和http请求的字段名必须一一对应】。以下是赋值的代码段
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
}