SpringBoot-Grpc使用Json传输数据,无须.proto文件

Grpc介绍

gRPC是一个现代的开源高性能RPC框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查和身份验证。它还适用于分布式计算的最后一英里,用于将设备,移动应用程序和浏览器连接到后端服务。

Faster-Grpc

Faster-Framework热衷于开发环境脚手架的快速集成与搭建,1.1.0版本开始Faster将grpc与SpringBoot进行了基础。并支持如下特性:

  1. 客户端通过动态代理来实现具体的请求方法,仅需要创建接口、标识注解即可使用,免除了编写实现类、maven生成父类的复杂步骤。
  2. 服务端通过反射调用被注解标识的类与方法接收请求。
  3. 使用JSON协议进行传输数据,序列化与反序列化默认使用Jackson,并提供了自定义Json序列化工具的方式。免除了编写.proto文件、参数顺序必须一致、参数数量必须一致等诸多困扰,

快速开始

希望您已经阅读过基本的grpc使用方式。如果您尚不熟悉,请移步grpc官方查看。

grpc-java

Maven配置

我们基于SpringBoot进行构建。Maven配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>faster-test-grpc</groupId>
    <artifactId>faster-test-grpc</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.1.1.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.org.faster</groupId>
            <artifactId>spring-boot-starter-grpc</artifactId>
            <version>1.1.1.RELEASE</version>
        </dependency>
    </dependencies>
</project>

服务端

application.yml

faster:
  grpc:
    enabled: true
    server:
      enabled: true #实际可不写,默认开启
      port: 50051 #端口,不写默认50051

编写服务类


@GRpcApi("unary")
@Slf4j
public class UnaryService {

    @GRpcMethod
    public void testInt(int data, StreamObserver<Integer> response) {
        log.info("请求数据:{}", data);
        response.onNext(1);
        response.onCompleted();
    }
}

@GRpcApi中的值为scheme,客户端的@GRpcService(scheme="")与服务端相同时,即可定位到服务端的服务。

@GRpcMethod默认获取当前方法名称,客户端同样使用此注解标识要调用的服务方法,可通过@GRpcMethod("xxx")修改名称,两者一致调用成功。

注意:对于GRpc而言,请求参数中只能出现一个业务参数实体,才可通过序列化工具进行序列化,不可出现多个业务参数。

客户端

application.yml

faster:
  grpc:
    enabled: true #实际可不写,默认开启
    client:
      enabled: true #实际可不写,默认开启
      services:
        test-unary: #与GRpcService中的value对应
          host: localhost # 远程主机地址
          port: 50051 # 远程端口号,不写默认50051
        test-server-stream: #与GRpcService中的value对应
          host: localhost #服务端host

定义接口

@GRpcService(value = "test-unary", scheme = "unary")
public interface UnaryService {
    @GRpcMethod
    int testInt(int data);
}

@GRpcService中的value对应配置文件中services下的key,以此获取远程host与端口。

@GRpcService中的scheme对应远程服务@GRpcApi("unary")中所定义的值,用于创建grpc fullMethod,两者一致,即可调用成功。

@GRpcMethod默认获取当前方法名称,远程服务端同样使用此注解标识提供服务的方法,可通过@GRpcMethod("xxx")修改名称,两者一致调用成功。

注意:对于GRpc而言,接口参数只能存在一个业务实体参数,才可通过序列化工具进行序列化,不可出现多个业务参数。

调用

@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class UnaryTest{
    @Autowired
    private UnaryService unaryService;

    @Test
    public void testInt() {
        int result = unaryService.testInt(1);
        log.info("返回数据:{}", result);
    }
}

更多方式

GRpc本身提供了多种服务方法供开发者使用,Faster同样集成并支持这些方法,可通过@GrpcMethod中的type进行修改。

注意:当type做出改变后,对应的参数、返回值也必须相应调整。

更多代码参见:

faster-grpc-client-example

faster-grpc-server-example

快速开发框架
高质量图片压缩工具

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。