如何快速启动GRPC服务?(详解Proto编译服务与GRPC启动服务)

2022-05-10 08:24:20 浏览数 (1)

上一篇文章我们只定义了一个模型,同时还定义了一个入参和出参的模型。

这一篇文章我们来继续定义接口同时让他跑起来。

定义一个服务

编写 proto 文件

在 /protps 目录下面创建一个新的文件,名为 service.proto,内容如下:

代码语言:javascript复制
syntax="proto3";
option go_package = "k_grpc/pbFiles";

import "models.proto"; //导入所需模型

service StudentService {
  rpc GetStudent (GetStudentRequest) returns (GetStudentResponse);
}

里面的内容我觉得不太需要做详细介绍吧,这个和 Go 的语法非常相似。

有不懂的请留言,为你解答。

编译

我们现在需要编译 grpc 服务,因此还需要一个依赖包,否者不能编译。

依赖包的安装方式也很简单,直接执行命令就好,命令如下:

代码语言:javascript复制
go get -u google.golang.org/grpc/cmd/protoc-gen-go-grpc

这个依赖包安装完后,你的 GOPATH 里面的 bin 目录会多出一个 protoc-gen-go-grpc 文件,如下图:

当依赖包安装好后,就可以编译了。

这次的编译命令和上一篇编译 model 不太一样,命令如下:

代码语言:javascript复制
protoc --proto_path=protos --go-grpc_out=./../ service.proto

变化的地方:

这里不再使用 --go_out 而是使用的 --go-grpc_out,因为我们需要编译的是 grpc 服务。

编译完之后你的 /pbFiles 目录下面又会多一个名为 service_grpc.pb.go 的文件。

此时他会爆缺失 grpc 包,我们安装下依赖包就好了,命令如下:

代码语言:javascript复制
go get google.golang.org/grpc

实现一个服务

到目前为止,我们定义好了请求模型和服务接口,但是要让服务跑起来,还需要去实现相应的服务。

毕竟目前为止只是定义了服务,我们一行代码都没写,就像我们编写了接口文档但是没写代码一样的道理。

现在需要在工程下面新建一个名为 services 的文件夹,并新建一个名为 StudentService.go 的文件,写入内容如下:

代码语言:javascript复制
package services

import (
 "context"
 "k_grpc/pbFiles"
)

type StudentService struct {
 // 引入谷歌帮我们实现了部分功能的结构体
 pbFiles.UnimplementedStudentServiceServer
}

// 去实现我们定义的接口
func (this *StudentService) GetStudent(_ context.Context, req *pbFiles.GetStudentRequest) (*pbFiles.GetStudentResponse, error) {
 // 在这里实现业务逻辑
 rsp := &pbFiles.GetStudentResponse{
  Result: &pbFiles.Student{
   Id: req.SId,
   Name: "【GoLang全栈】编写",
  },
 }
 return rsp,nil
}

func NewStudentService() *StudentService {
 return &StudentService{}
}

启动一个服务

当我们的模型和服务都定义好之后,我们就可以启服务了。

我们先启服务端,在项目的根目录下面新建一个名为 server.go 的文件,代码如下:

代码语言:javascript复制
package main

import (
 "google.golang.org/grpc"
 "k_grpc/pbFiles"
 "k_grpc/services"
 "log"
 "net"
)

func main() {
 // 创建一个GRPC服务
 srv := grpc.NewServer()
 // 注册需要挂载的服务
 pbFiles.RegisterStudentServiceServer(srv, services.NewStudentService())
 // 启一个监听服务
 lis,_ := net.Listen("tcp",":8080")
 // 启动 GRPC 服务
 if err := srv.Serve(lis);err != nil{
  log.Fatalln(err)
 }
}

这部分代码应该不需要做过多讲解,没啥特别难理解地方。

现在我们来启动下,直接执行:

代码语言:javascript复制
$ go run server.go

啥也不输出,并挂在那里,就说明启动成功。

创建客户端

代码如下:

代码语言:javascript复制
package main

import (
 "context"
 "fmt"
 "google.golang.org/grpc"
 "k_grpc/pbFiles"
 "log"
)

func main() {

 // 创建连接端
 target := "localhost:8080"
 client,err := grpc.DialContext(
  context.Background(),
  target,
  grpc.WithInsecure(),
 )
 if err != nil {
  log.Fatalln(err)
 }

 // 定义请求体
 req := &pbFiles.GetStudentRequest{
  SId: 3333,
 }
 // 定义返回体
 rsv := &pbFiles.GetStudentResponse{}

 // 正式请求
 _ = client.Invoke(
  context.Background(),
  "/StudentService/GetStudent",
  req,
  rsv)

 // 打印输出
 fmt.Println(rsv.Result)
}

注意的地方:

1、目前我们还没引入证书验证机制。

所以你可以看到在创建连接终端时我用的:grpc.WithInsecure(),在生产时肯定不行的,一定得引入证书验证机制才行。

2、在正式请求时,我们采用的是最原始的方式。

当然 GRPC 也提供了封装的方式调用,但是对于新手还是先理解这这个流程再升级比较好。

所以 "/StudentService/GetStudent" 这段代码表示我们要调用的服务和方法。

运行效果图:

到这里我们的服务已经启动起来了,也能调用了,但是还没接入证书。

下一篇我们写:怎么接入证书单向验证,敬请期待!

0 人点赞