grpc java 簡(jiǎn)單配置 及實(shí)現(xiàn)流程

gRPC是由Google主導(dǎo)開(kāi)發(fā)的RPC框架余舶,使用HTTP/2協(xié)議并用ProtoBuf作為序列化工具兔簇。其客戶端提供Objective-C发绢、Java接口,服務(wù)器側(cè)則有Java垄琐、Golang边酒、C++等接口,從而為移動(dòng)端(iOS/Androi)到服務(wù)器端通訊提供了一種解決方案狸窘。 當(dāng)然在當(dāng)下的環(huán)境下墩朦,這種解決方案更熱門(mén)的方式是RESTFull API接口。該方式需要自己去選擇編碼方式翻擒、服務(wù)器架構(gòu)氓涣、自己搭建框架(JSON-RPC)。gRPC官方對(duì)REST的聲音是:

和REST一樣遵循HTTP協(xié)議(明確的說(shuō)是HTTP/2)陋气,但是gRPC提供了全雙工流
和傳統(tǒng)的REST不同的是gRPC使用了靜態(tài)路徑劳吠,從而提高性能
用一些格式化的錯(cuò)誤碼代替了HTTP的狀態(tài)碼更好的標(biāo)示錯(cuò)誤

至于是否要選擇用gRPC。對(duì)于已經(jīng)有一套方案的團(tuán)隊(duì)巩趁,可以參考下赴背。如果是從頭來(lái)做,可以考慮下gRPC提供的從客戶端到服務(wù)器的整套解決方案,這樣不用客戶端去實(shí)現(xiàn)http的請(qǐng)求會(huì)話凰荚,JSON等的解析燃观,服務(wù)器端也有現(xiàn)成的框架用。從15年3月到現(xiàn)在gRPC也發(fā)展了一年了便瑟,慢慢趨于成熟缆毁。下面我們就以gRPC的Golang版本看下其在golang上面的表現(xiàn)。至于服務(wù)端的RPC到涂,感覺(jué)golang標(biāo)準(zhǔn)庫(kù)的RPC框架基本夠用了,沒(méi)必要再去用另一套方案脊框。

最近google發(fā)布了grpc1.0,之前一直關(guān)注過(guò)grpc践啄,數(shù)據(jù)交互使用了protocol buffer,相比之前使用的hession和json序列化方式性能應(yīng)該提升不少浇雹,所有先搞一個(gè)grpc的hello world跑一下,項(xiàng)目使用maven搭建,并使用idea開(kāi)發(fā)屿讽。

使用idea創(chuàng)建maven項(xiàng)目昭灵,添加pom配置

<a name="t2"></a>添加grpc1.0 maven依賴


        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>1.0.0</version>
        </dependency>

配置protobuf maven插件

配置了protobuf 插件后,可以自動(dòng)將.proto文件生成對(duì)應(yīng)的java代碼

<build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.4.1.Final</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.0</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

編寫(xiě)proto文件 helloworld.proto

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

編寫(xiě)grpc 服務(wù)端HelloWorldServer.java

package com;

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.examples.helloworld.GreeterGrpc;
import io.grpc.examples.helloworld.HelloReply;
import io.grpc.examples.helloworld.HelloRequest;
import io.grpc.stub.StreamObserver;

import java.io.IOException;

public class HelloWorldServer {


    private int port = 50051;
    private Server server;

    private void start() throws IOException {
        server = ServerBuilder.forPort(port)
                .addService(new GreeterImpl())
                .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();
    }


    // 實(shí)現(xiàn) 定義一個(gè)實(shí)現(xiàn)服務(wù)接口的類(lèi) 
    private class GreeterImpl extends GreeterGrpc.GreeterImplBase {


        public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
            System.out.println("service:"+req.getName());
            HelloReply reply = HelloReply.newBuilder().setMessage(("Hello: " + req.getName())).build();
            responseObserver.onNext(reply);
            responseObserver.onCompleted();
        }
    }
} 

