1. 安装
protobuf编译器protoc
protobuf的golang运行时
protoc-gen-go-grpc安装
echo google.golang.org/grpc/cmd/protoc-gen-go-grpc
SupportPackageIsVersion7 需要google.golang.org/grpc 1.30以上版本支持
docs
protobuf3基础语法
生成go文件的命令
protoc --go_out=../services pb.proto
生成grpc文件
protoc --go-grpc_out=:../services Prod.proto
生成grpc-gateway的gw.go文件
protoc --grpc-gateway_out logtostderr=true:../services Prod.proto 生成gw.go
生成pb.go 和 pb.micro.go文件
(需要protoc-gen-micro)
protoc --proto_path=protos --micro_out=users --go_out=users Users.proto
2. demo
- Prod.proto
syntax = "proto3";
option go_package="../services";
message ProdRequest{
int32 prod_id = 1; //传入的商品id
}
message ProdResponse{
int32 prod_stock = 1; //库存
}
//自定义方法
service ProdService{
rpc GetProdStock(ProdRequest) returns (ProdResponse);
}
- ProdService.go
package services
import (
"context"
)
type ProdService struct {
}
func (this *ProdService) mustEmbedUnimplementedProdServiceServer() {
panic("implement me")
}
func (this *ProdService) GetProdStock(ctx context.Context, in *ProdRequest) (*ProdResponse, error) {
return &ProdResponse{ProdStock: 25}, nil
}
- 服务端
package main
import (
"dgrpc/services"
"google.golang.org/grpc"
"net"
)
func main() {
createServer()
}
func createServer() {
creds, err := credentials.NewServerTLSFromFile("../keys/server.crt", "../keys/server_no_passwd.key")
if err!=nil{
log.Fatal(err)
}
rpcServer := grpc.NewServer(grpc.Creds(creds))
//rpcServer := grpc.NewServer() //不使用证书
prodService := services.ProdService{}
services.RegisterProdServiceServer(
rpcServer,
&prodService,
)
//使用tcp方式
//listener, _ := net.Listen("tcp", ":8081")
//rpcServer.Serve(listener)
//使用http方式
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.Method,r.Header,r.Proto)
fmt.Println(r)
rpcServer.ServeHTTP(w,r)
})
httpServer := &http.Server{
Addr: ":8081",
Handler: mux,
}
httpServer.ListenAndServeTLS("../keys/server.crt", "../keys/server_no_passwd.key") //启动https服务,使用http2
}
- 客户端
package main
import (
"context"
"dgrpc/services"
"fmt"
"google.golang.org/grpc"
"log"
)
func main() {
createClient()
}
func createClient() {
creds, err := credentials.NewClientTLSFromFile("../keys/server.crt", "bat.com")
if err!=nil{
log.Fatal(err)
}
conn, err := grpc.Dial(":8081", grpc.WithTransportCredentials(creds))
//grpc.WithInsecure() 不使用证书
//conn, err := grpc.Dial(":8081", grpc.WithInsecure())
if err!=nil{
log.Fatal(err)
}
defer conn.Close()
client := services.NewProdServiceClient(conn)
request := services.ProdRequest{ProdId: 32}
reply, _ := client.GetProdStock(context.Background(), &request)
fmt.Println(reply.ProdStock)
}
3.openssl 自签名证书
- openssl
- genrsa -des3 -out server.key 2048(生成私钥文件)
- req -new -key server.key -out server.csr(生成证书.common name也就是域名)
- 可以清除密码:rsa -in server.key -out server_no_passwd.key
- x509 -req -days 365 -in server.csr -signkey server_no_passwd.key -out server.crt
4. 使用自签CA,Server,client证书和双向认证
- ca证书
- genrsa -out ca.key 2048
- req -new -x509 -days 3650 -key ca.key -out ca.pem
common name使用localhost
- 生成服务端证书
- genrsa -out server.key 2048
- req -new -key server.key -out server.csr
- x509 -req -sha256 -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650 -in server.csr -out server.pem
- 生成客户端证书
- ecparam -genkey -name secp384r1 -out client.key
- req -new -key client.key -out client.csr
- x509 -req -sha256 -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650 -in client.csr -out client.pem
5. 插件
- grpc-gateway
golang proto import 路径问题 和 google protobuf - protoc-gen-validate
protoc --go-grpc_out=:…/services --validate_out=“lang=go:…/services” Models.proto (支持proto文件中定义option go_package = “.;services”;不支持.和…)
本文详细介绍了在Go环境下设置gRPC的步骤,包括安装protobuf编译器和相关插件,创建grpc服务端和客户端的demo,以及使用openssl生成自签名证书进行双向认证的过程。

被折叠的 条评论
为什么被折叠?



