dubbo-go example学习记录

dubbo-go example仓库地址: https://github.com/apache/dubbo-go-samples

你可以在 https://github.com/apache/dubbo-go-samples/blob/main/README_CN.md 查看中文的README文档

快速上手

这个是通过 https://cn.dubbo.apache.org/zh-cn/blog/2021/01/14/快速上手-dubbo-go/ 官方博客中的内容进行快速入门.

这只是一个参考

注册中心可替换,官方推荐的是 zk
如果有变更,注册中心将基于长连接推送变更数据给消费者,注册中心,服务提供者,服务消费者三者之间均为长连接
基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
消费者在本地缓存了提供者列表

clone

git clone https://github.com/apache/dubbo-go-samples.git

项目结构

cmd 是 command(命令)的缩写。它的主要作用是存放项目的 main 包,也就是程序启动的地方。一个项目中可以有多个 main 包,每个包对应一个不同的可执行程序。

启动docker-compose

使用make -f build/Makefile docker-up启动服务

该项目使用docker-compose来运行依赖的文件, 主要是zookeeper, etcd, nacos.

我对于这三个服务的理解是: 三个可选择相互之间替换的配置和注册中心.

image

上图是运行效果

make -f build/Makefile docker-down

这个是关闭docker-compose服务的方案

启动hello world server服务

以下内容是官方文档里面启动server的方案, 但是我没有找到../conf/dubbogo.yml

cd helloworld/go-server/cmd
export DUBBO_GO_CONFIG_PATH="../conf/dubbogo.yml"
go run .

我没有使用DUBBO_GO_CONFIG_PATH="../conf/dubbogo.yml"环境变量

启动hello world client服务

cd helloworld/go-client/cmd
go run main.go
  • 那个配置文件确实不知道有什么用

效果

image

上方是server, 下面是client.

使用curl

使用curl指令检查功能是否可行

curl \
      --header "Content-Type: application/json" \
      --data '{"name": "Dubbo"}' \
      http://localhost:20000/greet.GreetService/Greet

image

也可以证明服务是否是可行的

分析hello world实现代码

proto

关于proto文件夹中的协议文件不过多赘述, 这些内容本质上和其他框架一样都是统一的.

syntax = "proto3";

package greet;

option go_package = "github.com/apache/dubbo-go-samples/helloworld/proto;greet";

message GreetRequest {
  string name = 1;
}

message GreetResponse {
  string greeting = 1;
}

service GreetService {
  rpc Greet(GreetRequest) returns (GreetResponse) {}
}

本质上就是实现了一个服务, 接受字符串name, 返回字符串greeting

探索如何编译出需要的.go文件

protoc --go_out=. --go_opt=paths=source_relative \
    --go-triple_out=. --go-triple_opt=paths=source_relative \
    ./greet.proto

生成的 .pb.go 文件主要负责数据结构和编码/解码。
.triple.go不存储服务的实现(implementation),而是存储服务的接口定义(interface definition)和 客户端桩代码(client stub)。

server code

type GreetTripleServer struct {
}

func (srv *GreetTripleServer) Greet(ctx context.Context, req *greet.GreetRequest) (*greet.GreetResponse, error) {
	resp := &greet.GreetResponse{Greeting: req.Name}
	return resp, nil
}

func main() {
	srv, err := server.NewServer(
		server.WithServerProtocol(
			protocol.WithPort(20000),
			protocol.WithTriple(),
		),
	)
	if err != nil {
		panic(err)
	}

	if err := greet.RegisterGreetServiceHandler(srv, &GreetTripleServer{}); err != nil {
		panic(err)
	}

	if err := srv.Serve(); err != nil {
		logger.Error(err)
	}
}

重点是实现了GreetTripleServer结构体, 这个结构体会实际处理proto文件中rpc interface定义的函数调用
使用了triple协议, 值得注意的是: 在client中没有WithTriple, 难道可以自动识别是什么RPC协议.

总结

感觉和grpc区别不大, 感觉不到什么明显不同.

posted @ 2025-09-13 16:05  xuhe2  阅读(13)  评论(0)    收藏  举报