成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

gRPC實(shí)現(xiàn)跨語言的微服務(wù)間通信 -- 精通外語的電報(bào)員與煲電報(bào)粥的小怪獸

waltr / 2009人閱讀

摘要:插畫牛肉框架小怪獸的電報(bào)員一旦系統(tǒng)怪物被拆分成了多個(gè)服務(wù)小怪獸,小怪獸們?nèi)绾螠贤▍f(xié)作就成了我們最關(guān)心的問題。插畫牛肉實(shí)現(xiàn)客戶端小怪獸發(fā)送今晚的月色真美,服務(wù)端小怪獸收到電報(bào)內(nèi)容,并回復(fù)。

作者:亞瑟、文遠(yuǎn)

1. 微服務(wù)框架 -- 從系統(tǒng)怪物到服務(wù)小怪獸

一個(gè)小巧的單體應(yīng)用會(huì)隨著公司業(yè)務(wù)的擴(kuò)張而慢慢成長,逐漸演化成一個(gè)龐大且復(fù)雜的系統(tǒng)怪物,系統(tǒng)任何一處的問題都將影響整個(gè)怪物的表現(xiàn),很少有多帶帶的開發(fā)者能理清系統(tǒng)怪物所有的肌理脈絡(luò),導(dǎo)致bug的定位和新功能的擴(kuò)展都變得越來越困難,對(duì)系統(tǒng)的任一改動(dòng)都要求整個(gè)怪物一起回歸測(cè)試并重新部署,效率必然不高。所以公司發(fā)展到了一定階段,總會(huì)需要從架構(gòu)上尋找解決系統(tǒng)怪物之道,而微服務(wù)就是目前最流行的架構(gòu)方案之一,它將系統(tǒng)怪物拆分成多個(gè)獨(dú)立自治的服務(wù)小怪獸,讓我們有能力分而治之。


插畫:牛肉

2. RPC框架 -- 小怪獸的電報(bào)員

一旦系統(tǒng)怪物被拆分成了多個(gè)服務(wù)小怪獸,小怪獸們?nèi)绾螠贤▍f(xié)作就成了我們最關(guān)心的問題。服務(wù)小怪獸間的通信就好像發(fā)電報(bào)一樣,涉及到數(shù)據(jù)序列化、反序列化、連接管理、收發(fā)線程、超時(shí)處理等多個(gè)問題,RPC框架的出現(xiàn)解決了這些問題,就好像通過電報(bào)員發(fā)電報(bào)一樣,使用RPC框架讓小怪獸們不必關(guān)心通信的底層細(xì)節(jié)。


插畫:牛肉

RPC調(diào)用細(xì)節(jié)

服務(wù)消費(fèi)方(小怪獸A)以本地調(diào)用方式調(diào)用服務(wù)

client stub(小怪獸A的電報(bào)員)接受到調(diào)用后負(fù)責(zé)將方法、參數(shù)等編碼成能夠進(jìn)行網(wǎng)絡(luò)傳輸?shù)南Ⅲw(電報(bào))

client stub(小怪獸A的電報(bào)員)找到服務(wù)地址,并將消息發(fā)送到服務(wù)端

server stub(小怪獸B的電報(bào)員)收到消息(電報(bào))后進(jìn)行解碼

server stub(小怪獸B的電報(bào)員)根據(jù)解碼結(jié)果調(diào)用本地的服務(wù)(小怪獸B)

本地服務(wù)(小怪獸B)執(zhí)行并將結(jié)果返回給server stub(小怪獸B的電報(bào)員)

server stub(小怪獸B的電報(bào)員)將結(jié)果編碼成消息(電報(bào))并發(fā)送至客戶端

client stub(小怪獸A的電報(bào)員)接受到消息(電報(bào))并進(jìn)行解碼

服務(wù)消費(fèi)方(小怪獸A)得到最終的結(jié)果

3. gRPC -- 這位電報(bào)員是語言天才

