Node 呼叫 dubbo 服務的探索及實踐
2.Dubbo簡介
2.1 什麼是dubbo
Dubbo是一款高效能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。
2.2 流程圖
- Provider : 暴露服務的服務提供方。
- Consumer : 呼叫遠端服務的服務消費方。
- Registry : 服務註冊與發現的註冊中心。
- Monitor : 統計服務的呼叫次調和呼叫時間的監控中心。
- Container : 服務執行容器。
3. 具體實現
3.1 協議選擇
連線個數 | 連線方式 | 傳輸協議 | 傳輸方式 | 序列化 | 適用範圍 | 適用場景 | |
---|---|---|---|---|---|---|---|
dubbo | 單連線 | 長連線 | TCP | NIO 非同步傳輸 | Hessian 二進位制序列化 | 傳入傳出引數資料包較小,消費者比提供者個數多,單一消費者無法壓滿提供者 | 常規遠端服務方法呼叫 |
rmi | 多連線 | 短連線 | TCP | 同步傳輸 | Java 標準二進位制序列化 | 傳入傳出引數資料包大小混合,消費者與提供者個數差不多,可傳檔案。 | 常規遠端服務方法呼叫,與原生RMI服務互操作 |
hessian | 多連線 | 短連線 | HTTP | 同步傳輸 | Hessian二進位制序列化 | 傳入傳出引數資料包較大,提供者比消費者個數多,提供者壓力較大,可傳檔案。 頁面傳輸,檔案傳輸,或與原生hessian服務互操作 | |
http | 多連線 | 短連線 | HTTP | 同步傳輸 | 表單序列化 | 傳入傳出引數資料包大小混合,提供者比消費者個數多,可用瀏覽器檢視,可用表單或URL傳入引數 需同時給應用程式和瀏覽器 JS 使用的服務。 | |
rest | 多連線 | 短連線 | HTTP | 同步傳輸 | 表單序列化 | 同http,適用於更加符合rest規範的服務 | 同http |
3.2 如何引用服務
目前引用服務有兩個方案,分別是
- 直接引用
- 通過註冊中心引用服務
3.2.1 直接引用服務
直接引用服務,顧名思義就是繞開註冊中心獲取我們所想要的服務提供者,由於繞開了註冊中心,自然也無法做到服務發現,而且由於單點問題,無法做到負載均衡以及高可用, 所以生產環境不推薦使用此模式的
.
但是由於其開發上的便利性,在開發環境/測試環境仍可以嘗試使用此模式.
由上圖所示,開發同學聯調過程中,需要在專案工程中對指定服務開發同學的機器進行直連,而其他沒有指定的服務將會預設走註冊中心.為了避免對工程程式碼的侵入性,我們會在工程中建立應對不同環境的dubbo.properies,而dubbo.properies不會加入到工程的版本控制當中,主要用於解決不同環境下的服務直連問題.其中服務的控制粒度可以精確到具體的服務.
3.2.2 通過註冊中心引用服務
通過註冊中心發現引用服務,Dubbo常用的引用服務方式,可以做到服務自動發現,負載均衡.正式環境呼叫基本基於此模式.其中註冊中心實現有很多種,例如Zookeeper/Redis/Multicast.官方推薦Zookeeper.
3.3 服務請求結構的定義
服務請求體結構,是在對dubbo在註冊中心上註冊資訊的抽象之後的一層封裝,一方面可以提升開發人員的開發效率,另外降低開發人員自身手動拼接請求的錯誤率.
3.3.1 服務的構成
基於上述基於協議所分析,我們目前協議將只會鎖定在dubbo/rest,那麼我們先看來這兩個協議在註冊中心註冊的資訊是什麼樣子的.
dubbo://192.168.1.2:10880/com.service.ProductService?dubbo=2.8&methods=getById,getByName rest://192.168.1.2:10081/service/com.service.ProductService?dubbo=2.8&methods=getById,getByName
我們對這兩個協議公共部分進行提取一下
dubbo:// com.service.ProductService
3.3.2 請求體的定義
基於上述服務結構構成的分析,dubbo和rest服務請求結構構成大體類似,我們對不同的協議請求的可以做如下定義.
// 1. dubbo協議的請求體定義 services.ProductService = (dubbo) => dubbo.proxyService({ dubboInterface: 'com.service.ProductService', methods: { getById(id) { return [java.Long(id)]; }, getByName(name) { return [java.String(name)]; } }, }); 複製程式碼
// rest 請求體定義 services.ProductService = (dubbo) => dubbo.proxyService({ dubboInterface: 'com.service.ProductService', methods: { getById(id) { return { method: 'get', query: [parseInt(id)] }; }, getByName(name) { return [String(name)]; } }, }); 複製程式碼
兩者最大不同點在於引數定義上的不同,dubbo需要強制轉換為強型別,而rest不需要.
3.4 服務定義的維護
我們在對服務定義完成之後,接下來就會面臨一個使用上的問題,最直接的方法就是為每個工程每個服務新建一個服務檔案,但是一用就會發現一個問題請求定義的檔案分散在不同工程,無法進行統一維護升級,維護成本較高.
我們第一個反應是每個服務抽象出來,各自成為一個獨立的NPM包,譬如MemberService我們可以抽象成為 @dubbo-service/member-service
,這樣就可以解決檔案分散在不同工程導致的維護問題.
相關推薦
Node 呼叫 dubbo 服務的探索及實踐
開發十年,就只剩下這套架構體系了! >>>
呼叫Dubbo服務報以下錯誤(com.alibaba.dubbo.remoting.RemotingException),問題原因和解決辦法
2017-04-19 23:41:48,333 ERROR [com.alibaba.dubbo.remoting.transport.AbstractClient] - [DUBBO] Failed to start NettyClient LX-20161101CZV
命令列呼叫dubbo服務
檢視服務呼叫次數,不過比較奇怪的是,我剛才已經呼叫過一次queryDemoPageList了,而這裡顯示的為0(貌似不太準,有待進一步瞭解) dubbo>count com.test.DemoService dubbo> +----------------------
微服務探索與實踐—服務註冊與發現
直接 註冊表 服務發現 動態配置 bubuko 添加 容災 負載均衡策略 life 前言 微服務從大規模使用到現在已經有很多年了,從之前的探索到一步步的不斷完善與成熟,微服務已經成為眾多架構選擇中所必須面對的一個選項。服務註冊與發現是相輔相成的,所以一般會合起來思索。其
微服務-springCloud快速實踐2:服務監控、熔斷器監控及zipkin呼叫鏈
springCloud快速實踐2:服務監控、熔斷器監控及zipkin呼叫鏈 完整程式碼下載連結: https://github.com/2010yhh/springCloud-demos.git 環境 idea2018,jdk1.8, springboot版
微服務架構與實踐及雲原生等相關概念
定時 服務器端 body 內容 開放封閉原則 logs 方法 服務架構 binding 微服務架構與實踐 筆記:《微服務架構與實踐》 王磊 著 一 單塊架構 1 定義:對於這種功能集中、代碼和數據中心化、一個發布包、部署後運行在同一進程的應用程序,我們通常稱之為單塊架構
MQTT協議學習及實踐(Linux服務端,Android客戶端的例子)
nbsp hub 設備 log config cati href 10.10.4 rmi 前言 MQTT(Message Queuing Telemetry Transport),是一個物聯網傳輸協議,它被設計用於輕量級的發布/訂閱式消息傳輸,旨在為低帶寬和不穩定
jenkins+gitlab自動化編譯部署方案探索及服務端編譯webpack實戰
width 代碼量 條件 correct parameter 錯誤 req 格式 提前 一. 背景 之前我們的開發流程為在本地進行webpack打包編譯,然後svn提交源代碼和編譯後的代碼。同時每次提交前也會從svn更新源代碼和編譯後的代碼。這樣做有幾個缺點: 1. s
Dubbo服務呼叫Failed to invoke the method錯誤記錄
Dubbo服務呼叫Failed to invoke the method錯誤記錄 在開發過程中我遇到一個問題: 一個多模組專案,服務與應用之間採用dubbo進行呼叫,啟動服務後用瀏覽器訪問一切都好,但當採用fiddler進行模擬外系統請求時卻死活調不通,報錯如下: [ERR
使用PHP和Node.js連線dubbo服務
使用PHP和Node.js連線dubbo服務 DUBBO是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,是阿里巴巴SOA服務化治理方案的核心框架,每天為2,000+個服務提供3,000,000,000+次訪問量支援,並被廣泛應用於阿里巴巴集團的各成
Dubbo服務治理框架深入學習及面試題
Dubbo概述 Dubbo的背景 隨著網際網路的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。 單一應用架構 當網站流量很小時,只需
Dubbo服務呼叫原理
服務呼叫原理 引用服務 最終,建立一個代理物件 InvokerInvocationHandler Invoke,是一層一層封裝的結果 invoker.invoke 執行 MockClusterInvoker invok
【Node.js+Express微信公眾號開發】第一步:服務搭建及微信接入
一、前言 此前微信開發,都比較依賴後端。然而有時候後端小夥伴特別忙,最近又學習了一下node的基礎知識,索性就想著自己用node整一遍。 本教程環境為linux系統centOs7系統 二、準備工作 1. 伺服器 伺服器我使用的是搬瓦工的,目前19.9美元那款,網上有
dubbo服務的配置與使用,以及怎麼在呼叫本地的dubbo服務。
隨著專案的精分,以及小型化,一個大的專案會被拆分為數個小而精簡的專案。會分為前端專案,介面專案以及服務專案等等。那麼前端介面怎麼來呼叫其他的服務專案呢,這時就需要用到dubbo服務來呼叫這些服務。 2.在使用dub
IM開發基礎知識補課(三):快速理解服務端資料庫讀寫分離原理及實踐建議
1、前言 IM應用從服務端資料的角度來看,它是一種很特殊的應用場景,拋開基礎資料、增值業務和附屬功能不談,單從IM聊天工具的立身之本——聊天資料來說,理論上是不需要在服務端儲存的(或者說只需要短暫儲存——比如離線訊息,上線即拉走),這也是為什麼微信在前段時間號稱絕不儲存使用
一個電商專案的Web服務化改造7 Dubbo服務的呼叫 4個專案
使用dubbo服務的過程,很簡單,和之前學習的WebService完全一樣,和本地介面呼叫也基本一致。 dubbo和WebService的區別:我認為dubbo就是封裝了WebService,然後提供了更多的配套功能。看jar包依賴,dubbo依賴的WebService。(青出於藍,而勝於藍。冰,水為之
使用Zipkin和Brave 實現dubbo服務呼叫跟蹤
git專案地址:https://github.com/blacklau/http-dubbo-zipkin(點選開啟連結),請下載使用。 本工程通過模擬訂單詳情的查詢,演示系統的呼叫鏈跟蹤,跟蹤資訊包括呼叫服務及請求引數。 涉及的各工程作用: louie-webap
基於 PhantomJS + Node + Express + VueJS 1.x 的服務端渲染實踐
專案地址:github.com/jrainlau/vu… 隨著Vue 2.0的釋出,服務端渲染一度成為了它的熱賣點。在此之前,單頁應用的首屏載入時長和SEO的問題,一直困擾著開發者們,也在一定程度上制約著前端框架的使用場景。React提出的服務端渲染方案,較好得解決了上述兩個痛點
dubbo服務的 遠端呼叫
首先dubbo 和spring 是無縫整合的,先看下配置檔案 提供端的,<!-- 具體的實現bean --> <bean id="testService" class="com.dubbo.provider.impl.TetsServiceImpl" /&g
winform呼叫wcf服務遇到的問題及解決方案
一直都是用web掉用wcf服務的,前幾天公司要做一個自動測試的工具,需要在測試環境用winform呼叫測試的wcf服務,於是像web專案一樣,照常引用了wcf服務引用和公用dll。 開發自己測試 都沒有問題。於是WCF提交測試環境,於是問題來了 ,相同的winform專案呼