grpc

255 阅读1分钟

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)

www.cnblogs.com/jackluo/p/1…

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())
}