編寫(xiě)grpc 客戶端 HelloWorldClient.java

package com;

import io.grpc.ManagedChannel; 
import io.grpc.ManagedChannelBuilder;
import io.grpc.examples.helloworld.GreeterGrpc; 
import io.grpc.examples.helloworld.HelloReply; 
import io.grpc.examples.helloworld.HelloRequest;
import java.util.concurrent.TimeUnit; 


public class HelloWorldClient {

    private final ManagedChannel channel; 
    private final GreeterGrpc.GreeterBlockingStub blockingStub; 


    public HelloWorldClient(String host,int port){ 
        channel = ManagedChannelBuilder.forAddress(host,port) 
                .usePlaintext(true) 
                .build();

        blockingStub = GreeterGrpc.newBlockingStub(channel); 
    }


    public void shutdown() throws InterruptedException { 
        channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); 
    }

    public  void greet(String name){ 
        HelloRequest request = HelloRequest.newBuilder().setName(name).build(); 
        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",50051);
        for(int i=0;i<5;i++){
            client.greet("world:"+i);
        }


    } 
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伐谈,一起剝皮案震驚了整個(gè)濱河市烂完,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诵棵,老刑警劉巖抠蚣,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異履澳,居然都是意外死亡嘶窄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)距贷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)护侮,“玉大人,你說(shuō)我怎么就攤上這事储耐⊙虺酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵什湘,是天一觀的道長(zhǎng)长赞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)闽撤,這世上最難降的妖魔是什么得哆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮哟旗,結(jié)果婚禮上贩据,老公的妹妹穿的比我還像新娘栋操。我一直安慰自己,他們只是感情好饱亮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布矾芙。 她就那樣靜靜地躺著,像睡著了一般近上。 火紅的嫁衣襯著肌膚如雪剔宪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天壹无,我揣著相機(jī)與錄音葱绒,去河邊找鬼。 笑死斗锭,一個(gè)胖子當(dāng)著我的面吹牛地淀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岖是,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼帮毁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了璧微?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤硬梁,失蹤者是張志新(化名)和其女友劉穎前硫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體荧止,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屹电,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跃巡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片危号。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖素邪,靈堂內(nèi)的尸體忽然破棺而出外莲,到底是詐尸還是另有隱情,我是刑警寧澤兔朦,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布偷线,位于F島的核電站,受9級(jí)特大地震影響沽甥,放射性物質(zhì)發(fā)生泄漏声邦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一摆舟、第九天 我趴在偏房一處隱蔽的房頂上張望亥曹。 院中可真熱鬧邓了,春花似錦、人聲如沸媳瞪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)材失。三九已至痕鳍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間龙巨,已是汗流浹背笼呆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旨别,地道東北人诗赌。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像秸弛,于是被迫代替她去往敵國(guó)和親铭若。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • GRPC是基于protocol buffers3.0協(xié)議的. 本文將向您介紹gRPC和protocol buffe...
    二月_春風(fēng)閱讀 17,977評(píng)論 2 28
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理递览,服務(wù)發(fā)現(xiàn)叼屠,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • gRPC 是由 Google 主導(dǎo)開(kāi)發(fā)的 RPC 框架绞铃,使用 HTTP/2 協(xié)議并用 ProtoBuf 作為序列化...
    angeChen閱讀 3,026評(píng)論 0 6
  • 在這個(gè)人世間镜雨,所有東西都會(huì)隨著時(shí)間的流逝而消失,甚至毀滅儿捧。但唯有母愛(ài)荚坞,它永遠(yuǎn)是那么偉大、無(wú)私菲盾,不會(huì)隨著時(shí)間的流逝而...
    萬(wàn)物菲菲閱讀 236評(píng)論 0 0
  • intuition [?ntj?'??(?)n]perception[p?'sep?(?)n]感覺(jué)comprehe...
    法雲(yún)閱讀 278評(píng)論 0 0