摘要:插畫牛肉框架小怪獸的電報員一旦系統怪物被拆分成了多個服務小怪獸,小怪獸們如何溝通協作就成了我們最關心的問題。插畫牛肉實現客戶端小怪獸發送今晚的月色真美,服務端小怪獸收到電報內容,并回復。
作者:亞瑟、文遠
1. 微服務框架 -- 從系統怪物到服務小怪獸一個小巧的單體應用會隨著公司業務的擴張而慢慢成長,逐漸演化成一個龐大且復雜的系統怪物,系統任何一處的問題都將影響整個怪物的表現,很少有多帶帶的開發者能理清系統怪物所有的肌理脈絡,導致bug的定位和新功能的擴展都變得越來越困難,對系統的任一改動都要求整個怪物一起回歸測試并重新部署,效率必然不高。所以公司發展到了一定階段,總會需要從架構上尋找解決系統怪物之道,而微服務就是目前最流行的架構方案之一,它將系統怪物拆分成多個獨立自治的服務小怪獸,讓我們有能力分而治之。
插畫:牛肉
一旦系統怪物被拆分成了多個服務小怪獸,小怪獸們如何溝通協作就成了我們最關心的問題。服務小怪獸間的通信就好像發電報一樣,涉及到數據序列化、反序列化、連接管理、收發線程、超時處理等多個問題,RPC框架的出現解決了這些問題,就好像通過電報員發電報一樣,使用RPC框架讓小怪獸們不必關心通信的底層細節。
插畫:牛肉
服務消費方(小怪獸A)以本地調用方式調用服務
client stub(小怪獸A的電報員)接受到調用后負責將方法、參數等編碼成能夠進行網絡傳輸的消息體(電報)
client stub(小怪獸A的電報員)找到服務地址,并將消息發送到服務端
server stub(小怪獸B的電報員)收到消息(電報)后進行解碼
server stub(小怪獸B的電報員)根據解碼結果調用本地的服務(小怪獸B)
本地服務(小怪獸B)執行并將結果返回給server stub(小怪獸B的電報員)
server stub(小怪獸B的電報員)將結果編碼成消息(電報)并發送至客戶端
client stub(小怪獸A的電報員)接受到消息(電報)并進行解碼
服務消費方(小怪獸A)得到最終的結果
3. gRPC -- 這位電報員是語言天才如果通信的小怪獸們語言不通,那么我們需要對電報員(亦即RPC框架)的人選提出更高的要求,無論小怪獸們用的是什么語言,協助通信的兩位電報員都必須把它們的話翻譯成電報員彼此能理解的同一種語言,亦即IDL(Interface Description Language),是的,電報員在這種情況下還必須承擔翻譯的角色,而gRPC就是一位如此優秀的電報員。
插畫:牛肉
實現Node客戶端小怪獸發送"今晚的月色真美",Java服務端小怪獸收到電報內容,并回復"I love you too"。
通過Spring Boot創建Java項目,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服務接口,相關代碼會生成到配置對應的路徑下
mvn clean install
?
實現IDL定義的Java服務接口
public class TelegraphGreeterImpl extends TelegraphServiceGrpc.TelegraphServiceImplBase { @Override public void sayLove(LoveRequest request, StreamObserverresponseObserver) { System.out.println("收到Node小怪獸的消息:"+request.getMessage()); responseObserver.onNext(LoveReply.newBuilder().setMessage("I Love U Too").build()); //結束 responseObserver.onCompleted(); } }
編寫并啟動Java服務端
public class GrpcServer { /** GRPC 服務端 */ private Server server; public static void main(String[] args) throws IOException, InterruptedException { GrpcServer grpcService = new GrpcServer(); grpcService.start(); System.out.println("GRPC 服務端啟動成功"); //GRPC 服務端需要手動阻塞線程 grpcService.waitTermination(); } private void start() throws IOException { //綁定接口、啟動服務 this.server = ServerBuilder.forPort(8899) .addService(new TelegraphGreeterImpl()) .build() .start(); System.out.println("server start!"); //這里是為了防止jvm關閉了,但是tcp還沒有關閉的情況 Runtime.getRuntime().addShutdownHook(new Thread(()->{ System.out.println("關閉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(); } } }
?
編寫并啟動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服務端收到消息并回復
?
Nodejs客戶端收到Java服務端的回復
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74701.html
摘要:所以,哪怕是初學者,都要了解并能夠解決字符編碼問題。在這個世界上,有好多不同的字符編碼。目前最新的版本為,已收入超過十萬個字符第十萬個字符在年獲采納。涵蓋的數據除了視覺上的字形編碼方法標準的字符編碼外,還包含了字符特性,如大小寫字母。 字符編碼,在編程中,是一個讓學習者比較郁悶的東西,比如一個str,如果都是英文,好說多了。但恰恰不是如此,中文是我們不得不用的。所以,哪怕是初學者,都要...
摘要:公元前年,在雅典附近的馬拉松海邊,發生了波斯和希臘之間的希波戰爭。因為電報員要熟記每一個字母對應的摩爾斯電碼,并且需要快速按鍵來進行輸入。 showImg(https://image-static.segmentfault.com/548/184/548184927-5d5962191cbce_articlex); 人用紙和筆來做運算,都是用十進制,直接用十進制和我們最熟悉的符號不是最...
摘要:月日發生了許多關鍵事件,西門子的建立面向對象編程之父英特爾和之父的出生喬布斯推出語言之父的逝世,無一不在影響著今天的科技進程。年月日,達爾在與淋巴癌的長期斗爭中逝世,享年歲。年月日,英特爾公司公告稱,公司前保羅歐德寧在睡夢中去世,享年歲。 ...
摘要:因為自己在學校還有些事情,不知道具體哪天回家,于是就自己寫了一個監控的小程序一功能命令行輸入火車站名和日期,修改查詢周期定時器時間,即可實現周期性的余票查詢并用郵件通知二流程概述命令行輸入信息利用信息,發起請求,查詢余票信息使用模塊來發送郵 因為自己在學校還有些事情,不知道具體哪天回家,于是就自己寫了一個監控的小程序 一.功能: 命令行輸入火車站名和日期,修改查詢周期(定時器時間),即...
摘要:原文鏈接寫一個專門用于搭建代理的腳本支持版本如何使用復制到服務器中自動編譯安裝輸入用于客服端連接的端口號可以直接自動生成輸入一個位進制的密碼用于客服端用來驗證服務器,回車自動生成完成安裝客服端鏈接到代理服務器可以手動輸入地址,端口 原文鏈接 https://github.com/shellhub/b... 寫一個專門用于搭建Telegram代理MTProxy的腳本 https://gi...
閱讀 1721·2021-11-22 15:33
閱讀 2097·2021-10-08 10:04
閱讀 3549·2021-08-27 13:12
閱讀 3425·2019-08-30 13:06
閱讀 1474·2019-08-29 16:43
閱讀 1399·2019-08-29 16:40
閱讀 790·2019-08-29 16:15
閱讀 2749·2019-08-29 14:13