dubbo-go 白话文 | go 和 java 互通有无

本文从一个 BUG 入手,手把手教你 dubbogo 调用 dubbogo 或 dubbo 服务

一、前言

昨天邹部长在群里@我让看一个关于 dubbogo 调用 dubbo 报错的问题,问题issue地址,于是我跑了 dubbogo + dubbbo 的测试代码来定位这个问题,因为之前也没跨语言调用,从零开始搭建,踩到了一些新人使用 dubbogo 的坑,把这个过程记录下供大家参考。

二、解决问题

2.1 准备 dubbo 服务提供者

2.1.1 基本定义

定义 DemoService 接口:

public interface DemoService {
   

    String sayHello(String name);

    String sayHello(User user);

    String sayHello(User user, String name);

}

定义 User 对象:

public class User implements Serializable {
   

    private String name;

    private int age;

    ......
}
2.1.2 启动 dubbo 服务提供者

用的 dubbo 官方示例代码:

public static void main(String[] args) throws IOException {
   
    // 服务实现
    DemoService demoService = new DemoServiceImpl();

    // 当前应用配置
    ApplicationConfig application = new ApplicationConfig();
    application.setName("demoProvider");

    // 连接注册中心配置
    RegistryConfig registry = new RegistryConfig();
    registry.setAddress("127.0.0.1:2181");
    registry.setProtocol("zookeeper");
    registry.setUsername("");
    registry.setPassword("");

    // 服务提供者协议配置
    ProtocolConfig protocol = new ProtocolConfig();
    protocol.setName("dubbo");
    protocol.setPort(12345);
    protocol.setThreads(200);

    // 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口

    // 服务提供者暴露服务配置
    ServiceConfig<DemoService> service = new ServiceConfig<>(); // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
    service.setApplication(application);
    service.setRegistry(registry); // 多个注册中心可以用setRegistries()
    service.setProtocol(protocol); // 多个协议可以用setProtocols()
    service.setInterface(DemoService.class);
    service.setRef(demoService);
    service.setVersion("1.0.0");
    service.setGroup("tc");
    service.setTimeout(60 * 1000);

    // 暴露及注册服务
    service.export();

    System.in.read();
}

查看 zookeeper 看是否注册成功:

$ls /dubbo/com.funnycode.DemoService/providers
[dubbo%3A%2F%2F127.0.0.1%3A12345%2Fcom.funnycode.DemoService%3Fanyhost%3Dtrue%26application%3DdemoProvider%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26generic%3Dfalse%26group%3Dtc%26interface%3Dcom.funnycode.DemoService%26methods%3DsayHello%26pid%3D18167%26release%3D2.7.7%26revision%3D1.0.0%26side%3Dprovider%26threads%3D200%26timestamp%3D1606896020691%26version%3D1.0.0]

如上的输出表示服务提供方已经启动。

2.2 准备 dubbo 服务消费者

2.2.1 基本定义

定义 User 对象:

type User struct {
   
	Name string
	Age  int
}

func (User) JavaClassName() string {
   
	return "com.funnycode.User"
}

定义 DemoProvider 接口:

type DemoProvider struct {
   
	SayHello  func(ctx context.Context, name string) (string, error)            `dubbo:"sayHello"`
	SayHello2 func(ctx context.Context, user User) (string, error)              `dubbo:"sayHello"`
	SayHello3 func(ctx context.Context, user User, name string) (string, error) `dubbo:"sayHello"`
}

func (p *DemoProvider) Reference() string {
   
	return "DemoProvider"
}
2.2.2 启动 dubbogo 消费者
func main() {
   
	config.Load()
	gxlog.CInfo("\n\n\nstart to test dubbo")

	res, err := demoProvider.SayHello(context.TODO(), "tc")
	if err != nil {
   
		panic(err)
	}

	gxlog.CInfo("response result: %v\n", res)

	user := User{
   
		Name: "tc",
		Age:  18,
	}

	res, err = demoProvider.SayHello2(context.TOD
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值