Code前端首页关于Code前端联系我们

如何使用Go-Micro和Gin进行Golang语言开发微服务?

terry 2年前 (2023-09-24) 阅读数 57 #后端开发

01

简介

Go Micro 是一个分布式系统开发框架。 Go Micro提供了分布式系统开发的核心需求,包括RPC和事件驱动的通信。Gin是一个用 Golang 编写的 Web 框架。本文首先介绍如何使用go-Micro和go-grpc构建微服务,然后介绍Gin和Go-Micro的集成。我们使用的go-micro版本是v1.18.0,golang版本是v1.13,gin版本是v1.7.2。

02

使用go-micro和go-grpc构建微服务

在开始使用go-micro之前,我们需要提前做一些准备工作。安装 protoc、protoc-gen-go 和 protoc-gen-micro。至于如何安装,读者朋友可以参考官方文档。我们在之前的文章中也介绍过。由于篇幅限制,本文不再赘述。

其实我们可以使用Go Micro工具集以命令的形式快速生成模板文件,但由于本文不介绍工具集的相关内容,所以我们采用手动创建文件的方法。

现在正式介绍如何构建服务,包括服务器端服务和客户端服务。

服务器端

服务器端代码目录:

├── go.mod
├── go.sum
├── handler
│   └── user
│       └── user.go
├── main.go
└── proto
    └── user
        ├── user.pb.go
        ├── user.pb.micro.go
        └── user.proto

构建服务器端服务分为以下步骤:

  1. 编写protobuf文件
    ├── go.mod
    ├── go.sum
    ├── handler
    │   └── user
    │       └── user.go
    ├── main.go
    └── proto
        └── user
            ├── user.pb.go
            ├── user.pb.micro.go
            └── user.proto
    

    第一步是组合文件,protouf包Protobuf文件存储在单独的文件目录中。 文件路径:proto/user/user.proto

    syntax = "proto3";
    
    package user;
    
    service User {
      rpc Login(LoginRequest) returns (LoginResponse) {}
    }
    
    message LoginRequest {
      string email = 1;
      string password = 2;
    }
    
    message LoginResponse {
      string username = 1;
    }
    

    阅读上面的代码,我们在定义的user.proto文件中创建了一个rpc服务。

  2. 生成文件

    第二步是生成文件。使用命令:

    protoc --proto_path=. --micro_out=. --go_out=. user.proto
    

    执行上述命令会自动生成两个文件,分别是user.pb.go user.micro.go

    阅读user.micro.go文件,可以看到该文件中自动生成了客户端和服务端代码。

  3. 编写Handler

    第三步是编写服务器端Handler代码。

    文件路径:handler/user/user.go

    type User struct{}
    
    func (u *User) Login(ctx context.Context, req *protoUser.LoginRequest, rsp *protoUser.LoginResponse) error {
      if req.Email != "gopher@88.com" || req.Password != "123456" {
        rsp.Username = "Sorry " + req.Email
        return nil
      }
      rsp.Username = "Welcome " + req.Email
      return nil
    }
    
  4. 定义服务器服务

    第四步,定义服务器服务。需要注意的是,这里使用的是grpc。在main.go文件中写入以下代码:

    文件路径:main.go

    func main() {
      // 创建服务
      service := grpc.NewService(
        micro.Name("go.micro.srv.demo"),
        micro.Version("v0.0.0"),
        micro.RegisterTTL(time.Second * 10),
        micro.RegisterInterval(time.Second * 5),
      )
      // 注册处理器
      err := protoUser.RegisterUserHandler(service.Server(), new(user.User))
      if err !=nil {
        log.Fatal(err)
      }
      // 运行服务
      if err = service.Run(); err != nil {
        log.Fatal(err)
      }
    }
    

完成以上4步后,我们就实现了服务器cp页面。接下来我们开始编写客户端代码。 ?生成文件的目的是保证服务器和客户端之间的类型一致性。

  • 定义客户端服务

    第二步定义客户端:

    文件路径:router/v1/user.go

    func NewUserClient() protoUser.UserService {
      // 创建服务
      service := grpc.NewService()
    
      // 创建客户端
      userClient := protoUser.NewUserService("go.micro.srv.demo", service.Client())
    
      return userClient
    }
    
  • rpc 调用远程服务的方法第三步是Method rpc调用远程服务的:

    文件路径:router/v1/user.go

    client := NewUserClient()
    
    // rpc 调用远程服务的方法
    resp, err := client.Login(context.TODO(), &protoUser.LoginRequest{Email: param.Email, Password: param.Password})
    if err != nil {
      fmt.Println(err)
    }
    
  • 完成上面3步之后,我们基本上就写完了客户端代码。

    03

    Gin 和 Go-Micro 的集成

    接下来我们介绍如何集成 Gin 和 Go-Micro。这部分代码也在客户端,一共需要两步。 ?而go-micro,启动服务端服务和客户端服务后,我们可以使用如下命令来运行cURL测试:

    curl --location --request POST 'http://127.0.0.1:8080/v1/user/login' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "email": "gopher@88.com",
        "password": "123456"
    }'
    

    04

    总结

    本文主要介绍如何使用go-micro和go-grpc来进行cURL测试构建微服务,以及如何集成Gin和Go-Micro并没有介绍Gin和Go-Micro的使用。如果读者的朋友不了解Gin和Go-Micro,建议先阅读Gin和Go-Micro的官方文档。您也可以参考公众号之前发表的有关杜松子酒的文章。

    参考资料:
    https://github.com/asim/go-micro
    https://gin-gonic.com/zh-cn/docs/introduction/

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门