Docker容器程序员Spring Boot源码&&框架&&相关技术文章

spring-boot-starter-grpc 实现原理

2018-05-20  本文已影响337人  Anoyi

RPC 流程

spring-boot-starter-grpc 技术实现

gRPC 远程调用

gRPC 提供了 proto3 代码直接生成 Java 代码的 Maven 插件,在 proto 文件定义的请求体、响应体、服务、服务方法等信息,会生成对应的 Java 类。

示例:service.proto

// 语法类型
syntax = "proto3";

// 指定包名
option java_package = "com.anoyi.rpc";
// 指定类名
option java_outer_classname = "GrpcService";
option java_multiple_files = false;

// 定义通用的 Grpc 服务
service CommonService {
    // 处理请求
    rpc handle ( Request ) returns ( Response ) {}
}

// 定义通用的 Grpc 请求体
message Request {
    bytes request = 1;
}

// 定义通用的 Grpc 响应体
message Response {
    bytes reponse = 1;
}

会生成如下 Java 类:(只列出常用重要的)

根据生成的代码,实现 CommonServiceImplBase 抽象类,通过请求体提供的 ServiceName,从 Spring 容器中获取 ServiceBean,然后使用 Java 反射调用 Service Method。

序列化与反序列化

选用 protostuff 作为序列化与反序列化工具,因为它是目前同类开源的工具中性能最好的。相关数据 https://github.com/eishay/jvm-serializers/wiki

相关代码 ProtobufUtils

@GrpcServeice 注解的 Bean 的注入

相关代码 ClassPathGrpcServiceScanner / GrpcAutoConfiguration / GrpcServiceProxy

服务发现

spring-boot-starter-grpc 为容器化而生,不内嵌服务注册与发现功能,服务发现通过容器化的平台的服务发现机制(一般为 DNS 、iptables、 IPVS 等技术)来获取远程服务的地址。

异常处理

目前的做法是捕获所有类型的异常,封装到统一的响应体,后期可能会用更优雅的方式来处理异常。

上一篇下一篇

猜你喜欢

热点阅读