dubbo.apache.org/dubbo-go/v3@v3.1.1/protocol/jsonrpc/jsonrpc_invoker.go (about)

     1  /*
     2   * Licensed to the Apache Software Foundation (ASF) under one or more
     3   * contributor license agreements.  See the NOTICE file distributed with
     4   * this work for additional information regarding copyright ownership.
     5   * The ASF licenses this file to You under the Apache License, Version 2.0
     6   * (the "License"); you may not use this file except in compliance with
     7   * the License.  You may obtain a copy of the License at
     8   *
     9   *     http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  
    18  package jsonrpc
    19  
    20  import (
    21  	"context"
    22  )
    23  
    24  import (
    25  	"github.com/dubbogo/gost/log/logger"
    26  )
    27  
    28  import (
    29  	"dubbo.apache.org/dubbo-go/v3/common"
    30  	"dubbo.apache.org/dubbo-go/v3/common/constant"
    31  	"dubbo.apache.org/dubbo-go/v3/protocol"
    32  	invocation_impl "dubbo.apache.org/dubbo-go/v3/protocol/invocation"
    33  )
    34  
    35  // JsonrpcInvoker is JSON RPC invoker
    36  type JsonrpcInvoker struct {
    37  	protocol.BaseInvoker
    38  	client *HTTPClient
    39  }
    40  
    41  // NewJsonrpcInvoker creates JSON RPC invoker with @url and @client
    42  func NewJsonrpcInvoker(url *common.URL, client *HTTPClient) *JsonrpcInvoker {
    43  	return &JsonrpcInvoker{
    44  		BaseInvoker: *protocol.NewBaseInvoker(url),
    45  		client:      client,
    46  	}
    47  }
    48  
    49  // Invoke the JSON RPC invocation and return result.
    50  func (ji *JsonrpcInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result {
    51  	var result protocol.RPCResult
    52  
    53  	inv := invocation.(*invocation_impl.RPCInvocation)
    54  	url := ji.GetURL()
    55  	req := ji.client.NewRequest(url, inv.MethodName(), inv.Arguments())
    56  	ctxNew := context.WithValue(ctx, constant.DubboGoCtxKey, map[string]string{
    57  		"X-Proxy-ID": "dubbogo",
    58  		"X-Services": url.Path,
    59  		"X-Method":   inv.MethodName(),
    60  	})
    61  	result.Err = ji.client.Call(ctxNew, url, req, inv.Reply())
    62  	if result.Err == nil {
    63  		result.Rest = inv.Reply()
    64  	}
    65  	logger.Debugf("result.Err: %v, result.Rest: %v", result.Err, result.Rest)
    66  
    67  	return &result
    68  }