實現(xiàn)功能
實現(xiàn)http協(xié)議轉(zhuǎn)grpc迎变,可以動態(tài)加載蓖乘,新增proto可以實時動態(tài)生效
原理探究
業(yè)務(wù)模塊
業(yè)務(wù)模塊需要有一個api的配置文件,二元組峦睡,一個是http的path翎苫,一個是pb的方法,如果不配置的話會生成默認(rèn)的(模塊名/service名/方法名)
- path: /user/Add
api: /test.User/Add
method: POST
以上就是test模塊user這個service下的add方法
gateway模塊
業(yè)務(wù)模塊發(fā)布gateway的時候榨了,gateway會動態(tài)的去業(yè)務(wù)模塊的gitlab倉庫煎谍,讀取業(yè)務(wù)模塊的proto。
用map去解析http請求的所有字段龙屉,包括query和body里的呐粘。
采用pb的反射庫:https://github.com/jhump/protoreflect满俗,去動態(tài)的加載生成proto的對象,并基于filedName賦值【要求filedName和http請求的字段名必須一一對應(yīng)】作岖。以下是賦值的代碼段
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
}