本文从一个 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