Java系統和PHP系統相互調用

来源:https://www.cnblogs.com/thinkam/archive/2018/11/27/10027709.html
-Advertisement-
Play Games

一、HTTP JSON方式的缺點 1. JSON序列化效率低 2. 多語言服務治理功能低 二、關於RPC框架 RPC 框架大致分為兩類,一種是偏重服務治理,另一種側重跨語言調用 2.1 服務治理型 特點 功能豐富,提供高性能的遠程調用、服務發現及服務治理能力,適用於大型服務的服務解耦及服務治理,對於 ...


一、HTTP JSON方式的缺點

  1. JSON序列化效率低
  2. 多語言服務治理功能低

二、關於RPC框架

RPC 框架大致分為兩類,一種是偏重服務治理,另一種側重跨語言調用

2.1 服務治理型

特點

功能豐富,提供高性能的遠程調用、服務發現及服務治理能力,適用於大型服務的服務解耦及服務治理,對於特定語言(Java)的項目可以實現透明化接入。缺點是語言耦合度較高,跨語言支持難度較大。

常用框架

  • Dubbo
  • Motan

2.2 跨語言調用型

特點

側重於服務的跨語言調用,能夠支持大部分的語言進行語言無關的調用,非常適合多語言調用場景。但這類框架沒有服務發現相關機制,實際使用時需要代理層進行請求轉發和負載均衡策略控制。

常用框架

  • Thrift
  • gRPC

三、如何提供服務給PHP系統

Dubbo(阿裡開源)

3.1 Dubbo + dubbo-php-framework

特點

可以實現php調用php,php調用java(dubbo),java(dubbo)調用php,Java調Java,真正的跨語言

缺點

開發活躍程度極低,社區小,資料少,沒有release版本

3.2 Dubbo Restful(合併自Dubbox)

特點

顯著簡化企業內部的異構系統之間的(跨語言)調用。
服務消費場景:

  1. 非dubbo的消費端調用dubbo的REST服務(non-dubbo --> dubbo)
  2. dubbo消費端調用dubbo的REST服務 (dubbo --> dubbo)
  3. dubbo的消費端調用非dubbo的REST服務 (dubbo --> non-dubbo)
問題
  1. Dubbo REST的服務能和Dubbo註冊中心、監控中心集成嗎?

    可以的,而且是自動集成的,也就是你在dubbo中開發的所有REST服務都會自動註冊到服務冊中心和監控中心,可以通過它們做管理。
    但是,只有當REST的消費端也是基於dubbo的時候,註冊中心中的許多服務治理操作才能完全起作用。而如果消費端是非dubbo的,自然不受註冊中心管理,所以其中很多操作是不會對消費端起作用的。

  2. Dubbo REST中如何實現負載均衡和容錯(failover)?

    如果dubbo REST的消費端也是dubbo的,則Dubbo REST和其他dubbo遠程調用協議基本完全一樣,由dubbo框架透明的在消費端做load balance、failover等等。
    如果dubbo REST的消費端是非dubbo的,甚至是非java的,則最好配置服務提供端的軟負載均衡機制,目前可考慮用LVS、HAProxy、 Nginx等等對HTTP請求做負載均衡。

montan(微博開源)

3.3 motan + motan-php

Java系統使用motan提供服務,php系統使用Motan-PHP(PHP client)調用服務。

特點

motan暫不支持以服務註入方式引用yar 服務(使用motan作為yar client)。
目前yar協議主要解決java與php互通的問題,當java作為服務端,php作為client端,php可以在不做任何修改的情況下通過yar 協議使用java的服務。
而使用php做server、java做client的場景下(一般這種場景比較少),php的yar server不支持註冊服務等功能,所以java作為client 時也沒有必要通過motan調用服務。yarclient是個單獨的小模塊,是個類似httpclient這樣的簡易客戶端,只能通過功能變數名稱或ip訪問yar服務。

缺點

只支持PHP系統調用Java系統,沒有stable release版本,文檔很少,社區小,開發活躍程度低。整體不如Dubbo+dubbo-php-framework方式

