一、环境
- mac mini m2
- brew version 4.1.15
- go sdk version 1.20.6
- goland 2023.2.3
二、安装一些插件
brew install protobuf
brew install protoc-gen-go
brew install protoc-gen-go-grpc
brew install bufbuild/buf/buf
三、构建 BSR 仓库(推荐使用buf.work模式)
目录结构,
gateway
是工作区目录,buf push
目前不支持直接在根目录进行push
操作
# lhdht/proto/buf.work.yaml
version: v1
directories:
- gateway
# lhdht/proto/gateway/buf.yaml
# 这里可以直接cd进来,执行buf mod init直接生成
version: v1
name: buf.build/lhdht/gateway # 此处是你的BSR仓库地址,暂不支持工作区列表,只能单独提交模块
deps: # 依赖目录,如果依赖其他工作区的东西需要在这里导入,详情看官方文档,写的很清楚
四、定义一个proto文件
// lhdht/proto/gateway/acme/config/v1/system.proto
syntax = "proto3";
package acme.config.v1;
message Config {
uint64 id = 1;
string name = 2;
string desc = 3;
uint32 state = 4;
string flag = 5;
string address = 6;
bool type = 7;
uint64 use_multipoint = 8;
uint64 ip_limit_count = 9;
uint64 ip_limit_time = 10;
repeated string route_rules = 11;
}
message GetConfigListRequest {
uint64 page = 1;
uint32 page_size = 2;
string search_key = 3;
uint32 state = 4;
}
message GetConfigListResponse {
repeated Config list = 1;
}
service ConfigService {
rpc GetConfigList(GetConfigListRequest) returns (GetConfigListResponse);
}
五、提交BSR仓库
在buf.build官网注册并创建BSR仓库,生成Token,在本地登陆后,再往后看,官网写的很详细
为什么目录会这么深,是因为要遵守buf cli的规范
buf lint
如果没有异常返回则可以提交,当然也可以忽略,建议遵守规范cd ./gateway
-buf push
返回id则成功
六、在项目中使用BSR仓库
项目根目录创建
buf.gen.yaml
version: v1
managed:
enabled: true
go_package_prefix:
default: lhdht_child_system_gin/gen
plugins:
- plugin: buf.build/grpc/go
out: gen
opt: paths=source_relative
- plugin: buf.build/protocolbuffers/go
out: gen
opt: paths=source_relative
buf generate [BSR仓库地址]
- 例:
buf generate buf.build/lhdht/gateway
- 例:
- buf.build 暂未提供批量执行BSR构建(也可能是我没找到,找到的兄弟记得传送门),如果需要执行的工作区太多,建议直接写个批处理命令
七、使用案例(go)
buf generate [BSR仓库地址]
有概率因为网络的原因构建失败,多试几次就好,懂得都懂
package main
// 1.需要监听
// 2.需要实例化gRPC服务端
// 3.在gRPC商注册微服务
// 4.启动服务端
import (
"context"
"fmt"
"google.golang.org/grpc"
pb "lhdht_child_system_gin/gen/acme/config/v1" // 这里是 buf generate [BSR仓库生成的]
"net"
)
// 定义空接口
type SystemConfigService struct {
pb.UnimplementedConfigServiceServer
}
var u = SystemConfigService{}
// 实现方法
func (s *SystemConfigService) GetConfigList(ctx context.Context, req *pb.GetConfigListRequest) (resp *pb.GetConfigListResponse, err error) {
list := []*pb.Config{
{
Name: "系统配置",
},
}
resp = &pb.GetConfigListResponse{List: list}
return
}
func main() {
// 地址
addr := "127.0.0.1:8080"
// 1.监听
listener, err := net.Listen("tcp", addr)
if err != nil {
fmt.Printf("监听异常:%s\n", err)
}
fmt.Printf("监听端口:%s\n", addr)
// 2.实例化gRPC
s := grpc.NewServer()
// 3.在gRPC上注册微服务
pb.RegisterConfigServiceServer(s, &u)
// 4.启动服务端
s.Serve(listener)
}