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相关推荐

  1. micro 使用grpc协议

    gRPC grpc 是谷歌开源的rpc框架,基于http2实现,并支持跨语言. 高性能,跨语言.go-micro和grpc无缝集成. go-micro里默认使用的通讯协议是MUCP https://g ...

  2. 微服务系列笔记之Mico Api详解

    导语 上一篇文章中有了入门案例,现在是不是有了很好的理解,不过有个前提是你需要了解grpc技术,简单的来说grpc是一个通信框架,micro是类似的一个通信框架,只不过这个框架应用于微服务中.因此如果 ...

  3. go-micro教程

    1.micro介绍 {1.micro简介 Micro由开源的库与工具组成,旨在辅助微服务开发. go-micro - 基于Go语言的可插拔RPC微服务开发框架:包含服务发现.RPC客户/服务端.广播/ ...

  4. 微服务系列笔记之Go-Micro入门案例

    导语 了解了Micro的基本框架之后,我们做一个简单的例子来实现客户端与服务端的通信,在了解本篇文章之前,需要你对rpc.grpc通信技术有所了解. 准备工作 ## 安装go-micro go get ...

  5. 基于go-micro微服务的实战-实现网关Gateway(三)

    基于go-micro微服务的实战-实现网关Gateway(三) 文章最后附带完整代码 基于go-micro实现网关层 创建好网关层目录 common: 公告模块,配置初始化等 conf: 配置文件 h ...

  6. 牌类游戏使用微服务重构笔记(四): micro框架使用经验

    项目依赖 推荐使用go module, 我选择go module的最主要原因是足够简单,可以脱离gopath,就跟写nodejs一样,随便在一个地方新建一个文件夹就可以撸代码了,clone下来的源码也 ...

  7. Golang 编程 — Go Micro 微服务框架

    目录 文章目录 目录 Go Micro Go Micro Go Micro 是一个可插拔的 RPC 框架,提供了以下功能: 服务发现:程序自动注册到服务发现系统. 负载均衡:它提供了客户端负载均衡. ...

  8. go micro 学习笔记 2:环境搭建(可运行示例)

    1.创建镜像: docker run -it -v /opt:/wz -p 8080:8080 -p 8081:8081 -p 8082:8082 --name gomicro centos:late ...

  9. Go Micro 初探

    文章目录 起步 初探 Micro 感谢 起步 在使用 go-micro 之前,我们需要做一些环境准备. $ go get github.com/micro/protoc-gen-micro/v2$ g ...

  10. MICRO和GO-MICRO

    createdtime 20211124 updatedtime 20211126 author venki.chen 一.是什么 1. 定义,是做什么用的? go micro是什么? go-micr ...

最新文章

  1. 我的Linux成长路---001 Linux学习初期计划
  2. wordpress外部调用到html_Spring 自调用事务失效,你是怎么解决的?
  3. FFMPEG libx264解码为YUV
  4. SQL中CONVERT转化函数的用法[个人推荐]
  5. CodeForces: 360(div1)361(div2)
  6. VS2010常用快捷键自定义
  7. Spring MVC使用指示符重定向
  8. RDLC报表下载的权限问题
  9. 使用通用mapper实现条件查询_【微服务】152:Stream流和通用mapper批量查询的使用...
  10. bat语句中“1>2”是什么意思?
  11. 多线程和线程池的基本知识总结
  12. 模型房推荐_【自带水乐园】“巴洛克堡城”酒店,人均200+入住家庭房,乐享下午茶+自行车+游船+萌宠乐园!...
  13. 苹果充电线android头断了,苹果充电线又坏了?其实一招就能搞定!还不花1分钱......
  14. HDU 5976 2016ICPC大连 F: Detachment(找规律)
  15. proc wifi 开启_centos7环境开启WIFI热点
  16. vue非父子组件间传参问题
  17. 我的世界检测不到java_《我的世界》检测不到java怎么办?
  18. 应急响应.windows
  19. ETL工具kettle实现数据同步
  20. WINDOWS symbols

热门文章

  1. 漫画:二分法系列篇(第一讲)
  2. 可变变量和不可变变量
  3. vue-request发起网络数据请求
  4. Maya 保存为ma格式时出错
  5. 基于PCA的TE过程故障诊断(matlab)
  6. 在线配色网,方便实用!
  7. AS608光学指纹模组编程和应用详解
  8. 无向图、深度优先搜索(无向图)、广度优先搜索(无向图)、无向图路径查找(基于深度优先搜索)
  9. Web前端期末大作业-网上订餐系统网站设计模板(HTML+CSS+JS)
  10. 食品的英语名称总结-----实用