3.4 motan Restful

模仿Dubbo Restful,很類似,從文檔上對比,不如Dubbo Restful

3.5 Client + Agent(還未完全開源)

大概是使用motan + motan-go(agent)等實現。朝著weibo mesh的服務化方向,將 Motan Agent定位為統一服務管理的執行節點。

實現方式

為不同語言提供非常輕量的 Client,只實現與 Agent 的交互和必要的請求序列化能力;提供一個 local 的 Agent 代理,能夠提供不同 RPC 協議交互能力,以及統一的服務治理能力與標準,服務治理的絕大部分功能都在語言無關的 Agent 中實現。通過使用 Agent,可以為類似 PHP 這樣的解釋型語言提供長鏈接復用能力,提高請求性能。

四、跨語言服務化

阿裡Dubbo和微博motan都稱自己框架有多語言服務化功能,都在開發中,都還不夠成熟

4.1 挑戰

HTTP RESTful API

HTTP 本身就是語言無關的協議,一般由服務提供方與使用方通過文檔來進行服務約定。這也是目前使用非常廣泛的跨語言交互方式,HTTP服務的服務治理能力一般依賴於代理層和服務調用方自己實現,一般代理服務需要單獨部署,所有請求流量經由代理服務進行轉發。例如使用 nginx 提供基礎的負載均衡與流量控制等治理能力就是最簡單的跨語言服務治理方案。

HTTP的跨語言服務化,有些方案選擇了為特定語言實現強大服務治理能力,對其他語言提供相容能力,例如Spring Cloud為Java 服務提供完整的服務治理能力,包括服務發現、路由器、過濾器、配置管理、熔斷器等等。但很難為不同語言提供統一的服務治理能力,特別是在 Client 側的一些服務治理能力,不同語言都需要做相同功能的開發。

還有一些方案使用本機代理的方式,例如envoy、linkerd等可以部署到單機的 HTTP 代理服務,在代理服務中集成統一服務發現與治理能力。這種方案能夠做到不同語言的Client和 Server 都提供相同的服務治理能力,但服務治理的功能很難做到前一種方案那麼強大。

RPC

使用 RPC 作為服務調用方式時,跨語言與服務治理也很難同時滿足,對於跨語言型的 RPC 協議,例如 gRPC 等,都能夠提供不同語言交互的能力,但是相關的服務治理功能還沒有那麼完善,做到了’交互’,但還無法做到’治理’。使用跨語言型 RPC 框架時一般會選擇使用 HTTP(HTTP2)作為通信協議,這樣可以直接應用 HTTP 方式的服務治理功能;

對於服務治理型RPC,由於選擇了在 Client 端進行服務發現與治理,如果要實現不同語言統一的服務治理能力,需要在不同語言的一側都實現相同的功能。實現起來也相當的困難。因此大部分服務治理型 RPC 專註與為特定語言提供完善的治理能力。

4.2 方式

1. 相容HTTP協議,增加HTTP RESTful協議

例如Dubbo Restful和motan Restful。這種方案將 Java 語言的 RPC 調用方式與其他語言獨立開來,只針對 Java Server 端提供,沒有為其他語言提供服務治理能力。由於只需要做 Java 協議的開發,這種方案研發和維護成本很低,不過能夠提供的統一服務治理能力就很低了。

2. 為不同語言提供RPC模塊

例如Dubbo + dubbo-php-framework方式。這種方案能做到最貼近不同語言的使用習慣,可以為不同語言提供完全一致的服務治理能力,不論是作為 Server 端還是 Client 端。但這種方式也是成本最高的,包括開發不同語言的版本,以及後續的功能升級與版本維護代價都非常高。

3. 開發一個 Agent 模塊,實現絕大部分的服務治理能力

例如motan Client + Agent方式。Agent在不同服務的Server或Client側運行。然後為不同語言開發一個很輕量的 Client 與 Agent 進行交互,由於 Client 只實現必要的交互功能,降低了不同語言版本的開發量與維護的成本。

