Go 微服务工具包 Go kit 怎么集成 gRPC?

Posted Golang语言开发栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 微服务工具包 Go kit 怎么集成 gRPC?相关的知识,希望对你有一定的参考价值。

大家好,我是 frank。
欢迎大家点击标题下方 rpc Register(RegisterReq) returns (RegisterRes)

...

生成 pb 文件

protoc -I proto \\
> --go_out ./pb/user --go_opt paths=source_relative \\
> --go-grpc_out=require_unimplemented_servers=false:./pb/user --go-grpc_opt paths=source_relative \\
> proto/user.proto

阅读上面这段代码,我们定义一个 proto 文件,并使用 protoc 工具生成 pb 文件,需要注意的是我们将 require_unimplemented_servers 设置为 false

原因如下:

By default, to register services using the methods generated by this tool, the service implementations must embed the corresponding UnimplementedServer for future compatibility. This is a behavior change from the grpc code generator previously included with protoc-gen-go. To restore this behavior, set the option require_unimplemented_servers=false.

Service - 定义接口

type IUser interface 
 Register(ctx context.Context, username, email, password string) error


type User struct

func (u User) Register(ctx context.Context, username, email, password string) error 
 if username != "" && email != "" && password != "" 
  return nil
 
 return errors.New("register param is invalid")

阅读上面这段代码,我们在 Service 层创建 IUser 接口,接口包含一个方法 Register,需要注意的是,Register 方法会通过调用 grpc.Handler 的 ServeGRPC 方法,将请求参数传递给 Go kit 处理。

Endpoint - 接收请求和返回响应

func MakeUserEndpoint(user IUser) endpoint.Endpoint 
 return func(ctx context.Context, request interface) (response interface, err error) 
  req := request.(RegisterReq)
  err = user.Register(ctx, req.Username, req.Email, req.Password)
  if err != nil 
   log.Printf("err:%s", err)
  
  return RegisterRes
   Username: req.Username,
   Email:    req.Email,
  , nil
 

阅读上面这段代码,在 Endpoint 层,我们给业务接口 IUser 构建 endpoint.Endpoint,用于调用 Service 层的接口的方法处理请求。

Transport - 传输层

type grpcHandler struct 
 register grpc.Handler


func (g *grpcHandler) Register(ctx context.Context, req *pb.RegisterReq) (*pb.RegisterRes, error) 
 _, res, err := g.register.ServeGRPC(ctx, req)
 if err != nil 
  return nil, err
 
 return res.(*pb.RegisterRes), nil


func NewUserServer(ctx context.Context, endpoints Endpoints) pb.UserServiceServer 
 return &grpcHandler
  register: grpc.NewServer(
   endpoints.UserEndpoint,
   DecodeRegister,
   EncodeRegister,
  ),
 
  

阅读上面这段代码,我们在 Transport 层实现 pb 文件中的 UserServiceServer 方法,需要注意的是,我们在 NewUserService 函数中,传入 Endpoint。

完整代码,请参阅 Github。

04 

总结

本文我们通过示例项目介绍 Go kit 怎么集成 gRPC,通过集成 gRPC,Transport 层实现通过 rpc 进行网络传输。

推荐阅读:

Golang 语言 vendor 在 GOPATH 和 Modules 中的区别

Golang 语言的多种变量声明方式和使用场景

Golang 语言微服务的服务发现组件 Consul 的系统架构介绍

Golang 语言中基础同步原语 Mutex 和 RWMutex 的区别

Go 语言学习之测试

参考资料:
https://github.com/grpc/grpc-go/blob/master/cmd/protoc-gen-go-grpc/README.md 

扫描二维码或回复「微信群」,加入微信群


点「赞」和「在看」是最大的支持

Go kit 概览

该篇为翻译文:原文地址 https://github.com/go-kit/kit

Go kit 是一个语言工具包,用于在GO 语言中构建微服务。我们可以解决分布式系统和应用程序架构中的常见问题,因此你可以专注于业务开发。

使用理由:

Go 是一种服务器语言,但是他在Facebook,Twitter等公司中,使用的比率不是特别大。许多这些组织已经转向基于JVM的堆栈用于其业务逻辑,这在很大程度上归功于直接支持其微服务架构的库和生态系统。

为了达到更高的成功水平,Go需要的不仅仅是简单的基本语法。他需要一个全面的工具包,用于大规模分布式系统。Go kit是一套包和最佳实践,为任何规模的组织提供了一种全面,强大且可信赖的构建微服务的方法。

目标:

  • Operate in a heterogeneous SOA — expect to interact with mostly non-Go-kit services
  • RPC作为主要的消息传递模式
  • 使用序列化传输-而不仅仅是使用HTTP JSON语言 
  • Operate within existing infrastructures — no mandates for specific tools or technologies

依赖项

Go kit 是一个库,是有很多重要的包构成。包管理工具,都会验证包的健壮性。因此我们应该使用包管理工具来管理安装依赖,包括Go kit。为了避免兼容性和可用性问题,Go kit不提供自己的依赖项,也不建议使用第三方导入代理。

我提供一个包管理工具清单,包括dep,gb,glide,gvt,govendor。此外,Go kit使用各种持续集成提供程序来发现和修复兼容性问题。

Service frameworks

  • gizmo, a microservice toolkit from The New York Times ★
  • go-micro, a microservices client/server library ★
  • gotalk, async peer communication protocol & library
  • Kite, a micro-service framework
  • gocircuit, dynamic cloud orchestration

 

以上是关于Go 微服务工具包 Go kit 怎么集成 gRPC?的主要内容,如果未能解决你的问题,请参考以下文章

手把手带你使用 go-kit

go-kit微服务:日志功能

go微服务实战,docker

2.go-kit教程go-kit启动http服务

Nacos Go微服务生态系列 | Dubbo-go 云原生核心引擎探索

微服务框架 Go-Micro 集成 Nacos 实战之服务注册与发现