一.Grpc簡介
一個2016年才由google正式發布的的RPC框架,基于http2,protobuf協議
官網地址:https://www.grpc.io
二.此文背景介紹
我跟你們一樣,也是一個新手,由于公司要用到此框架還有就是個人的興趣所致,嘗試在自己的垃圾華碩本上搭建整個框架,在此記錄并分享給有需要朋友。
在此多說一句,rpc框架行業流行的很多,有dubbo,thrift,spring cloud等,最近微服務的概念很火,這就導致了一個(多個)應用對應更多的服務(微應用),隨之而來的就是服務之間的通信問題。當然,通訊從某個角度來劃分可以分為對內服務通訊和對外服務通訊。此文主要是針對內部通訊。
三.環境
a.win7華碩本
b.eclipse+maven+git
四.let's do it
1.新建一個maven工程,并創建一個proto文件
helloword.proto文件內容如下
syntax = "proto3";
option java_package = "my.test.grpc_java";
package helloworld;
service HellowordService {
? rpc SayHello (HelloRequest) returns (HelloReply) {
? };
? }
message HelloRequest {
? string name = 1;
}
message HelloReply {
? string message = 1;
}
注:eclipse有protobuff的插件,自己可以安裝。protobuf的語法很簡單,自己可以看看官網
2.在pom.xml中添加依賴和編譯插件
貌似不能加xml串,那就自己去官網上拷吧
https://github.com/grpc/grpc-java/blob/master/README.md
3.依次執行maven-clean,maven-install
執行完后會生成兩個java文件
HelloWorld.java定義了你的請求參數HelloRequest,HelloReply
重要的是HellowordServiceGrpc.java
里面定義了服務器端服務接口以及客戶端的stub
4.實現一個服務端服務實現類
其實這里就是響應請求的邏輯啦,簡單實現如下
public class HelloWordServiceImpl extends HellowordServiceImplBase {
@Override
public void sayHello(HelloRequest request, StreamObserver responseObserver) {
String name= request.getName();
System.out.println(name);
HelloWorld.HelloReply reply = HelloWorld.HelloReply.newBuilder().setMessage(("Hello: " + request.getName())).build();?
? ? responseObserver.onNext(reply);
? ? responseObserver.onCompleted();?
}
}
5.實現一個服務啟動類,它負責監聽請求并把服務實現類添加到服務列表,響應具體的請求并返回結果給調用者
public class HelloWorldServer {
private int port = 9090;
private Server server;
private void start() throws IOException {
server = ServerBuilder.forPort(port).addService(new HelloWordServiceImpl()).build().start();
System.out.println("service start...");
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.err.println("*** shutting down gRPC server since JVM is shutting down");
HelloWorldServer.this.stop();
System.err.println("*** server shut down");
}
});
}
private void stop() {
if (server != null) {
server.shutdown();
}
}
// block 一直到退出程序
private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
public static void main(String[] args) throws IOException, InterruptedException {
final HelloWorldServer server = new HelloWorldServer();
server.start();
server.blockUntilShutdown();
}
}
其中start方法是最重要的,我們看到了里面有一個addService(new HelloWordServiceImpl())操作,玄機就在這里了,現在我們就可以把這個程序跑起來了
起來后,他應該會監聽9090端口的連接,下面應該起一個客戶端來訪問9090端口了,看看是不是我們想要的結果
6.創建客戶端程序并調用相關的服務
我們想做的、能做的不外呼兩件事,
a.連接到服務提供方服務器
b.調用我們想要的服務(方法)
代碼如下:
public class HelloWorldClient {
private final ManagedChannel channel;
private final HellowordServiceGrpc.HellowordServiceBlockingStub blockingStub;
public HelloWorldClient(String host, int port) {
channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext(true).build();
blockingStub = HellowordServiceGrpc.newBlockingStub(channel);
}
public void shutdown() throws InterruptedException {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
public void sayHello(String name) {
HelloWorld.HelloRequest request = HelloWorld.HelloRequest.newBuilder().setName(name).build();
HelloWorld.HelloReply response = blockingStub.sayHello(request);
System.out.println(response.getMessage());
}
public static void main(String[] args) throws InterruptedException {
HelloWorldClient client = new HelloWorldClient("127.0.0.1", 9090);
for (int i = 0; i < 5; i++) {
client.sayHello("world:" + i);
}
client.shutdown();
}
}
7.運行客戶端程序,發起服務調用
得到運行結果如下:
Hello: world:0
Hello: world:1
Hello: world:2
Hello: world:3
Hello: world:4
如您所愿
得到了服務器端的返回消息
到這里,我們的服務提供和服務調用流程就算大功告成了
到這里,應該會有不少人有很多疑問,比如:
服務端添加服務是什么原理,服務端怎么根據客戶端的請求調用正確的服務方法等等
先到這里,下面我們再繼續探索
下一篇應該會說說grpc-gateway,敬請期待