上一篇文章我们只定义了一个模型,同时还定义了一个入参和出参的模型。
这一篇文章我们来继续定义接口同时让他跑起来。
定义一个服务
编写 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" 这段代码表示我们要调用的服务和方法。
运行效果图:
到这里我们的服务已经启动起来了,也能调用了,但是还没接入证书。
下一篇我们写:怎么接入证书单向验证,敬请期待!