grpc使用

本文详细介绍了在Go环境下设置gRPC的步骤,包括安装protobuf编译器和相关插件,创建grpc服务端和客户端的demo,以及使用openssl生成自签名证书进行双向认证的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 安装

protobuf编译器protoc
protobuf的golang运行时
protoc-gen-go-grpc安装

Mac下环境搭建(用brew安装go和protoc)

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

grpc相关

  • 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 生成证书(含openssl详解)

  1. openssl
  2. genrsa -des3 -out server.key 2048(生成私钥文件)
  3. req -new -key server.key -out server.csr(生成证书.common name也就是域名)
  4. 可以清除密码:rsa -in server.key -out server_no_passwd.key
  5. x509 -req -days 365 -in server.csr -signkey server_no_passwd.key -out server.crt

4. 使用自签CA,Server,client证书和双向认证

  1. ca证书
  • genrsa -out ca.key 2048
  • req -new -x509 -days 3650 -key ca.key -out ca.pem
    common name使用localhost
  1. 生成服务端证书
  • 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
  1. 生成客户端证书
  • 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. 插件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值