1. protobuf相关依赖安装

  • 第一步:下载grpc通用编译器

如下图,解压出来因平台而异会是一个protoc或者protoc.exe

https://github.com/protocolbuffers/protobuf/releases

  • 第二步:把下载的二进制文件路径添加到环境变量中(为了能全局访问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

go微服务系列(四) - http api中引入protobuf的更多相关文章

  1. go微服务系列(四) - gRPC入门

    1. 前言 2. gRPC与Protobuf简介 3. 安装 4. 中间文件演示 4.1 编写中间文件 4.2 运行protoc命令编译成go中间文件 5. 创建gRPC服务端 5.1 新建Produ ...

  2. 【CHRIS RICHARDSON 微服务系列】微服务架构中的进程间通信-3

    编者的话 |本文来自 Nginx 官方博客,是微服务系列文章的第三篇,在第一篇文章中介绍了微服务架构模式,与单体模式进行了比较,并且讨论了使用微服务架构的优缺点.第二篇描述了采用微服务架构的应用客户端 ...

  3. 微服务系列(二):使用 API 网关构建微服务

    编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第二篇,本文将探讨:微服务架构是如何影响客户端到服务端的通信,并提出一种使用 API 网关的方法. 作者介绍:Chris Richardso ...

  4. 【微服务No.4】 API网关组件Ocelot+Consul

    介绍: Ocelot是一个.NET API网关.该项目针对的是使用.NET运行微服务/面向服务架构的人员,他们需要一个统一的入口进入他们的系统.然而,它可以处理任何说HTTP并在ASP.NET Cor ...

  5. 【CHRIS RICHARDSON 微服务系列】事件驱动的数据管理-5

    编者的话 |本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模 ...

  6. Dubbo 微服务系列(03)服务注册

    Dubbo 微服务系列(03)服务注册 [TOC] Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 图1 Dubbo经典架构图 注:本图来源 Dubbo官方架构 ...

  7. 微服务系列(二)GRPC的介绍与安装

    微服务系列(二)GRPC的介绍与安装 1.GPRC简介 GRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架.GRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多 ...

  8. 微服务架构之「 API网关 」

    在微服务架构的系列文章中,前面已经通过文章<架构设计之「服务注册 」>介绍过了服务注册的原理和应用,今天这篇文章我们来聊一聊「 API网关 」. 「 API网关 」是任何微服务架构的重要组 ...

  9. Spring Cloud微服务系列文,服务调用框架Feign

    之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON.    这种 ...

随机推荐

  1. 预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值

    PHP $_GET 变量 在 PHP 中,预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值. $_GET 变量 预定义的 $_GET 变量用于收集来自 ...

  2. 使用Scrapy编写爬虫程序中遇到的问题及解决方案记录

    1.创建与域名不一致的Request时,请求会报错 解决方法:创建时Request时加上参数dont_filter=True 2.当遇到爬取失败(对方反爬检测或网络问题等)时,重试,做法为在解析res ...

  3. SQL优化之博客案例

    问题背景:博客首页随着数据量的增加,最初是几百上千的数据,访问正常,这是开发环境,当切换测试环境(通过爬虫已有数据六万多),这时候访问非常缓慢,长达一分钟. 问题SQL: SELECT DISTINC ...

  4. 【BZOJ4173】数学 题解(数论)

    前言:体验到了推式子的快感orz 题目大意:求$\varphi(n)*\varphi(m)*\sum_{n\ mod\ k+m\ mod\ k\geq k} \varphi(k)\ mod\ 9982 ...

  5. (转)Linux 下栈溢出问题分析解决 *** stack smashing detected *** XXXX terminated

    Linux 下栈溢出问题分析解决 *** stack smashing detected *** XXXX terminated 1.利用gdb 或者valgrind 定位到具体的代码 最近在Linu ...

  6. 003_go语言中的变量

    代码演示: package main import "fmt" func main() { var a = "initial" fmt.Println(a) v ...

  7. Spring Cloud 之服务注册中心高可用

    服务注册中心高可用 服务注册中心 eureka-server 高可用实施 版本 Spring Boot 版本 # Spring Boot 版本: <parent> <groupId& ...

  8. [深度学习] Pytorch学习(二)—— torch.nn 实践:训练分类器(含多GPU训练CPU加载预测的使用方法)

    Learn From: Pytroch 官方Tutorials Pytorch 官方文档 环境:python3.6 CUDA10 pytorch1.3 vscode+jupyter扩展 #%% #%% ...

  9. HTML学习第三天

    超链接: <a href=""></a>             target链接打开方式 1._blank新窗口打开 2._self当前窗口打开     ...

  10. 2020-04-29:现在你有个秒杀抢购的app,用户不断大量增加,技术层面,你要怎么做

    2020-04-29:现在你有个秒杀抢购的app,用户不断大量增加,技术层面,你要怎么做,才能既满足用户需求,又能扛住压力,还能帮公司合理支出?福哥答案2020-04-29: 限流(杀部分用户祭天). ...