五、可考慮的方案

  1. (如果是JSON效率低)考慮使用Google Protocol Buffers, thrift, Hessian等更高效序列化方式。
  2. (如果是服務治理功能低)保持原來HTTP+JSON方式不變,優化服務治理功能
  3. 自己基於已有開源框架二次開發(參考motan Client + Agent思路)
  4. 使用Dubbo Restful

六、參考資料

  1. 微博輕量級RPC框架Motan正式開源:支撐千億調用
  2. 微博開源的Motan RPC最新進展:新增跨語言及服務治理支持
  3. 跨語言統一治理、Golang,談談另闢蹊徑的開源RPC框架Motan
  4. 在Dubbo中開發REST風格的遠程調用(RESTful Remoting)
  5. https://github.com/weibocom/motan/issues/186#issuecomment-243055131
  6. 跨語言統一治理、Golang,談談另闢蹊徑的開源RPC框架Motan

七、其他相關資料

  1. 貝聊系統架構服務化之路
  2. 逆天:蘑菇街下單平臺演進,從PHP到Java
  3. 服務化框架技術選型實踐
  4. 餓了麽分散式服務治理及優化經驗
  5. 微博平臺的RPC服務化實踐
  6. 多語言支持

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用padding-top百分比可以實現寬度固定高度按比例展示,現在的需求是對一個video視頻的盒子div高度是固定的,寬度如何按比例展示? 解決後效果如圖: 紅框標註的即是我在上面高度比例固定的範圍內寬度自適應的效果; css代碼: html: 由於視頻是有寬高比的,這裡給視頻的高度直接是外面盒子 ...
  • 我現在的需求是這樣的,我目前實現了一個div框,顯示文字,超出兩行顯示...,如果單行要保證垂直居中,我如果給容器使用display:flex;align-items:center;則當文字內容過多的時候會不上下文字有截斷; 現在效果如下: 解決方法: display:flex;垂直居中的是裡面元素 ...
  • 最近需要用 nodeJS 寫一個後臺程式,為了能夠獲得 IDE 的更多代碼提示,決定用 typescript 來編寫,隨便也學習下 ts,在這記錄下實現過程。 1、新建文件夾 typescript-koa-postgresql,初始化項目 2、安裝 typescript 3、配置 typescrip ...
  • 一、在所有的項目代碼編寫完成後,react項目直接部署是無法正常訪問的 1、問題一 網頁無法正常的瀏覽器刷新,刷新會報404錯,路由找不到頁面 2、問題二 路由跳轉後,瀏覽器後退按鈕點擊後,頁面不刷新 3、問題三 使用HashRouter的react項目會在路由的時候在路徑上添加/#,所以儘量使用B ...
  • 移動端選擇器picker有很多,各大ui組件都有自己的picker,比如light7,HUI,MUI,jqueryUI等等。但是,我發現他們都有各種各樣的問題。這次的地區選擇,需要地區的省份+市+經緯度,還要設置第一次點開的時候是特定城市。 demo:鏈接:https://pan.baidu.com ...
  • 例子: 頁面效果: 具體方法: 執行後的頁面效果: createDocumentFragment()方法,則是用了創建一個虛擬的節點對象,或者說,是用來創建文檔碎片節點。它可以包含各種類型的節點,在創建之初是空的。DocumentFragment節點不屬於文檔樹,繼承的parentNode屬性總是n ...
  • echarts 真的是個神奇的東西,最近做了一個需要點亮中國的移動端項目,前期就怎樣點亮中國做了調研,發現微博當初炫酷的點亮效果就是用echarts做的,於是研究了一下。 一連研究了一堆demo,不管從官網還是GitHub上面,大多demo的數據都是自己的格式,於是乎根據API自己研究了一下,把de ...
  • 前後端分離的開發模式已經是目前前端的主流模式,至於為什麼會前後端分離的開發我們就不做過多的闡述,既然是前後端分離的模式開發肯定是離不開前端的數據模擬階段。 我們在開發的過程中,由於後臺介面的沒有完成或者沒有穩定之前我們都是採用模擬數據的方式去進行開發項目,這樣會使我們的前後端會同時的進行,提高我們的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...