Grpc使用buf.build 快速编译

本文通过实例来讲解使用buf来快速的编译proto文件,不需要再用protoc命令加各种参数来编译proto文件。

事先需要安装buf, 安装方法请参考官网installation
  1. 我们先建立目录结构

image.png

  1. auth.proto
syntax = "proto3";

option go_package ="trade/auth/pb/proto/go/auth/v1;authV1";

package auth.v1;

message LoginRequest {
  string username = 1;
  string password = 2;
}

message LoginResponse {
  string access_token = 1;
  int32 expires_in = 2;
}


service AuthService {
    rpc Login (LoginRequest) returns (LoginResponse);
}
  1. 进入proto文件夹,执行buf mod init
cd trade/apps/auth/pb/proto

buf mod init
  1. 进入上级pb文件夹 添加buf.gen.yaml文件

image.png
buf.gen.yaml的配置,此处用到的plugin是本地形式的,请提前装好红框里的插件
image.png
怎么装,请自行百度,如果有疑问可以私信我。

# buf.gen.yaml
version: v1
plugins:
  - plugin: go
    out: gen/proto/go
    opt: paths=source_relative
  - plugin: go-grpc
    out: gen/proto/go
    opt: paths=source_relative
  1. 输入命令 buf generate 进行编译,生成grpc的代码
    buf generate
    image.png
  2. 如果需要生成grpc-gateway的代码,请继续向下看
  • 在pb目录下创建一个auth.yaml
type: google.api.Service
config_version: 3

http:
  rules:
    - selector: auth.v1.AuthService.Login
      post: "/v1/login"
      body: "*"
  • 修改buf.gen.yaml,添加grpc-gateway插件,并指定http接口规则的文件为auth.yaml
  - plugin: grpc-gateway
    out: gen/proto/go
    opt:
      - paths=source_relative
      - grpc_api_configuration=auth.yaml
  • 重新执行 buf generate 进行编译,生成proto文件对应的gw文件

image.png

  1. 如果需要使用第三方的validate组件,如:protoc-gen-validate
  • 修改buf, 添加deps
version: v1
deps:
  - buf.build/envoyproxy/protoc-gen-validate
breaking:
  use:
    - FILE
lint:
  use:
    - DEFAULT
  • 进入proto目录 执行buf mod update 锁定对应的版本号

执行完命令后会多出一个buf.lock的文件
image.png
当然也可以手动写死版本号 例如:

deps:
  - buf.build/envoyproxy/protoc-gen-validate:6607b10f00ed4a3d98f906807131c44a
  • 修改auth.proto文件

image.png

  • 修改 buf.gen.yaml 添加 validate的plugin
    image.png
  • 在pb文件下创建 buf.work.yaml,定义一个工作区,可以使得auth.proto文件直接导入deps的proto文件
version: v1
directories:
  - proto
  • 重新执行 buf generate 进行编译,生成proto文件对应的validate文件

image.png

如果在用的过程中有问题,可以随时私信我

转载时请注明原文地址,谢谢

程序猿

37 声望
4 粉丝
0 条评论
推荐阅读
用golang的channel特性,来做简易分拣机的中控部分
先介绍一下项目的背景,之前单位有一个做小型快递分拣机的需求,针对小型包裹智能分拣到不通的出口。大致的物理传送带如下方图所示,原谅我不会画图。此文章的目的,只是给大家展示一下golang channel的用处。

这个名字好长阅读 347

前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin23阅读 3.2k评论 6

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀24阅读 57.9k评论 2

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100216阅读 11.5k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100215阅读 11.9k评论 4

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.6k

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.2k

程序猿

37 声望
4 粉丝
宣传栏