Grpc-java實踐

一.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,敬請期待

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,758評論 18 399
  • JAVA面試題 1、作用域public,private,protected,以及不寫時的區別答:區別如下:作用域 ...
    JA尐白閱讀 1,182評論 1 0
  • Scala與Java的關系 Scala與Java的關系是非常緊密的!! 因為Scala是基于Java虛擬機,也就是...
    燈火gg閱讀 3,480評論 1 24
  • 上了大三,感覺時間過得飛快,這不,一轉眼一個學期就完事兒了。 身邊的同學也該各自選擇不同的路了。在面臨選擇的時候,...
    者行孫閱讀 296評論 0 0