grpc
下载插件
https://github.com/grpc/grpc-go
go get -u google.golang.org/grpc
https://github.com/protocolbuffers/protobuf/releases/tag/v3.17.3
go install github.com/golang/protobuf/protoc-gen-go@latest
中间文件 Prod.proto
syntax = "proto3";
package services;
option go_package = "./services";
message ProdRequest {
int32 prod_id = 1;
}
message ProdResponse{
int32 prod_stock = 1;
}
protoc --go_out=. Prod.proto
protoc --go_out=. *.proto
go mod tidy
syntax = "proto3";
package services;
option go_package = "./services";
message ProdRequest {
int32 prod_id = 1;
}
message ProdResponse{
int32 prod_stock = 1;
}
service ProdService {
rpc GetProdStock(ProdRequest) returns (ProdResponse);
}
protoc --go_out=plugins=grpc:. *.proto
go mod tidy
services/prodService.go
package services
import (
"context"
"fmt"
)
type ProdService struct {}
func (*ProdService) GetProdStock(ctx context.Context, req *ProdRequest) (*ProdResponse, error) {
fmt.Println("req.GetProdId():", req.GetProdId())
return &ProdResponse{ProdStock: 20}, nil
}
server.go
package main
import (
"awesomeProject14/services"
"google.golang.org/grpc"
"log"
"net"
)
func main() {
rpcServer := grpc.NewServer()
services.RegisterProdServiceServer(rpcServer, new(services.ProdService))
listen, err := net.Listen("tcp", ":8899")
if err != nil {
log.Fatalln(err)
}
log.Println("serve...")
err = rpcServer.Serve(listen)
if err != nil {
log.Fatalln(err)
}
}
client.go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"grpcCli/services"
"log"
)
func main() {
conn, err := grpc.Dial(":8899", grpc.WithInsecure())
if err != nil {
log.Fatalln(err)
}
defer conn.Close()
prodClient := services.NewProdServiceClient(conn)
prodResp, err := prodClient.GetProdStock(context.Background(), &services.ProdRequest{ProdId: 2})
if err != nil {
log.Fatalln(err)
}
fmt.Println(prodResp.ProdStock)
fmt.Println(prodResp.GetProdStock())
}
生成证书 SSL(SAN)
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
openssl req -new -sha256 \
-key ca.key \
-subj "/C=CN/ST=Beijing/L=Beijing/O=UnitedStack/OU=Devops/CN=www.zchd.ltd" \
-reqexts SAN \
-config <(cat /etc/pki/tls/openssl.cnf \
<(printf "[SAN]\nsubjectAltName=DNS:www.zchd.ltd,DNS:www.test.zchd.ltd")) \
-out zchd.csr
openssl x509 -req -days 365000 \
-in zchd.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-extfile <(printf "subjectAltName=DNS:www.zchd.ltd,DNS:www.test.zchd.ltd") \
-out zchd.crt
server.go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"grpcCli/services"
"log"
)
func main() {
cre, err := credentials.NewClientTLSFromFile("cert/zchd.crt", "www.zchd.ltd")
if err != nil {
log.Println("xxxx")
log.Fatalln(err)
}
conn, err := grpc.Dial(":8899", grpc.WithTransportCredentials(cre))
if err != nil {
log.Println("222")
log.Fatalln(err)
}
defer conn.Close()
prodClient := services.NewProdServiceClient(conn)
prodResp, err := prodClient.GetProdStock(context.Background(), &services.ProdRequest{ProdId: 2})
if err != nil {
log.Println("333")
log.Fatalln(err)
}
fmt.Println(prodResp.ProdStock)
fmt.Println(prodResp.GetProdStock())
}
client.go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"grpcCli/services"
"log"
)
func main() {
cre, err := credentials.NewClientTLSFromFile("cert/zchd.crt", "www.zchd.ltd")
if err != nil {
log.Println("xxxx")
log.Fatalln(err)
}
conn, err := grpc.Dial(":8899", grpc.WithTransportCredentials(cre))
if err != nil {
log.Println("222")
log.Fatalln(err)
}
defer conn.Close()
prodClient := services.NewProdServiceClient(conn)
prodResp, err := prodClient.GetProdStock(context.Background(), &services.ProdRequest{ProdId: 2})
if err != nil {
log.Println("333")
log.Fatalln(err)
}
fmt.Println(prodResp.ProdStock)
fmt.Println(prodResp.GetProdStock())
}