Skip to content

Commit c28ea55

Browse files
committed
add grpc in readme
1 parent 08fe93e commit c28ea55

File tree

2 files changed

+109
-1
lines changed

2 files changed

+109
-1
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# RPC服务框架之gRPC
2+
3+
### 一.什么是RPC?
4+
5+
##### RPC原理简图
6+
7+
<img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/grpc/831608122149_.pic_hd.jpg" width = "580" height = "340" alt="图片名称" align=center />
8+
9+
### 二.什么是gRPC?
10+
11+
##### gRPC是一个高性能、通用的开源RPC框架,基于HTTP/2二进制协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。
12+
13+
##### ProtoBuf具有了优秀的系列化协议所需的众多典型特性
14+
ProtoBuf是一个存粹的展示层协议,可以和各种传输层协议一起使用
15+
> - 具有标准的IDL和IDL编译器;
16+
>
17+
> - 序列化数据非常简介,紧凑,与XML相比,其序列化之后的数据量约为1/3和1/10;
18+
>
19+
> - 解析速度非常快,比对应的XML快20~100倍速度
20+
21+
22+
#### gRPC服务端创建流程
23+
24+
<img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/grpc/841608122163_.pic_hd.jpg" width = "620" height = "380" alt="图片名称" align=center />
25+
26+
> - gRPC服务端基于NettyServer负责监听Socket地址,基于HTTP2协议的写入;
27+
>
28+
> - gPRC服务接口并不是使用反射来实现的,而是通过Proto工具生成的代码,将服务接口注册到gRPC内部的服务上,性能较高;
29+
>
30+
> - ServerImpl负责整个gRPC服务端消息的调度和处理,会初始化:Netty线程池、gRPC的线程池、内部服务注册等;
31+
32+
#### gRPC消息接入流程
33+
34+
<img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/grpc/851608122185_.pic_hd.jpg" width = "620" height = "380" alt="图片名称" align=center />
35+
36+
> - gRPC消息由netty/http2协议负责接入,通过gRPC注册的Http2FrameLister将解码后的Http Header和Http Body后,发送到gRPC的NettyServerHandler,实现Netty Http/2的消息接入;
37+
38+
39+
### 三.gRPC实战
40+
41+
##### 1.编写PB文件,proto语法参考:[https://developers.google.com/protocol-buffers/docs/proto](https://developers.google.com/protocol-buffers/docs/proto "https://developers.google.com/protocol-buffers/docs/proto")
42+
```java
43+
syntax = "proto3";
44+
45+
option java_package = "com.ipman.rpc.grpc.springboot.lib";
46+
47+
// The greeter service definition.
48+
service Greeter {
49+
// Sends a greeting
50+
rpc SayHello ( HelloRequest) returns ( HelloReply) {}
51+
52+
}
53+
// The request message containing the user's name.
54+
message HelloRequest {
55+
string name = 1;
56+
}
57+
// The response message containing the greetings
58+
message HelloReply {
59+
string message = 1;
60+
}
61+
```
62+
63+
##### 2.编写Server端,通过@GrpcService注解注册gRPC服务
64+
65+
```java
66+
@Slf4j
67+
@GrpcService(GreeterOuterClass.class)
68+
public class GreeterService extends GreeterGrpc.GreeterImplBase {
69+
70+
/**
71+
* gRPC Server started, listening on address: 0.0.0.0, port: 8800
72+
*
73+
* @param request
74+
* @param responseObserver
75+
*/
76+
@Override
77+
public void sayHello(GreeterOuterClass.HelloRequest request, StreamObserver<GreeterOuterClass.HelloReply> responseObserver) {
78+
String message = "Hello " + request.getName();
79+
final GreeterOuterClass.HelloReply.Builder replyBuilder = GreeterOuterClass.HelloReply.newBuilder().setMessage(message);
80+
responseObserver.onNext(replyBuilder.build());
81+
responseObserver.onCompleted();
82+
log.info("Returning " + message);
83+
}
84+
}
85+
```
86+
87+
##### 3.编写Client端,通过@GrpcClient绑定gRPC服务端地址与端口等信息
88+
89+
```java
90+
@Service
91+
public class GrpcClientServiceImpl implements IGrpcClientService {
92+
93+
@GrpcClient("local-grpc-server")
94+
private Channel serverChannel;
95+
96+
/**
97+
* 通过本地存protocol buffer存根序列化后调用gRPC服务端
98+
*
99+
* @param name
100+
* @return
101+
*/
102+
@Override
103+
public String sendMessage(String name) {
104+
GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(serverChannel);
105+
GreeterOuterClass.HelloReply response = stub.sayHello(GreeterOuterClass.HelloRequest.newBuilder().setName(name).build());
106+
return response.getMessage();
107+
}
108+
}
109+
```

springboot-rpc-grpc-sample/springboot-rpc-grpc-consume/src/main/java/com/ipman/rpc/grpc/springboot/service/impl/GrpcClientServiceImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,4 @@ public String sendMessage(String name) {
3333
GreeterOuterClass.HelloReply response = stub.sayHello(GreeterOuterClass.HelloRequest.newBuilder().setName(name).build());
3434
return response.getMessage();
3535
}
36-
3736
}

0 commit comments

Comments
 (0)