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

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

介绍

我们在上一篇文章「Go 语言基于 Go kit 开发 Web 项目」中,介绍了怎么使用 Go kit 开发 Web 项目,在这篇文章中,我们传输层使用的是 HTTP,本文我们介绍 Go kit 怎么集成 gRPC,也就是说我们在传输层使用 rpc。

在阅读完前面几篇文章后,我们已经了解 Go kit 分为三层,分别是 Transport、Endpoint 和 Service,其中 Transport 负责网络传输,Endpoint 负责接收请求和返回响应,Service 层负责定义业务接口,并实现接口方法。

Go kit 集成 gRPC,主要在 Transport 层实现。

实现原理

Go kit 集成 gRPC,即将 gRPC 集成到 Go kit 的 Transport 层。Transport 层将接收到的网络请求转换为 Endpoint 层可以处理的对象,主要需要实现两个功能,解码和编码。

其中,解码负责把网络请求转换为 Endpoint 可以处理的请求对象;编码负责将 Endpoint 处理结果转换为响应对象,返回给客户端。

Go kit 集成 gRPC 的示例项目

在了解完实现原理之后,我们通过示例项目介绍 Go kit 怎么集成 gRPC,关于定义 proto 文件,和使用 protoc 生成 pb 文件,我们在之前的文章中已经介绍过,限于篇幅,本文不再赘述。

使用 Go kit 集成 gRPC,实际上就是在 Transport 层使用 gRPC 传输,除此之外,它和我们上一节讲的使用 Go kit 开发 Web 项目的流程是一样的,共分为五个步骤实现该示例项目,分别是定义 proto 并生成 pb 文件、创建 service 层、创建 endpoint 层、创建 transport 层和定义主函数。

定义 proto

...
option go_package = "./user";
service UserService {
  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 进行网络传输。

推荐阅读:

参考资料:

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


目录
相关文章
|
11天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
103 53
|
2月前
|
Go API Docker
热门go与微服务15
热门go与微服务15
32 2
|
8天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
9天前
|
Go 数据处理 API
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。
|
28天前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
29天前
|
运维 Go 开发者
Go语言在微服务架构中的应用与优势
本文深入探讨了Go语言在构建微服务架构中的独特优势和实际应用。通过分析Go语言的核心特性,如简洁的语法、高效的并发处理能力以及强大的标准库支持,我们揭示了为何Go成为开发高性能微服务的首选语言。文章还详细介绍了Go语言在微服务架构中的几个关键应用场景,包括服务间通信、容器化部署和自动化运维等,旨在为读者提供实用的技术指导和启发。
|
1月前
|
负载均衡 Go API
探索Go语言在微服务架构中的应用与优势
在这篇技术性文章中,我们将深入探讨Go语言(又称为Golang)在构建微服务架构时的独特优势。文章将通过对比分析Go语言与其他主流编程语言,展示Go在并发处理、性能优化、以及开发效率上的优势。同时,我们将通过一个实际的微服务案例,详细说明如何利用Go语言构建高效、可扩展的微服务系统。
|
1月前
|
安全 Go 云计算
探索Go语言在微服务架构中的应用与优势
在本文中,我们将深入探讨Go语言(又称为Golang)在构建微服务架构中的独特优势。文章将分析Go语言的并发模型、简洁的语法以及高效的编译速度,以及这些特性如何使其成为微服务架构的理想选择。我们将通过一个简单的微服务示例,展示Go语言在实际开发中的表现,并讨论其在性能和可维护性方面的优势。
|
2月前
|
Kubernetes Go 持续交付
一个基于Go程序的持续集成/持续部署(CI/CD)
本教程通过一个简单的Go程序示例,展示了如何使用GitHub Actions实现从代码提交到Kubernetes部署的CI/CD流程。首先创建并版本控制Go项目,接着编写Dockerfile构建镜像,再配置CI/CD流程自动化构建、推送Docker镜像及部署应用。此流程基于GitHub仓库,适用于快速迭代开发。
51 3
|
2月前
|
Kubernetes 持续交付 Go
创建一个基于Go程序的持续集成/持续部署(CI/CD)流水线
创建一个基于Go程序的持续集成/持续部署(CI/CD)流水线