跳到主要内容

使用

仓库: git@github.com:Mandala-lab/manifests.git

使用buf

kratos目录作为要共享的proto目录, 只需要编写proto, 然后kratos-demo引用时使用buf generate会自动生成pb.go代码

优点:

  1. 跨平台, 不需要配置Makefile来运行protoc等问题
  2. 可维护, 微服务rpc需要调用其它的微服务的rpc时, 使用buf来管理proto文件的更新和拉取
  3. 可扩展, 可编写插件
  4. Lint配置, 格式化

使用

提供proto供其它微服务使用

进入到kratos目录: 字段解释: buf.yaml 是 Buf 项目的核心配置文件,用于设置:

  1. 版本信息 (version):
  • version: v2 指定了 Buf 的配置文件版本。
  • 每次 Buf 的更新可能会引入新的特性或调整配置规范,v2 是目前的主流版本。
  1. 名称 (name):
  • buf.build/mandala/test 是在 Buf Schema Registry (BSR) 上注册的模块名称。
  • 所有与模块相关的 Protobuf 文件会在该名称下托管。
  1. 代码检查 (lint):
  • use: - STANDARD: 使用标准的 Lint 检查规则。
  • except: - FIELD_NOT_REQUIRED, PACKAGE_NO_IMPORT_CYCLE: 禁用了以下规则:
    • FIELD_NOT_REQUIRED: 忽略未标记为 required 的字段警告。
    • PACKAGE_NO_IMPORT_CYCLE: 忽略包导入循环检查。
  • disallow_comment_ignores: true: 禁止通过注释忽略 Lint 检查。
  1. 依赖库 (deps):
  • deps 列出所依赖的 Protobuf 库模块,例如:
    • buf.build/googleapis/googleapis:Google 提供的 API 原型库。
    • buf.build/bufbuild/protovalidate:buf 的验证插件。
  1. 向后兼容检查 (breaking):
  • use: - FILE: 开启文件级别的向后兼容性检查。
  • except:except :
    • EXTENSION_NO_DELETE: 允许删除扩展字段。
    • FIELD_SAME_DEFAULT: 忽略字段默认值的变更。

编写protto, 需要依赖就在buf.yaml的deps引入

version: v2
name: buf.build/mandala/test #创建的BSR
lint:
use:
- STANDARD
except:
- FIELD_NOT_REQUIRED
- PACKAGE_NO_IMPORT_CYCLE
disallow_comment_ignores: true
deps: # 依赖的proto库
- buf.build/googleapis/googleapis
- buf.build/bufbuild/protovalidate
breaking:
use:
- FILE
except:
- EXTENSION_NO_DELETE
- FIELD_SAME_DEFAULT

登录到BSR(buf schema register)类似github仓库, 主要用来存储需要对内外的微服务公开proto文件的地方

  • --prompt: 直接输入token, 不需要在浏览器打开
buf registry login --prompt
cd kratos

buf dep update
buf push

微服务使用调用远程rpc

编写buf.gen.yaml

首先理解 buf.gen.yaml 配置 buf.gen.yaml 是用于控制代码生成的配置文件,设置内容包括:

  1. version: v2,与 buf.yaml 一样,表示配置文件的版本。

  2. managed: 托管模式

  • enabled: true:启用了托管模式,Buf 会管理 Protobuf 文件中的部分元数据。
  • disable:disable : 禁用了对依赖模块(如 googleapis, protovalidate)中的 go_package 选项的管理。
  • override:override :
    • go_package_prefix: 强制覆盖 go_package 的前缀,例如这里将生成代码的包前缀设置为 order_services/api。
  1. 插件配置 (plugins):

列出了要运行的代码生成器插件。 远程插件:

  • buf.build/grpc/go:用于生成 gRPC 的 Go 代码。
  • buf.build/protocolbuffers/go:生成标准的 Protobuf Go 类型。

本地插件:

  • protoc-gen-go-http:生成 HTTP 到 gRPC 的映射代码。

每个插件都有:

  • out: 生成代码输出的路径。
  • opt: 配置生成器的选项,例如 paths=source_relative 保持路径与源文件一致。
  1. 输入模块 (inputs):

指定要生成代码的输入模块。

  • module: buf.build/mandala/test:# BSR地址或者github地址。
    • types:
      • api.acme.v1:# 按需引用需要微服务的包
      • api.cart.v1:# 按需引用需要微服务的包
cd kratos-demo

cat > buf.gen.yaml <<EOF
version: v2
managed:
enabled: true
disable:
- file_option: go_package
module: buf.build/googleapis/googleapis
- file_option: go_package
module: buf.build/bufbuild/protovalidate
- file_option: go_package
module: buf.build/grpc-ecosystem/grpc-gateway
override:
- file_option: go_package_prefix
value: carts/api
plugins:
- remote: buf.build/grpc/go
out: .
opt: paths=source_relative
- remote: buf.build/protocolbuffers/go
out: .
opt: paths=source_relative
- local: protoc-gen-go-http
out: .
opt: paths=source_relative
inputs:
- module: buf.build/mandala/test
types:
- acme.demo.v1
- api.cart.v1
EOF

# 生成pb文件, 因为plugins对象的local: protoc-gen-go-http设置为. 即在buf配置文件所在的目录生成api/cart/v1的proto的pb文件
buf generate