参考up:孙哥
孙哥主页
四种通信方式
简单rpc 一元rpc(Unary RPC)
第一个RPC程序就是 一元RPC
特点:
1. 当client发起调用后,提交数据,并且等待 服务端响应
2. 开发过程中 主要采用的就是一元RPC的这种通信方式
service HelloServer{
rpc hello(HelloRequest) returns (HelloResponse){}
rpc hello1(HelloRequest1) returns (HelloResponse1){}
}
服务端流式RPC (Server Streaming RPC)
一个请求对象,服务端可以返回多个结果对象
使用场景:
股票系统
client ------>发送股票编号--->Server
<--------发送 某一个时刻的 股票行情
语法
service HelloServer{
rpc hello(HelloRequest) returns (HelloResponse){}
rpc hello1(HelloRequest1) returns (HelloResponse1){}
rpc c2ss(HelloRequest) returns(stream HelloResponse){}
}
服务端代码
@Override
public void c2ss(HelloProto.HelloRequest request, StreamObserver<HelloProto.HelloResponse> responseObserver) {
// 获取请求中的name参数
String name = request.getName();
System.out.println("name参数:" + name);
// 循环发送10个响应消息
for (int i = 0; i < 10; i++) {
// 创建响应消息的构建器
HelloProto.HelloResponse.Builder builder = HelloProto.HelloResponse.newBuilder();
// 设置响应消息的内容为name参数加上当前时间戳
builder.setResult(name + " 你好" + System.currentTimeMillis());
// 构建响应消息
HelloProto.HelloResponse helloResponse = builder.build();
// 发送响应消息给客户端
responseObserver.onNext(helloResponse);
try {
// 线程等待1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
// 响应消息发送完毕
responseObserver.onCompleted();
}
存在问题:服务端存在阻塞,必须处理完所有消息才给客户端返回 监听 异步方式 处理服务端
客户端代码
public static void main(String[] args) {
// 创建 ManagedChannel 对象,用于与服务端建立连接
ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost", 9000).
usePlaintext().build();
try {
// 创建 HelloServerGrpc.HelloServerBlockingStub 对象,用于与服务端进行 RPC 调用
HelloServerGrpc.HelloServerBlockingStub helloService = HelloServerGrpc.newBlockingStub(managedChannel);
// 创建 HelloProto.HelloRequest 对象,用于构建请求参数
HelloProto.HelloRequest.Builder builder = HelloProto.HelloRequest.newBuilder();
HelloProto.HelloRequest helloRequest = builder.setName("blue").build();
// 调用服务端的 hello 方法,传入请求参数
Iterator<HelloProto.HelloResponse> helloResponseIterator = helloService.c2ss(helloRequest);
while (helloResponseIterator.hasNext()){
HelloProto.HelloResponse helloResponse = helloResponseIterator.next();
String result = helloResponse.getResult();
System.out.println("result="+result);
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
managedChannel.shutdown();
}
}