grpc 想 生成 java / go 的代码 的话 ,就得安装 protoc 这个程序
linux 下(arch) 安装 就是 sudo pacman -S protobuf
这样当你想生成 对应 java / go 代码 的时候 就 只要
比如 protoc -I="./protobuf" --go_out=./ ./protobuf/user.proto
这里 --go_out 就是代表你 生成的产品 所在路径 如果是 java 的话就 是 --java_out 参数
结果 截图 如下
你可能会疑问 --go_out=./ 不是 当前 根目录 么 ,为什么 产物 会在 那么深的路径里面 答案在 proto 文件里面
因为指定了 option go_package = "micro-service/api/protobuf/user/v1";
package 包名,所以他就会以 根目录为基础 ,按照 包名层次 创建 了 (下面创建java的时候也同理)
但是 这种创建方法 是 官方 的 ,他 只是 根据 Proto 里面 定义 的实体 创建 了 不同语言的 实体而已 ,service 他 是 没有创建 的 ,
要想 创建 service , 就必须 安装 插件
生成 go grpc service 的插件 叫 protoc-gen-grpc-java
protoc-gen-grpc-java
先下载
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26 $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
下载完成后 cd ~/go/bin
可以看到 已经安装好了
然后 在 把 ~/go/bin 放到环境变量里面 去, 不然 protoc 到时候 找不到 这个插件
$ export PATH="$PATH:$(go env GOPATH)/bin"
注意这个命令 的环境变量只是 当前 shell 有效 ,你重新开个或者 重启 机器就 没有用了 ,要想永久有效的话最好 放 /etc/profile 或者 你自己的 bashrc/zshrc 里面 去
然后 就可以 执行 protoc -I="./protobuf" --go_out=./ --go-grpc_out=./ ./protobuf/user.proto
生成 grpc 实体和服务了
可以看到 service 都给你生成好了
java 找了半天 …… 网上 都是 在 java 项目里面 装 对应 的 maven 插件 ,然后 maven 编译得到 的 ,但是这样 你 的proto 文件 必须在 java 项目里面 ,但是我的 protobuf 是 在 java 和 go 项目外面的 ,所以不适应这种情况
因此也可以 安装 protoc-gen-grpc-java 插件 来解决这个问题
protoc-gen-grpc-java 插件下载地址
下载好后 把他命名成 protoc-java-plugin
放在根目录下
然后 执行 protoc --plugin=protoc-gen-grpc-java=./protoc-java-plugin --java_out="./gateway/src/main/java" --grpc-java_out="./gateway/src/main/java" --proto_path="./protobuf" "./protobuf/user.proto"
就能看到 结果 了!
附带 spring-boot 搭配 grpc 的 文章 https://yidongnan.github.io/grpc-spring-boot-starter/zh-CN/server/getting-started.html