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 Unimplemented
Server 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?的主要内容,如果未能解决你的问题,请参考以下文章