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.
我对于这三个服务的理解是: 三个可选择相互之间替换的配置和注册中心.
上图是运行效果
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区别不大, 感觉不到什么明显不同.
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]