Dubbo-go Consumer调用Dubbo-java Provider

Dubbo-go Consumer调用Dubbo-java Provider

一、必要说明

需求: 实现golang客户端调用java服务端dubbo接口发送短信的功能

  • 服务端使用Java语言提供了短信发送的Dubbo接口(基于Dubbo 2.7.*)
  • 客户端基于dubbo-go 1.5.2-rc2调用以上Java提供的Dubbo Provider
  • 客户端要想使用dubbo-go 3.0Provider也必须使用dubbo-java 3.0

二、根据Java Provider Interface定义对应的golang Consumer客户端映射关系

import "context"

// SmsAlarmSendDTO 告警信息Dubbo调用数据结构
type SmsAlarmSendDTO struct {
	AppId        string                 `json:"appId"`
	Token        string                 `json:"token"`
	TemplateName string                 `json:"templateName"`
	TemplateData map[string]interface{} `json:"templateData"`
	TemplateSign string                 `json:"templateSign"`
	ExtendData   map[string]interface{} `json:"extendData"`
	PhoneNo      string                 `json:"phoneNo"`
}

func (SmsAlarmSendDTO) JavaClassName() string {
	return "com.xxx.fd.sms.send.dto.SmsAlarmSendDTO"
}

type ResultTo struct {
	Success bool `json:"success"`
	ErrorContext ErrorContext `json:"errorContext"`
	Data bool `json:"data"`
}

func (ResultTo) JavaClassName() string {
	return "com.xxx.fd.common.result.ResultTo"
}

type ErrorContext struct {
	ErrorStack      []CommonError `json:"errorStack"`
	ThirdPartyError string        `json:"thirdPartyError"`
}

func (ErrorContext) JavaClassName() string {
	return "com.xxx.fd.common.exception.ErrorContext"
}

type CommonError struct {
	ErrorCode ErrorCode `json:"errorCode"`
	ErrorMsg  string    `json:"errorMsg"`
	Location  string    `json:"location"`
}

func (CommonError) JavaClassName() string {
	return "com.xxx.fd.common.exception.CommonError"
}

type ErrorCode struct {
	SystemCode    string `json:"systemCode"`
	ErrorLevel    string `json:"errorLevel"`
	ErrorType     string `json:"errorType"`
	ErrorScene    string `json:"errorScene"`
	ErrorSpecific string `json:"errorSpecific"`
}

func (ErrorCode) JavaClassName() string {
	return "com.xxx.fd.common.exception.ErrorCode"
}

type SmsFacade struct {
	SendSmsAlarm func(ctx context.Context, dto SmsAlarmSendDTO) (ResultTo, error) `dubbo:"sendSmsAlarm"`
}

func (s *SmsFacade) Reference() string {
	return "SmsFacade"
}

三、Dubbo配置

客户端配置 dubbo-client.yml:

# dubbo client yaml configure file

check: true
# client
request_timeout: "3s"
# connect timeout
connect_timeout: "3s"

# application config
application:
  organization: "xxx.com"
  name: "SmsSendClient"
  module: "dubbo-go sms and voice send client"
  version: "0.0.1"
  environment: "dev"

# registry config
registries:
  "smsAndVoiceZk":
    protocol: "zookeeper"
    timeout: "10s"
    address: "10.255.23.5:2181"

# reference config
references:
  "SmsFacade":
    registry: "smsAndVoiceZk"
    protocol: "dubbo"
    version: "1.0.0"
    interface: "com.xxx.fd.sms.send.facade.SmsFacade"
    methods:
      - name: "sendSmsAlarm"
        retries: 0
  "VoiceSendFacade":
    registry: "smsAndVoiceZk"
    protocol: "dubbo"
    version: "1.0.0"
    interface: "com.xxx.fd.vms.send.facade.VoiceSendFacade"
    methods:
      - name: "sendVoice"
        retries: 0

