前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何快速启动GRPC服务?(详解Proto编译服务与GRPC启动服务)

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

作者头像
小锟哥哥
发布2022-05-10 08:24:20
1.4K0
发布2022-05-10 08:24:20
举报
文章被收录于专栏:GoLang全栈

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

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

定义一个服务

编写 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" 这段代码表示我们要调用的服务和方法。

运行效果图:

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义一个服务
    • 编写 proto 文件
      • 编译
      • 实现一个服务
      • 启动一个服务
      • 创建客户端
        • 注意的地方:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档