go微服务系列(四) - http api中引入protobuf
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了go微服务系列(四) - http api中引入protobuf,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2818字,纯文字阅读大概需要5分钟。
内容图文
1. protobuf相关依赖安装
- 第一步:下载grpc通用编译器
如下图,解压出来因平台而异会是一个protoc
或者protoc.exe
- 第二步:把下载的二进制文件路径添加到环境变量中(为了能全局访问protoc)
- 这里以为mac为例子
# 打开这个
vim /etc/paths
# 把路径添加进去
/Users/emm/others/protoc-3.12.4-osx-x86_64/bin/protoc
# 刷新环境变量
source /etc/paths
- 第三步: 安装go专用的protoc的生成器
go get github.com/golang/protobuf/protoc-gen-go
安装后会在GOPATH
目录下生成可执行文件,protobuf的编译器插件protoc-gen-go
,等下执行protoc
命令会自动调用这个插件
- 第四步: 安装go-micro对应的插件
go get github.com/micro/protoc-gen-micro
2. 改造之前的client
2.1 新建proto文件
- 新建
models/protos
文件夹 - 在上述文件夹下新建
prod.proto
文件,内容如下:
syntax = "proto3";
package Models;
message ProdModel {
int32 Id = 1;
string Name = 2;
}
message ProdRequest {
int32 Size = 1;
}
message ProdListResponse{
repeated ProdModel data = 1;
}
2.2 运行protoc命令生成go文件
在models/protos
文件夹下运行以下命令
protoc --micro_out=../ --go_out=../ prods.proto
2.3 然后把原来的map修改成具体的类型就可以了
package main
import (
"context"
"fmt"
"gomicro-quickstart/goplugin_http_proto_invoker/models"
"log"
"github.com/micro/go-micro/client"
"github.com/micro/go-micro/client/selector"
"github.com/micro/go-micro/registry"
"github.com/micro/go-plugins/client/http"
"github.com/micro/go-plugins/registry/consul"
)
func main() {
// 1. 注册consul地址
cr := consul.NewRegistry(registry.Addrs("47.100.220.174:8500"))
// 2. 实例化selector
mySelector := selector.NewSelector(
selector.Registry(cr), // 传入上面的consul
selector.SetStrategy(selector.RoundRobin), // 指定获取实例的算法
)
// 3. 请求服务
resp, err := callByGoPlugin(mySelector)
if err != nil {
log.Fatal("request API failed", err)
}
fmt.Printf("[服务调用结果]:\r\n %v", resp)
}
func callByGoPlugin(s selector.Selector) ([]*models.ProdModel, error) {
// 1. 调用`go-plugins/client/http`包的函数获取它们提供的httpClient
gopluginClient := http.NewClient(
client.Selector(s), // 传入上面的selector
client.ContentType("application/json"), // 指定contentType
)
// 2. 新建请求对象,传入: (1)服务名 (2)endpoint (3)请求参数
req := gopluginClient.NewRequest("ProductService", "/v1/list",
models.ProdRequest{Size: 2})
// 3. 新建响应对象,并call请求,获取响应
var resp models.ProdListResponse
err := gopluginClient.Call(context.Background(), req, &resp)
if err != nil {
return nil, err
}
return resp.GetData(), nil
}
3. 处理json tag不一致的问题
如果服务端的model设置了json tag,如下
只有将客户端的proto文件生成的pb.go
文件中的model的tag修改成一样的才可以
这里可以使用插件修改
第一步:下载插件
go get -u github.com/favadi/protoc-go-inject-tag
第二步,在proto文件上加注释
syntax = "proto3";
package models;
message ProdModel {
// @inject_tag: json:"pid"
int32 Id = 1;
// @inject_tag: json:"pname"
string Name = 2;
}
message ProdRequest {
int32 Size = 1;
}
message ProdListResponse{
repeated ProdModel data = 1;
}
第三步:使用命令行批量修改
protoc-go-inject-tag -input=../prods.pb.go
原文:https://www.cnblogs.com/baoshu/p/13574829.html
内容总结
以上是互联网集市为您收集整理的go微服务系列(四) - http api中引入protobuf全部内容,希望文章能够帮你解决go微服务系列(四) - http api中引入protobuf所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。