# protocol config
protocol_conf:
  dubbo:
    reconnect_interval: 0
    connection_number: 1
    heartbeat_period: "5s"
    session_timeout: "180s"
    pool_size: 64
    pool_ttl: 600
    getty_session_param:
      compress_encoding: false
      tcp_no_delay: true
      tcp_keep_alive: true
      keep_alive_period: "120s"
      tcp_r_buf_size: 262144
      tcp_w_buf_size: 65536
      pkg_rq_size: 1024
      pkg_wq_size: 512
      tcp_read_timeout: "5s"
      tcp_write_timeout: "10s"
      wait_timeout: "3s"
      max_msg_len: 1024000
      session_name: "client"

日志配置文件:dubbo-client-log.yml

level: "debug"
development: true
disableCaller: false
disableStacktrace: false
sampling:
encoding: "console"

# encoder
encoderConfig:
  messageKey: "message"
  levelKey: "level"
  timeKey: "time"
  nameKey: "logger"
  callerKey: "caller"
  stacktraceKey: "stacktrace"
  lineEnding: ""
  levelEncoder: "capital"
  timeEncoder: "iso8601"
  durationEncoder: "seconds"
  callerEncoder: "short"
  nameEncoder: ""

outputPaths:
  - "stderr"
errorOutputPaths:
  - "stderr"
initialFields:

四、服务调用

  • 注意启动前,启动前,需要设置配置文件路径的环境变量
CONF_CONSUMER_FILE_PATH=/etc/conf/
APP_LOG_CONF_FILE=/etc/conf/dubbo-client-log.yml
var (
	smsSendProvider   *sms.SmsFacade
)

// InitDubboClient 初始化短信和语音发送Dubbo 客户端
func InitDubboClient() {
	smsSendProvider := new(sms.SmsFacade)

	hessian.RegisterPOJO(&sms.SmsAlarmSendDTO{})
	hessian.RegisterPOJO(&sms.ResultTo{})
	hessian.RegisterPOJO(&sms.ErrorContext{})
	hessian.RegisterPOJO(&sms.ErrorCode{})
	hessian.RegisterPOJO(&sms.CommonError{})

	dubboConfig.SetConsumerService(smsSendProvider)
	dubboConfig.Load()
}

// SendSmsAlarm 发送告警短信
func SendSmsAlarm(ctx context.Context, smsDto sms.SmsAlarmSendDTO) error {
	if smsSendProvider == nil {
		return fmt.Errorf("smsSendProvider consumer not initialized properly")
	}

	result, err := smsSendProvider.SendSmsAlarm(ctx, smsDto)
	if err != nil {
		return fmt.Errorf("SendSmsAlarm failed:%v", err)
	}

	seelog.Debugf("SendSmsAlarm success, result is:%v", result)
	return nil
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 Dubbo 客户端和服务端调用示例: 服务端: 1. 定义接口 ```java public interface HelloService { String sayHello(String name); } ``` 2. 实现接口 ```java public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello, " + name; } } ``` 3. 配置服务 在 resources 目录下创建 dubbo 目录,并在其中新建一个名为 provider.xml 的文件,配置如下: ```xml <?xml version="1.0" encoding="UTF-8"?> <dubbo:service interface="com.example.demo.HelloService" ref="helloService" timeout="5000" version="1.0.0"> </dubbo:service> <bean id="helloService" class="com.example.demo.HelloServiceImpl"/> ``` 4. 启动服务 ```java public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo/provider.xml"}); context.start(); System.in.read(); // 按任意键退出 } } ``` 客户端: 1. 配置服务 在 resources 目录下创建 dubbo 目录,并在其中新建一个名为 consumer.xml 的文件,配置如下: ```xml <?xml version="1.0" encoding="UTF-8"?> <dubbo:application name="consumer"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:reference id="helloService" interface="com.example.demo.HelloService" version="1.0.0"/> ``` 2. 调用服务 ```java public class Consumer { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo/consumer.xml"}); context.start(); HelloService helloService = (HelloService) context.getBean("helloService"); String result = helloService.sayHello("Dubbo"); System.out.println(result); } } ``` 使用 ZooKeeper 作为注册中心,服务端和客户端需要先启动 ZooKeeper,然后再启动服务端和客户端。 以上是一个简单的 Dubbo 客户端和服务端调用示例,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值