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.
我对于这三个服务的理解是: 三个可选择相互之间替换的配置和注册中心.
上图是运行效果
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
- 那个配置文件确实不知道有什么用
效果
上方是server, 下面是client.
使用curl
使用curl指令检查功能是否可行
curl \--header "Content-Type: application/json" \--data '{"name": "Dubbo"}' \http://localhost:20000/greet.GreetService/Greet
也可以证明服务是否是可行的
分析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区别不大, 感觉不到什么明显不同.