找回密码
 立即注册
首页 业界区 安全 dubbo-go example学习记录

dubbo-go example学习记录

梭净挟 2025-10-1 17:17:54
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
  1. 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.
我对于这三个服务的理解是: 三个可选择相互之间替换的配置和注册中心.
1.png

上图是运行效果
  1. make -f build/Makefile docker-down
复制代码
这个是关闭docker-compose服务的方案
启动hello world server服务

以下内容是官方文档里面启动server的方案, 但是我没有找到../conf/dubbogo.yml
  1. cd helloworld/go-server/cmd
  2. export DUBBO_GO_CONFIG_PATH="../conf/dubbogo.yml"
  3. go run .
复制代码
我没有使用DUBBO_GO_CONFIG_PATH="../conf/dubbogo.yml"环境变量
启动hello world client服务
  1. cd helloworld/go-client/cmd
  2. go run main.go
复制代码

  • 那个配置文件确实不知道有什么用
效果

2.png

上方是server, 下面是client.
使用curl

使用curl指令检查功能是否可行
  1. curl \
  2.       --header "Content-Type: application/json" \
  3.       --data '{"name": "Dubbo"}' \
  4.       http://localhost:20000/greet.GreetService/Greet
复制代码
3.png

也可以证明服务是否是可行的
分析hello world实现代码

proto

关于proto文件夹中的协议文件不过多赘述, 这些内容本质上和其他框架一样都是统一的.
  1. syntax = "proto3";
  2. package greet;
  3. option go_package = "github.com/apache/dubbo-go-samples/helloworld/proto;greet";
  4. message GreetRequest {
  5.   string name = 1;
  6. }
  7. message GreetResponse {
  8.   string greeting = 1;
  9. }
  10. service GreetService {
  11.   rpc Greet(GreetRequest) returns (GreetResponse) {}
  12. }
复制代码
本质上就是实现了一个服务, 接受字符串name, 返回字符串greeting
探索如何编译出需要的.go文件
  1. protoc --go_out=. --go_opt=paths=source_relative \
  2.     --go-triple_out=. --go-triple_opt=paths=source_relative \
  3.     ./greet.proto
复制代码
生成的 .pb.go 文件主要负责数据结构和编码/解码。
.triple.go不存储服务的实现(implementation),而是存储服务的接口定义(interface definition)和 客户端桩代码(client stub)。
server code
  1. type GreetTripleServer struct {
  2. }
  3. func (srv *GreetTripleServer) Greet(ctx context.Context, req *greet.GreetRequest) (*greet.GreetResponse, error) {
  4.         resp := &greet.GreetResponse{Greeting: req.Name}
  5.         return resp, nil
  6. }
  7. func main() {
  8.         srv, err := server.NewServer(
  9.                 server.WithServerProtocol(
  10.                         protocol.WithPort(20000),
  11.                         protocol.WithTriple(),
  12.                 ),
  13.         )
  14.         if err != nil {
  15.                 panic(err)
  16.         }
  17.         if err := greet.RegisterGreetServiceHandler(srv, &GreetTripleServer{}); err != nil {
  18.                 panic(err)
  19.         }
  20.         if err := srv.Serve(); err != nil {
  21.                 logger.Error(err)
  22.         }
  23. }
复制代码
重点是实现了GreetTripleServer结构体, 这个结构体会实际处理proto文件中rpc interface定义的函数调用
使用了triple协议, 值得注意的是: 在client中没有WithTriple, 难道可以自动识别是什么RPC协议.
总结

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册