当前位置: 首页 > 工具软件 > grpc-go > 使用案例 >

grpc使用(Golang)

唐经国
2023-12-01

使用grpc需要的知识:
rpc,protobuf
首先了解grpc的大致结构:
分为服务端和客户端,使用时,先启动服务端,再启动客户端。
首先生成接口:

  1. 创建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函数解释:

  1. 占用一个端口
  2. 创建一个grpc的服务
  3. 注册服务,注意此时注册服务传的是结构体,如果此结构体有多个接口,需要继承接口
  4. 在占用的端口服务

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进行传输

 类似资料: