gRPC的高级应用
1. 拦截器 一元拦截器
2. Stream Tracer 【监听流】 流拦截器
3. Retry Policy 客户端重试
4. NameResolver 注册中心
5. 负载均衡
6. GRPC与微服务整合
- 序列化 protobuf与dubbo
- grpc 与 Gateway
- grpc 与 JWT
- grpc 与 Nacos2.0
- grpc 可以替换 OpenFeign
Protobuf语法详解
四种通信方式简单rpc、一元rpc服务端流式RPC客户端流式RPC双向流RPC简单RPC特点:当client发起调用后,提交数据,并且等待服务端响应开发过程中,主要采用的是一元RPC的通信方式语法//服务接口定义serviceHelloService{rpchelloreturns{}//练习rpchello1returns{}}服务端流式RPC一个请求对象,服务端可以返回多个结果对象使用场景client-server股票每时每刻都要发送价值数据语法//服务接口定义serviceHelloService{rpchelloreturns{}//服务端流式RPC//练习rpchello1returns{}//一元RPC}客户端流式RPC指的是客户端发送多个请求对象,服务端只返回一个结果应用场景IOT物联网【传感器】中应用较多client->server传感器服务端例如车上的传感器每次都发送位置信息到服务端语法//服务接口定义serviceHelloService{//服务端流式RPCrpcc2ssreturns{}//客户端流式RPCrpccs2sreturns{}}开发api编写idlrpc定义server/***客户端流式RPC*@paramresponseObserver*@returnStreamObserver*/@OverridepublicStreamObserver
gRP和SpringBoot整合的思想
1. grpc-client
2. grpc-server
GRPC代理方式
1. BlockingStub (常用)
阻塞,通信方式
2. Stub (常用)
异步,通过监听处理
3. FutureStub
同步,异步,类似 NettyFuture
1. FutureStub 只能应用在一元 RPC
2.
public class GrpcClient7 {
public static void main(String[] args) {
ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost", 9000).usePlaintext().build();
try {
TestServiceGrpc.TestServiceFutureStub testServiceFutureStub = TestServiceGrpc.newFutureStub(managedChannel);
ListenableFuture<TestProto.TestResponse> responseListenableFuture = testServiceFutureStub.testYuluo(
TestProto.TestRequest.newBuilder()
.setName("yuluo").build());
/* 同步操作
TestProto.TestResponse testResponse = responseListenableFuture.get();
System.out.println(testResponse.getResult());*/
// 异步操作
/* 不能和在实战中使用
responseListenableFuture.addListener(() -> {
System.out.println("异步的RPC响应回来了……");
}, Executors.newCachedThreadPool());*/
// 实战使用代码
Futures.addCallback(responseListenableFuture, new FutureCallback<TestProto.TestResponse>() {
@Override
public void onSuccess(TestProto.TestResponse testResponse) {
System.out.println("result.getResult() = " + testResponse.getResult());
}
@Override
public void onFailure(Throwable throwable) {
}
}, Executors.newCachedThreadPool());
System.out.println("后续的操作……");
// 避免异步操作执行太快,睡一会在执行
managedChannel.awaitTermination(12, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
} finally {
managedChannel.shutdown();
}
}
}
gRPC的四种通信方式
SpringBoot与GRPC整合的过程中对于服务端封装
HTTP0协议
1. 回顾HTTP1.x协议
HTTP1.0 协议 请求响应的模式 短链接(无状态)协议 为了解决状态问题,使用了HttpSession的技术解决 单工通信 传输数据文本结构
HTTP1.1 协议 请求响应的模式 有限长连接 CS连接会保持一段时间 升级到了WebSocket方式 双工 可以实现服务器向客户端推送
总结Http1.x协议 共性
1. 传输数据文本格式,可读性好但是效率差
2. 本质上Http1.x无法实现双工通信
3. 资源的请求,需要发送多次请求,建立多个连接才可以完成
获取页面时,需要多次请求获取js和css文件,采用异步的方式进行。此时服务器压力增大,可以使用动静分离的手段解决,使用CDN缓存,减轻主服务器的请求压力
2. Http2.0协议
1. HTTP2.0协议是一个二进制协议,效率高于Http1.0协议,但是可读性差
2. 可以实现双工通信
2. 一个请求,一个连接,可以请求多个数据 (多路复用)
3. Http2.0协议的三个概念(参看图)
1. 数据流 stream
2. 消息 message
3. 帧 frame
4. 其他相关概念 (新的技术总是会把之前协议种使用程序来处理的问题放到标准中去)
1. 数据流的优先级,可以通过位不同的stream设置权重,限制不同流的传输顺序
2. 流控,client发送的数据太快了,服务器端处理不过来,通知client暂停数据发送
gRPC开发实战
版本使用,需要注意:目前不支持springboot0.x版本,使用6正常
由google开源的一个高性能的RPc框架,由google内部的Stubby框架演化而来。2015年正式开源。云原生时代的RPC标准,由Go语言开发gRPC的核心设计思路网络通信------>gRPC自己封装了网络通信的部分,提供了多种语言的网络通信的封装,解决异构服务的问题协议------>HTTP2传输数据的时候使用二进制的数据内容。支持双向流支持连接的多路复用序列化------>数据传输的格式,主要有两种基于文本基于二进制java原生的序列化方式谷歌开源的序列化方式:protubuf:ProtocolBuffers时间和空间效率是JSON的3-5倍IDL语言代理的创建---->让调用者像调用本地方法那样,去调用远端的服务方法称为stubgPRC和ThriftRPC的区别共性:支持异构语言的RPC区别:网络通信ThriftTCP专属协议GRPCHTTP2性能角度ThriftRPC性能高于gRPCgRPC大厂支持,在云原生时代与其他组件更容易集成,所以gRPC应用更广泛gRPC的好处高效的进行进程间通信序列化和协议支持多语言原生支持CGoJava实现,C语言版本上扩展C++,C#,NodeJS,Python等支持多平台运行GRPC采用protobuf使用HTTP2协议
文章为作者独立观点,不代表股票交易接口观点