如果通信的小怪獸們語言不通,那么我們需要對(duì)電報(bào)員(亦即RPC框架)的人選提出更高的要求,無論小怪獸們用的是什么語言,協(xié)助通信的兩位電報(bào)員都必須把它們的話翻譯成電報(bào)員彼此能理解的同一種語言,亦即IDL(Interface Description Language),是的,電報(bào)員在這種情況下還必須承擔(dān)翻譯的角色,而gRPC就是一位如此優(yōu)秀的電報(bào)員。


插畫:牛肉

4. gRPC Demo

實(shí)現(xiàn)Node客戶端小怪獸發(fā)送"今晚的月色真美",Java服務(wù)端小怪獸收到電報(bào)內(nèi)容,并回復(fù)"I love you too"。

通過Spring Boot創(chuàng)建Java項(xiàng)目,pom.xml中加入如下依賴


    
        org.springframework.boot
        spring-boot-starter
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    
    
        io.grpc
        grpc-netty-shaded
        1.21.0
    
    
        io.grpc
        grpc-protobuf
        1.21.0
    
    
        io.grpc
        grpc-stub
        1.21.0
    



    
        
            kr.motd.maven
            os-maven-plugin
            1.5.0.Final
        
    
    
        
            org.xolstice.maven.plugins
            protobuf-maven-plugin
            0.5.1
            
                com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier}
                grpc-java
                io.grpc:protoc-gen-grpc-java:1.21.0:exe:${os.detected.classifier}
                
                src/main/java
                
                false
            
            
                
                    
                        compile
                        compile-custom
                    
                
            
        
        
            org.springframework.boot
            spring-boot-maven-plugin
        
    

定義IDL文件

syntax = "proto3";

option java_multiple_files = true;
option java_package = "net.changjinglu.proto";
option java_outer_classname = "TelegraphProto";

package telegraph;

// The greeting service definition.
service TelegraphService {
    // Sends a greeting
    rpc SayLove (LoveRequest) returns (LoveReply) {}
}

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

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

編譯生成IDL定義的Java服務(wù)接口,相關(guān)代碼會(huì)生成到配置對(duì)應(yīng)的路徑下

mvn clean install


?

實(shí)現(xiàn)IDL定義的Java服務(wù)接口

public class TelegraphGreeterImpl extends TelegraphServiceGrpc.TelegraphServiceImplBase {

    @Override
    public void sayLove(LoveRequest request, StreamObserver responseObserver) {
        System.out.println("收到Node小怪獸的消息:"+request.getMessage());

        responseObserver.onNext(LoveReply.newBuilder().setMessage("I Love U Too").build());

        //結(jié)束
        responseObserver.onCompleted();
    }
}

編寫并啟動(dòng)Java服務(wù)端

public class GrpcServer {

    /** GRPC 服務(wù)端 */
    private Server server;

    public static void main(String[] args) throws IOException, InterruptedException {
        GrpcServer grpcService = new GrpcServer();

        grpcService.start();
        System.out.println("GRPC 服務(wù)端啟動(dòng)成功");

        //GRPC 服務(wù)端需要手動(dòng)阻塞線程
        grpcService.waitTermination();


    }

    private void start() throws IOException {
        //綁定接口、啟動(dòng)服務(wù)
        this.server = ServerBuilder.forPort(8899)
                .addService(new TelegraphGreeterImpl())
                .build()
                .start();

        System.out.println("server start!");

        //這里是為了防止jvm關(guān)閉了,但是tcp還沒有關(guān)閉的情況
        Runtime.getRuntime().addShutdownHook(new Thread(()->{
            System.out.println("關(guān)閉jvm");
            GrpcServer.this.stop();
        }));
    }

    private void stop() {
        if (this.server != null) {
            this.server.shutdown();
        }
    }

    private void waitTermination() throws InterruptedException {

        if (this.server != null) {
            server.awaitTermination();
        }
    }
}


?

編寫并啟動(dòng)Nodejs客戶端,客戶端使用相同的IDL

var PROTO_FILE_PATH = "/Users/wenyuan/Nodejs/grpc/proto/telegraph.proto";
var grpc = require("grpc");
var grpcService = grpc.load(PROTO_FILE_PATH).telegraph;


