观看b站狂神初学grpc:gPRC01:聊聊gRPC_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1S24y1U7Xp?p=1&vd_source=f5ed15a716a0d2394ab18fcc53eac495
4.1
1、初识gRPC
官方文档:https://grpc.io/
中文文档:https://doc.oschina.net/grpc
2、安装Protobuf
2.1下 载Protobuf
安装地址:https://github.com/protocolbuffers/protobuf/releases?page=4
环境变量配置:
输入protoc验证是否安装成功
2.2 安装gRPC核心库
go get google.golang.org/grpc
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
3、Proto文件编写
//这是在说明我们使用的是proto3语法。
syntax ="proto3";
//这部分的内容是关于最后生成的go文件是处在哪个目录哪个包中,.代表在当前目录生成,service代表了生成的go文件的包名是service。
option go_package =".;service";
//然后我们需要定义一个服务,在这个服务中需要有一个方法,这个方法可以接受客户端的参数,再返回服务端的响应。
//其实很容易可以看出,我仰定义了一个service,称为SayHe11o,这个服务中有一个rpc方法,名为SayHe1lo。
//这个方法会发送-个HelloRequest,然后返回一个He1 loResponse。
service SayHello{
rpc SayHello(HelloRequest)returns (HelloResponse){}
}
//message关键字,其实你可以理解为Go1ang中的结构体。
//这里比较特别的是变量后面的“赋值”。注意,这里并不是赋值,而是在定义这个变量在这个message中的位置。
message HelloRequest{
string requestName = 1;
// int64 age = 2;
}
message HelloResponse{
string responseMsg = 1;
}
在编写完上面的内容后,在helloworld/proto目录下执行如下命令:
protoc --go_out=. hello.proto
protoc --go-grpc_out=. hello.proto
4.2
1、proto文件介绍
切片类型使用repeated
message HelloRequest{
string requestName = 1;
int64 age = 2;
repeated string name = 3;
}
2、服务端代码编写
-
创建gRPC Server对象,你可以理解为它是Server端的抽象对象
-
将server(其包含需要被调用的服务端接口)注册到gRPC Server的内部注册中心。
这样可以在接受到请求时,通过内部的服务发现,发现该服务端接口并转接进行逻辑处理
-
创建Listen,监听TCP端口
-
gRPC Server开始Iis.Accept,直到Stop
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"net"
pb "rpc_study/hello-server/proto"
)
type server struct {
pb.UnimplementedSayHelloServer
}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{ResponseMsg: "hello" + req.RequestName}, nil
}
func main() {
//开启端口
listen, _ := net.Listen("tcp", ":9090")
//创建grpc服务
grpcServer := grpc.NewServer()
//在grpc服务端中注册自己编写的服务
pb.RegisterSayHelloServer(grpcServer, &server{})
//启动服务
err := grpcServer.Serve(listen)
if err != nil {
fmt.Printf("failed to serve: %v", err)
return
}
}
3、客户端编写
-
创建与给定目标(服务端)的连接交互
-
创建server的客户端对象
-
发送RPC请求,等待同步响应,得到回调后返回响应结果
-
输出响应结果
package main import ( "context" "fmt" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "log" pb "rpc_study/hello-server/proto" ) func main() { //连接到server端,此处禁用安全传输,没有加密和验证 conn, err := grpc.Dial("127.0.0.1:9090", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() //建立连接 client := pb.NewSayHelloClient(conn) //执行rpc调用 resp, _ := client.SayHello(context.Background(), &pb.HelloRequest{RequestName: "zrj"}) fmt.Printf(resp.ResponseMsg) }
4、认证-安全传输
- SSL/TLS认证方式
-
生成证书
#1、生成私钥 openssl genrsa -out server.key 2048 #2、生成证书全部回车即可,可以不填 openssl req -new -x509 -key server.key -out server.crt -days 36500 #国家名称 Country Name (2 letter code)[AU]:CN #省名称 State or Province Name (full name)[Some-State]:GuangDong #城市名称 Locality Name (eg,city)[]Meizhou #公司组织名称 organization Name (eg,company)[Internet widgits Pty Ltd]:Xuexiangban #部门名称 organizational Unit Name (eg,section)[]go #服务器or网站名称 Common Name (e.g.server FQDN or YOUR name)[]kuangstudy #邮件 Email Address []:24736743@qq.com #3、生成csr openssl req -new -key server.key -out server.csr
#生成证书私钥test.key openssl genpkey -algorithm RSA -out test.key #通过私钥test.key生成证书请求文件test.csr(注意cfg和cnf) openssl req -new -nodes -key test.key -out test.csr -days 3650 -subj "/C=cn/OU=myorg/O=mycomp/CN=myname" -config ./openssl.cfg -extensions v3_req #test.csr是上面生成的证书请求文件。ca.crt/server.key是CA证书文件和key,用来对test.csr进行签名认证。这两个文件在第一部分生 成。 #生成SAN证书pem openssl x509 -req -days 365 -in test.csr -out test.pem -CA server.crt -CAkey server.key -CAcreateserial -extfile ./openssl.cfg -extensions v3_req