使用grpc需要的知识:
rpc,protobuf
首先了解grpc的大致结构:
分为服务端和客户端,使用时,先启动服务端,再启动客户端。
首先生成接口:
- 创建proto文件
比如传递一个name值作为参数。
syntax = "proto3";//声明proto的版本
package example;//生成go文件的包名
service Hello_World {//服务接口
rpc Say_Hello (Request) returns (Response);//接口名称
}
message Request {//传参值
string Name=1;
}
message Response {//返回参数的值
string Msg=1;
}
由于源proto不能生成go文件,需要下载支持的包grpc
protoc --go_out=plugins=grpc:生成文件所在目录 文件名
生成的go文件,你可以看到有个接口
type Hello_WorldClient interface {
Say_Hello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error)
}//第二个参数为访问此接口所携带的参数的地址,返回值是一个返回的数据的地址
所以我们创建一个server.go文件,作为服务端,实现这个接口。再创建一个client.go文件访问这个接口的客户端
首先server.go
package main
import (
"context"
"net"
"net/http"
example "testproto/src"//将protobuf生成的文件导入
"google.golang.org/grpc"
)
type Say_Hello struct {
example.Hello_WorldServer//注意,如果你只生成一个接口,则在结构体中可以不继承生成的结构体,如果你声明了多个接口,则则需要进行继承protobuf生成的结构体
}
func (this *Say_Hello) Say_Hello(ctx context.Context, in *example.Request) (*example.Response, error) {
response := new(example.Response)
response.Msg = "this is test return .see this is prove you success"
return response, nil
}
func main() {
//监听端口
lis, _ := net.Listen("tcp", ":8006")
s := grpc.NewServer()//创建grpc服务
example.RegisterHello_WorldServer(s, &Say_Hello{})//注册服务
s.Serve(lis)
}
客户端main函数解释:
- 占用一个端口
- 创建一个grpc的服务
- 注册服务,注意此时注册服务传的是结构体,如果此结构体有多个接口,需要继承接口
- 在占用的端口服务
client.go
package main
import (
"context"
"google.golang.org/grpc"
"log"
example "testproto/src"//将protobuf生成的文件导入
)
func main(){
conn,err := grpc.Dial("localhost:8006",grpc.WithInsecure(),grpc.WithBlock())//链接此端口,这个端口,需要和服务的端口一致
if err != nil {
panic(err.Error())
}
defer conn.Close()//结束时,关闭与端口的链接
client:=example.NewHello_WorldClient(conn)//生成一个接口的客户端
responed,_:=client.Say_Hello(context.Background(),&example.Request{Name: "test"})//使用此端口。
log.Println(responed)//将返回的值进行输出
}
此时一个服务就搭建完毕。
先运行server,go
go run server.go
再运行client.go,运行成功。
此时就是可以进行微服务的开发,比较之前的开发,需要以二进制的数据进行传输,此时,我们可以通过protobuf进行传输