Grpc介绍
gRPC是一个现代的开源高性能RPC框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查和身份验证。它还适用于分布式计算的最后一英里,用于将设备,移动应用程序和浏览器连接到后端服务。
Faster-Grpc
Faster-Framework热衷于开发环境脚手架的快速集成与搭建,1.1.0版本开始Faster将grpc与SpringBoot进行了基础。并支持如下特性:
- 客户端通过动态代理来实现具体的请求方法,仅需要创建接口、标识注解即可使用,免除了编写实现类、maven生成父类的复杂步骤。
- 服务端通过反射调用被注解标识的类与方法接收请求。
- 使用JSON协议进行传输数据,序列化与反序列化默认使用Jackson,并提供了自定义Json序列化工具的方式。免除了编写.proto文件、参数顺序必须一致、参数数量必须一致等诸多困扰,
快速开始
希望您已经阅读过基本的grpc使用方式。如果您尚不熟悉,请移步grpc官方查看。
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做出改变后,对应的参数、返回值也必须相应调整。
更多代码参见:
网友评论