gRPC项目学习总结

这篇博客是关于gRPC项目的学习总结,涵盖了序列化、gRPC通信方式、反射、拦截器、SSL/TLS详解、nginx负载均衡以及gRPC网关的使用。文章详细介绍了TLS的四次握手过程,并提到了在实际操作中遇到的protoc版本问题和解决方案。
摘要由CSDN通过智能技术生成

gRPC项目学习总结

项目仓库

原教程视频

序列化对象为二进制和Json

Go

  1. 将protobuf信息写入二进制文件
  2. 从二进制文件中读取protobuf信息
  3. 写入json文件并比较大小
//json.go

// ProtobufToJson 将protobuf文件转换为json
func ProtobufToJson(message proto.Message) ([]byte, error) {
   
	marshaler := protojson.MarshalOptions{
   
		UseEnumNumbers:  true, //枚举值使用数字
		EmitUnpopulated: true, //未填充字段使用默认值
	}
	bin, err := marshaler.Marshal(proto.MessageV2(message))
	if err != nil {
   
		return nil, err
	}
	return bin, nil
}
//file.go

//序列化对象

// WriteProtobufToBinaryFile 将message对象序列化并写入二进制文件中
func WriteProtobufToBinaryFile(message proto.Message, filename string) error {
   
	data, err := proto.Marshal(message) //序列化
	if err != nil {
   
		return err
	}
	if err = ioutil.WriteFile(filename, data, 0644); err != nil {
   
		return err
	}
	return nil
}

gRPC 的四种通信方式

  1. 类似REST的单请求+单回复
  2. 客户端多请求+服务端单回复
  3. 客户端单请求+服务端多回复
  4. 客户端多请求+服务端多回复
service LaptopService {
  //一元RPC 创建电脑
  rpc CreateLaptop(CreateLaptopRequest) returns (CreateLaptopResponse){
    option (google.api.http) = {
      post: "/v1/laptop/create"
      body: "*"
    };
  };
  //服务器流式RPC 检索电脑
  rpc SearchLaptop(SearchLaptopRequest) returns (stream SearchLaptopResponse){
    option (google.api.http) = {
      get: "/v1/laptop/search"
    };
  };
  //客户端流式RPC 上传图片
  rpc UploadLaptop(stream UploadLaptopRequest) returns (UploadLaptopResponse){
    option (google.api.http) = {
      post: "/v1/laptop/upload"
      body: "*"
    };
  };
  //双向流式RPC 评分
  rpc RateLaptop(stream RateLaptopRequest) returns (stream RateLaptopResponse){
    option (google.api.http) = {
      post: "/v1/laptop/rate"
      body: "*"
    };
  };
}

gRPC 反射

grpc反射
gRPC 服务器反射提供有关服务器上可公开访问的 gRPC 服务的信息,并帮助客户端在运行时构造 RPC 请求和响应,而无需预编译的服务信息。
它由 gRPC CLI 使用,可用于自省服务器原型和发送/接收测试 RPC。

evans

一个grpc客户端,在服务端开启反射并运行时,通过evans -r repl -p 端口进入shell,
通过show package查看反射的包信息,通过package 包名选择不同的包,通过show service查看反射的服务信息,通过service 服务选择服务,通过call CreateLaptop
调用服务,中途使用ctrl+D取消重复字段的输入…
evans

gRPC 拦截器

类似于中间件,可以在服务端和客户端之间添加的额外功能,服务器端拦截器是gRPC服务器在调用实际RPC方法前将调用的函数,可以用于日志记录,跟踪,限流,身份验证,限流等。
客户端拦截器是gRPC客户端在调用实际RPC方法前将调用的函数.

服务器端拦截器将采用JWT来验证,客户端拦截器将添加JWT到请求。

其实和go web 的token很像,都是注册到服务的前面,只不过方式不同而已。

// 拦截器的编写
const Authorization = "authorization"

//权限校验

type AuthInterceptor struct {
   
	jwtMaker        token.Maker
	accessibleRoles map[string][]string //RPC对应的Roles
}

func NewAuthInterceptor(jwtMaker token.Maker, accessibleRoles map[string][]string) *AuthInterceptor {
   
	return &AuthInterceptor{
   jwtMaker: jwtMaker, accessibleRoles: accessibleRoles}
}

// Unary 一元拦截器
func (interceptor *AuthInterceptor) Unary() grpc.UnaryServerInterceptor {
   
	return func(ctx context.Context, req interface{
   }, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{
   }, err error) {
   
		log.Println("-->unary Interceptor: ", info.FullMethod)
		if err := interceptor.authorized(ctx, info.FullMethod); err != nil {
   
			return nil, err
		}
		return handler<
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值