dubbo-go-proxy Client에 대해서 얘기를 나눠보도록 하겠습니다.
4726 단어 golang
순서
본고는 주로 dubbo-go-proxy의 Client를 연구하고자 합니다.
Client
dubbo-go-proxy/pkg/client/client.go
// Client represents the interface of http/dubbo clients
type Client interface {
Init() error
Close() error
// Call invoke the downstream service.
Call(req *Request) (res interface{}, err error)
// MapParams mapping param, uri, query, body ...
MapParams(req *Request) (reqData interface{}, err error)
}
Client 인터페이스는 Init, Close, Call, MapParams 방법을 정의합니다.
Client
dubbo-go-proxy/pkg/client/dubbo/dubbo.go
// Client client to generic invoke dubbo
type Client struct {
lock sync.RWMutex
GenericServicePool map[string]*dg.GenericService
}
클라이언트는 lock,Generic ServicePool 속성을 정의하고 클라이언트 인터페이스를 실현합니다
Init
dubbo-go-proxy/pkg/client/dubbo/dubbo.go
// Init init dubbo, config mapping can do here
func (dc *Client) Init() error {
dc.GenericServicePool = make(map[string]*dg.GenericService, 4)
cls := config.GetBootstrap().StaticResources.Clusters
// dubbogo comsumer config
dgCfg = dg.ConsumerConfig{
Check: new(bool),
Registries: make(map[string]*dg.RegistryConfig, 4),
}
dgCfg.ApplicationConfig = defaultApplication
for i := range cls {
c := cls[i]
dgCfg.Request_Timeout = c.RequestTimeoutStr
dgCfg.Connect_Timeout = c.ConnectTimeoutStr
for k, v := range c.Registries {
if len(v.Protocol) == 0 {
logger.Warnf("can not find registry protocol config, use default type 'zookeeper'")
v.Protocol = defaultDubboProtocol
}
dgCfg.Registries[k] = &dg.RegistryConfig{
Protocol: v.Protocol,
Address: v.Address,
TimeoutStr: v.Timeout,
Username: v.Username,
Password: v.Password,
}
}
}
initDubbogo()
return nil
}
func initDubbogo() {
dg.SetConsumerConfig(dgCfg)
dg.Load()
}
Init 방법은 주로 ConsumerConfig를 구축하고 initDubbogo를 실행하는 것입니다.
Close
dubbo-go-proxy/pkg/client/dubbo/dubbo.go
// Close clear GenericServicePool.
func (dc *Client) Close() error {
dc.lock.Lock()
defer dc.lock.Unlock()
for k := range dc.GenericServicePool {
delete(dc.GenericServicePool, k)
}
return nil
}
close 방법은 자물쇠를 채워서 dc를 반복합니다.GenericServicePool에서 delete 작업 수행
Call
dubbo-go-proxy/pkg/client/dubbo/dubbo.go
// Call invoke service
func (dc *Client) Call(req *client.Request) (res interface{}, err error) {
types, values, err := dc.genericArgs(req)
if err != nil {
return nil, err
}
dm := req.API.Method.IntegrationRequest
method := dm.Method
logger.Debugf("[dubbo-go-proxy] dubbo invoke, method:%s, types:%s, reqData:%v", method, types, values)
gs := dc.Get(dm)
rst, err := gs.Invoke(req.Context, []interface{}{method, types, values})
if err != nil {
return nil, err
}
logger.Debugf("[dubbo-go-proxy] dubbo client resp:%v", rst)
return rst, nil
}
Call 방법은 dc를 통과합니다.Get (dm) Generic Service 를 통해 Generice Service 를 가져옵니다.Invoke 요청
MapParams
dubbo-go-proxy/pkg/client/dubbo/dubbo.go
// MapParams params mapping to api.
func (dc *Client) MapParams(req *client.Request) (interface{}, error) {
r := req.API.Method.IntegrationRequest
if len(r.ParamTypes) != len(r.MappingParams) {
return nil, errors.New("Numbers of param types and paramMappings are not the same")
}
var values []interface{}
for _, mappingParam := range r.MappingParams {
source, _, err := client.ParseMapSource(mappingParam.Name)
if err != nil {
return nil, err
}
if mapper, ok := mappers[source]; ok {
if err := mapper.Map(mappingParam, req, &values, buildOption(mappingParam)); err != nil {
return nil, err
}
}
}
return values, nil
}
MapParams 방법은 MappingParams를 훑어보고 클라이언트를 통해ParseMapSource를 통해 소스를 가져오고 mappers[source]를 통해 mapper를 가져오며 마지막으로 mapper의 Map 방법을 통해 변환합니다
작은 매듭
dubbo-go-proxy의client.Client 인터페이스는 Init, Close, Call, MapParams 방법을 정의합니다.그 두보.클라이언트는 클라이언트를 실현했다.클라이언트 인터페이스;주로 mapper를 통해 매개 변수를 변환한 다음Generic Service를 통해 변환합니다.Invoke 요청
doc
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.