go-micro使用Grpc
go-micro使用Grpc
目录
- go-micro使用Grpc
- 服务端
- 客户端
- 使用wapper装饰器 (添加日志等)
服务端
服务端目录
Services/protos/Models.proto
syntax = "proto3";
package Services;
option go_package = "./;Services";// 商品模型
message ProdModel{int32 ProdID = 1;string ProdName = 2;
}
Services/protos/ProdService.proto
syntax = "proto3";
package Services;
option go_package = "./;Services";
import "Models.proto";message ProdsRequest {int32 Size = 1;
}message ProdListResponse{repeated ProdModel data = 1;
}service ProdService {rpc GetProdsList(ProdsRequest) returns (ProdListResponse);
}
启动gen.bat脚本
cd Services/protos
protoc --micro_out=../ --go_out=../ Models.proto
protoc --micro_out=../ --go_out=../ ProdService.proto
protoc-go-inject-tag -input=../Models.pb.go
protoc-go-inject-tag -input=../ProdService.pb.go
cd .. && cd ..
ServiceImpl/ProdService.go 模拟数据
package ServiceImplimport ("context""fmt""go_micro_grpc/Services""strconv"
)func NewProd(id int32, pname string) *Services.ProdModel {return &Services.ProdModel{ProdID: id,ProdName: pname,}
}type ProdService struct {}func (p *ProdService) GetProdsList(ctx context.Context, req *Services.ProdsRequest, resp *Services.ProdListResponse) error {ret := make([]*Services.ProdModel, 0)var i int32for i = 0; i < req.Size; i++ {ret = append(ret, NewProd(100+i, "prodname"+strconv.Itoa(100+int(i))))}resp.Data = retfmt.Println(ret)return nil
}
main.go
package mainimport ("github.com/asim/go-micro/plugins/registry/consul/v4""go-micro.dev/v4""go-micro.dev/v4/registry""go_micro_grpc/ServiceImpl""go_micro_grpc/Services"
)func main() {consulReg := consul.NewRegistry(registry.Addrs("118.178.242.230:8500"),)prodService := micro.NewService(micro.Name("prodservice"),micro.Address(":8011"),micro.Registry(consulReg),)prodService.Init()Services.RegisterProdServiceHandler(prodService.Server(), new(ServiceImpl.ProdService))prodService.Run()}
客户端
客户端目录
Services/protos/Models.proto
syntax = "proto3";
package Services;
option go_package = "./;Services";// 商品模型
message ProdModel{int32 ProdID = 1;string ProdName = 2;
}
Services/protos/ProdService.proto
syntax = "proto3";
package Services;
option go_package = "./;Services";
import "Models.proto";message ProdsRequest {int32 Size = 1;
}message ProdListResponse{repeated ProdModel data = 1;
}service ProdService {rpc GetProdsList(ProdsRequest) returns (ProdListResponse);
}
启动gen.bat脚本
cd Services/protos
protoc --micro_out=../ --go_out=../ Models.proto
protoc --micro_out=../ --go_out=../ ProdService.proto
protoc-go-inject-tag -input=../Models.pb.go
protoc-go-inject-tag -input=../ProdService.pb.go
cd .. && cd ..
main.go
package mainimport ("github.com/asim/go-micro/plugins/registry/consul/v4""go-micro.dev/v4""go-micro.dev/v4/registry""go-micro.dev/v4/web""go_micro1/Services""go_micro1/Weblib"
)func main() {consulReg := consul.NewRegistry(registry.Addrs("118.178.242.230:8500"),)myService := micro.NewService(micro.Name("prodservice.client"),)prodService := Services.NewProdService("prodservice", myService.Client())httpServer := web.NewService(web.Name("httpprodservice"),web.Address(":8001"),web.Handler(Weblib.NewGinRouter(prodService)),web.Registry(consulReg),)httpServer.Init()httpServer.Run()
}
Weblib/router.go
package Weblibimport ("github.com/gin-gonic/gin""go_micro1/Services"
)func NewGinRouter(prodService Services.ProdService) *gin.Engine {ginRouter := gin.Default()ginRouter.Use(InitMiddleware(prodService))v1Group := ginRouter.Group("/v1"){v1Group.Handle("POST", "/prods", GetProdsList)}return ginRouter
}
Weblib.handlers.go
package Weblibimport ("context""fmt""github.com/gin-gonic/gin""go_micro1/Services"
)func GetProdsList(ginCtx *gin.Context) {prodService := ginCtx.Keys["prodservice"].(Services.ProdService)var prodReq Services.ProdsRequesterr := ginCtx.Bind(&prodReq)if err != nil {ginCtx.JSON(500, gin.H{"status": err.Error()})} else {prodResp, err := prodService.GetProdsList(context.Background(), &prodReq)if err != nil {fmt.Println(err)}ginCtx.JSON(200, gin.H{"data": prodResp.GetData()})}
}
Weblib.middlewares.go
package Weblibimport ("github.com/gin-gonic/gin""go_micro1/Services"
)func InitMiddleware(prodService Services.ProdService) gin.HandlerFunc {return func(context *gin.Context) {context.Keys = make(map[string]interface{})context.Keys["prodservice"] = prodServicecontext.Next()}
}
注 : 使用中间件传递prodService.
使用wapper装饰器 (添加日志等)
package mainimport ("context""fmt""github.com/asim/go-micro/plugins/registry/consul/v4""go-micro.dev/v4""go-micro.dev/v4/client""go-micro.dev/v4/registry""go-micro.dev/v4/web""go_micro1/Services""go_micro1/Weblib"
)type logWrapper struct {client.Client
}func (this *logWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {fmt.Println("调用接口")return this.Client.Call(ctx, req, rsp)
}
func NewLogWrapper(c client.Client) client.Client {return &logWrapper{c}
}func main() {consulReg := consul.NewRegistry(registry.Addrs("118.178.242.230:8500"),)myService := micro.NewService(micro.Name("prodservice.client"),micro.WrapClient(NewLogWrapper),)prodService := Services.NewProdService("prodservice", myService.Client())httpServer := web.NewService(web.Name("httpprodservice"),web.Address(":8001"),web.Handler(Weblib.NewGinRouter(prodService)),web.Registry(consulReg),)httpServer.Init()httpServer.Run()
}
go-micro使用Grpc相关推荐
- micro 使用grpc协议
gRPC grpc 是谷歌开源的rpc框架,基于http2实现,并支持跨语言. 高性能,跨语言.go-micro和grpc无缝集成. go-micro里默认使用的通讯协议是MUCP https://g ...
- 微服务系列笔记之Mico Api详解
导语 上一篇文章中有了入门案例,现在是不是有了很好的理解,不过有个前提是你需要了解grpc技术,简单的来说grpc是一个通信框架,micro是类似的一个通信框架,只不过这个框架应用于微服务中.因此如果 ...
- go-micro教程
1.micro介绍 {1.micro简介 Micro由开源的库与工具组成,旨在辅助微服务开发. go-micro - 基于Go语言的可插拔RPC微服务开发框架:包含服务发现.RPC客户/服务端.广播/ ...
- 微服务系列笔记之Go-Micro入门案例
导语 了解了Micro的基本框架之后,我们做一个简单的例子来实现客户端与服务端的通信,在了解本篇文章之前,需要你对rpc.grpc通信技术有所了解. 准备工作 ## 安装go-micro go get ...
- 基于go-micro微服务的实战-实现网关Gateway(三)
基于go-micro微服务的实战-实现网关Gateway(三) 文章最后附带完整代码 基于go-micro实现网关层 创建好网关层目录 common: 公告模块,配置初始化等 conf: 配置文件 h ...
- 牌类游戏使用微服务重构笔记(四): micro框架使用经验
项目依赖 推荐使用go module, 我选择go module的最主要原因是足够简单,可以脱离gopath,就跟写nodejs一样,随便在一个地方新建一个文件夹就可以撸代码了,clone下来的源码也 ...
- Golang 编程 — Go Micro 微服务框架
目录 文章目录 目录 Go Micro Go Micro Go Micro 是一个可插拔的 RPC 框架,提供了以下功能: 服务发现:程序自动注册到服务发现系统. 负载均衡:它提供了客户端负载均衡. ...
- go micro 学习笔记 2:环境搭建(可运行示例)
1.创建镜像: docker run -it -v /opt:/wz -p 8080:8080 -p 8081:8081 -p 8082:8082 --name gomicro centos:late ...
- Go Micro 初探
文章目录 起步 初探 Micro 感谢 起步 在使用 go-micro 之前,我们需要做一些环境准备. $ go get github.com/micro/protoc-gen-micro/v2$ g ...
- MICRO和GO-MICRO
createdtime 20211124 updatedtime 20211126 author venki.chen 一.是什么 1. 定义,是做什么用的? go micro是什么? go-micr ...
最新文章
- 我的Linux成长路---001 Linux学习初期计划
- wordpress外部调用到html_Spring 自调用事务失效,你是怎么解决的?
- FFMPEG libx264解码为YUV
- SQL中CONVERT转化函数的用法[个人推荐]
- CodeForces: 360(div1)361(div2)
- VS2010常用快捷键自定义
- Spring MVC使用指示符重定向
- RDLC报表下载的权限问题
- 使用通用mapper实现条件查询_【微服务】152:Stream流和通用mapper批量查询的使用...
- bat语句中“1>2”是什么意思?
- 多线程和线程池的基本知识总结
- 模型房推荐_【自带水乐园】“巴洛克堡城”酒店,人均200+入住家庭房,乐享下午茶+自行车+游船+萌宠乐园!...
- 苹果充电线android头断了,苹果充电线又坏了?其实一招就能搞定!还不花1分钱......
- HDU 5976 2016ICPC大连 F: Detachment(找规律)
- proc wifi 开启_centos7环境开启WIFI热点
- vue非父子组件间传参问题
- 我的世界检测不到java_《我的世界》检测不到java怎么办?
- 应急响应.windows
- ETL工具kettle实现数据同步
- WINDOWS symbols