1. 程式人生 > >Node 呼叫 dubbo 服務的探索及實踐

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專案呼