function main() {
    var stub = new grpcService.TelegraphService("localhost:8899",grpc.credentials.createInsecure());

    stub.sayLove({message:"今晚的月色真美"},function (error, result) {
        console.log("收到Java小怪獸的消息: " + result.message);
    });
}

main();

Java服務(wù)端收到消息并回復(fù)

?

Nodejs客戶端收到Java服務(wù)端的回復(fù)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74701.html

相關(guān)文章

  • [零基礎(chǔ)學(xué)Python]坑爹字符編碼

    摘要:所以,哪怕是初學(xué)者,都要了解并能夠解決字符編碼問題。在這個(gè)世界上,有好多不同的字符編碼。目前最新的版本為,已收入超過十萬個(gè)字符第十萬個(gè)字符在年獲采納。涵蓋的數(shù)據(jù)除了視覺上的字形編碼方法標(biāo)準(zhǔn)的字符編碼外,還包含了字符特性,如大小寫字母。 字符編碼,在編程中,是一個(gè)讓學(xué)習(xí)者比較郁悶的東西,比如一個(gè)str,如果都是英文,好說多了。但恰恰不是如此,中文是我們不得不用的。所以,哪怕是初學(xué)者,都要...

    rozbo 評(píng)論0 收藏0
  • 重學(xué)計(jì)算機(jī)組成原理(十一)- 門電路"千里傳音"

    摘要:公元前年,在雅典附近的馬拉松海邊,發(fā)生了波斯和希臘之間的希波戰(zhàn)爭。因?yàn)殡妶?bào)員要熟記每一個(gè)字母對(duì)應(yīng)的摩爾斯電碼,并且需要快速按鍵來進(jìn)行輸入。 showImg(https://image-static.segmentfault.com/548/184/548184927-5d5962191cbce_articlex); 人用紙和筆來做運(yùn)算,都是用十進(jìn)制,直接用十進(jìn)制和我們最熟悉的符號(hào)不是最...

    Shihira 評(píng)論0 收藏0
  • 【歷史上今天】10 月 12 日:C 語言之父逝世;西門子誕生;喬布斯推出 NeXT 電腦

    摘要:月日發(fā)生了許多關(guān)鍵事件,西門子的建立面向?qū)ο缶幊讨赣⑻貭柡椭傅某錾鷨滩妓雇瞥稣Z言之父的逝世,無一不在影響著今天的科技進(jìn)程。年月日,達(dá)爾在與淋巴癌的長期斗爭中逝世,享年歲。年月日,英特爾公司公告稱,公司前保羅歐德寧在睡夢(mèng)中去世,享年歲。 ...

    Neilyo 評(píng)論0 收藏0
  • 用Node.js查詢余票信息并用郵件通知

    摘要:因?yàn)樽约涸趯W(xué)校還有些事情,不知道具體哪天回家,于是就自己寫了一個(gè)監(jiān)控的小程序一功能命令行輸入火車站名和日期,修改查詢周期定時(shí)器時(shí)間,即可實(shí)現(xiàn)周期性的余票查詢并用郵件通知二流程概述命令行輸入信息利用信息,發(fā)起請(qǐng)求,查詢余票信息使用模塊來發(fā)送郵 因?yàn)樽约涸趯W(xué)校還有些事情,不知道具體哪天回家,于是就自己寫了一個(gè)監(jiān)控的小程序 一.功能: 命令行輸入火車站名和日期,修改查詢周期(定時(shí)器時(shí)間),即...

    tuomao 評(píng)論0 收藏0
  • Telegram(電報(bào))代理MTproxy一鍵腳本

    摘要:原文鏈接寫一個(gè)專門用于搭建代理的腳本支持版本如何使用復(fù)制到服務(wù)器中自動(dòng)編譯安裝輸入用于客服端連接的端口號(hào)可以直接自動(dòng)生成輸入一個(gè)位進(jìn)制的密碼用于客服端用來驗(yàn)證服務(wù)器,回車自動(dòng)生成完成安裝客服端鏈接到代理服務(wù)器可以手動(dòng)輸入地址,端口 原文鏈接 https://github.com/shellhub/b... 寫一個(gè)專門用于搭建Telegram代理MTProxy的腳本 https://gi...

    suosuopuo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<