文章目录
基本环境处理
https://cn.dubbo.apache.org/zh-cn/overview/quickstart/go/install/

这里没有 protoc-gen-go --version
执行
bash
go get -u github.com/golang/protobuf/protoc-gen-go

进入到这个目录执行
bash
go build
bash
go install
这样就会出现在 go/bin 目录里面了,如果已经增加了这个环境变量了,就可以使用该命令了

分别验证
bash
protoc --version
libprotoc 22.2
bash
protoc-gen-go-triple --version
protoc-gen-go-triple 1.0.8
bash
protoc-gen-go --version
protoc-gen-go: unknown argument "--version" (this program should be run by protoc, not directly)
这个错误先不管。
编译pb接口
bash
protoc --go_out=. --go-triple_out=. ./samples_api.proto
- --go_out=. 用到protoc-gen-go插件,生成文件到当前目录
- --go-triple_out=. 使用 protoc-gen-go-triple插件,生成文件到当前目录
当然默认的样例工程其实已经包含了编译好的文件
开启rpc调用
回到项目根目录
bash
go mod tidy
分别启动server端和client端
bash
cd go-server/cmd
bash
go run .
bash
cd go-client/cmd
bash
go run .
服务端效果

客户端效果

业务观察

这个的提供的样例模块
protoc的定义是
protoc
message HelloRequest {
string name = 1;
}
翻译出来的go代码对应核心的地方就是这里
client代码增加注释
go
package main
import (
"context"
)
import (
"dubbo.apache.org/dubbo-go/v3/common/logger"
"dubbo.apache.org/dubbo-go/v3/config"
_ "dubbo.apache.org/dubbo-go/v3/imports"
"helloworld/api"
)
// 创建一个grpc的实例
var grpcGreeterImpl = new(api.GreeterClientImpl)
// export DUBBO_GO_CONFIG_PATH= PATH_TO_SAMPLES/helloworld/go-client/conf/dubbogo.yaml
func main() {
config.SetConsumerService(grpcGreeterImpl)
if err := config.Load(); err != nil {
panic(err)
}
logger.Info("start to test dubbo")
// 传递参数
req := &api.HelloRequest{
Name: "laurence",
}
// grpc的调用
reply, err := grpcGreeterImpl.SayHello(context.Background(), req)
if err != nil {
logger.Error(err)
}
logger.Infof("client response result: %v\n", reply) // reply是具体响应的信息
}
qa1 能取出protoc里面的字段值吗?
go
package main
import (
"context"
)
import (
"dubbo.apache.org/dubbo-go/v3/common/logger"
"dubbo.apache.org/dubbo-go/v3/config"
_ "dubbo.apache.org/dubbo-go/v3/imports"
"helloworld/api"
)
// 创建一个grpc的实例
var grpcGreeterImpl = new(api.GreeterClientImpl)
// export DUBBO_GO_CONFIG_PATH= PATH_TO_SAMPLES/helloworld/go-client/conf/dubbogo.yaml
func main() {
config.SetConsumerService(grpcGreeterImpl)
if err := config.Load(); err != nil {
panic(err)
}
logger.Info("start to test dubbo")
// 传递参数
req := &api.HelloRequest{
Name: "laurence",
}
// grpc的调用
reply, err := grpcGreeterImpl.SayHello(context.Background(), req)
if err != nil {
logger.Error(err)
}
logger.Infof("client response result: %v\n", reply) // reply是具体响应的信息
logger.Infof("Name is %v \n", reply.Name)
logger.Infof("Age is %v \n", reply.Age)
logger.Infof("Id is %v \n", reply.Id)
}