javarpc,javarpc實現負載均衡

本文目錄一覽:

java protobuf 定義rpc服務怎麼調用

1.,選擇其中的win版本下載,我選擇的是protoc-2.4.1-win32.zip

2.下載一個protobuf-java-2.4.1.jar文件(注意,要與你剛才下的proto.exe版本相同)

然後就開始開發了。

步驟:

1.用記事本編寫一個.proto文件:

}如:編寫的是test.proto

package protobuf;

option java_package = “com.sq.protobuf”;

option java_outer_classname = “FirstProtobuf”;

message testBuf {

required int32 ID = 1;

required string Url = 2;

}

將其放在與剛解壓的protoc.exe同級目錄中。

2.在cmd中,到protoc-2.4.1-win32文件夾下,

執行

E:\protoc-2.4.1-win32 protoc.exe –java_out=./ test.proto

則可以找到的一個生成的FirstProtobuf.java文件。

3.在MyEclipse中新建一個java project,建立包com.sq.protobuf,然後將剛才生成的FirstProtobuf.java文件放在其下面。

此時會報錯,因為沒有引入jar包,在package視圖下,將protobuf-java-2.4.1.jar引入,即可解決問題。

Java遠程方法調用(1)

概述 Java Remote Method Invocation ( RMI Java遠程方法調用)允許您使用Java編寫分散式對象 本文將介紹RMI的優點以及如何將其連接到現有的和原有的系統中 以及與用Java 編寫的組件的連接 RMI為採用Java對象的分散式計算提供了簡單而直接的途徑 這些對象可以是新的Java對象 也可以是圍繞現有API的簡單的Java包裝程序 Java體現了 編寫一次就能在任何地方運行的模式 而RMI可將Java模式進行擴展 使之可在任何地方運行 因為RMI是以Java為核心的 所以 它將Java的安全性和可移植性等強大功能帶給了分散式計算 您可將代理和梢?務邏輯等屬性移動到網路中最合適的地方 如果您要擴展Java在系統中的使用 RMI將使您充分利用其強大功能 RMI可利用標準Java本機方法介面JNI與現有的和原有的系統相連接 RMI還可利用標準JDBC包與現有的關係資料庫連接 RMI/JNI和RMI/JDBC相結合 可幫助您利用RMI與目前使用非Java語言的現有伺服器進行通信 而且在您需要時可擴展Java在這些伺服器上的使用 RMI可幫助您在擴展使用時充分利用Java的強大功能 優點 從最基本的角度看 RMI是Java的遠程過程調用(RPC)機制 與傳統的RPC系統相比 RMI具有若干優點 因為它是Java面向對象方法的一部分 傳統的RPC系統採用中性語言 所以是最普通的系統 它們不能提供所有可能的目標平台所具有的功能 RMI以Java為核心 可與採用本機方法與現有系統相連接 這就是說 RMI可採用自然 直接和功能全面的方式為您提供分散式計算技術 而這種技術可幫助您以不斷遞增和無縫的方式為整個系統添加Java功能 RMI的主要優點如下  面向對象 RMI可將完整的對象作為參數和返回值進行傳遞 而不僅僅是預定義的數據類型 也就是說 您可以將類似Java哈希表這樣的複雜類型作為一個參數進行傳遞 而在目前的RPC系統中 您只能依靠客戶機將此類對象分解成基本數據類型 然後傳遞這些數據類型 最後在伺服器端重新創建哈希表 RMI則不需額外的客戶程序代碼(將對象分解成基本數據類型) 直接跨網傳遞對象  可移動屬性 RMI可將屬性(類實現程序)從客戶機移動到伺服器 或者從伺服器移到客戶機 例如 您可以定義一個檢查僱員開支報告的介面 以便察看僱員是否遵守了公司目前實行的政策 在開支報告創建後 客戶機就會從伺服器端獲得實現該介面的對象 如果政策發生變化 伺服器端就會開始返回使用了新政策的該介面的另一個實現程序 您不必在用戶系統上安裝任何新的軟體就能在客戶端檢查限制條件 從而向用戶提供爍?快的反饋 並降低伺服器的工作量 這樣就能具備最大的靈活性 因為政策改變時只需要您編寫一個新的Java類 並將其在伺服器主機上安裝一次即可  設計方式 對象傳遞功能使您可以在分散式計算中充分利用面向對象技術的強大功能 如二層和三層結構系統 如果您能夠傳遞屬性 那麼您就可以在您的解決方案中使用面向對象的設計方式 所有面向對象的設計方式無不依靠不同的屬性來發揮功能 如果不能傳遞完整的對象 包括實現和類型 就會失去設計方式上所提供的優點  安全 RMI使用Java內置的安全機制保證下載執行程序時用戶系統的安全 RMI使用專門為保護系統免遭惡意小應用程序侵害而設計的安全管理程序 可保護您的系統和網路免遭潛在的惡意下載程序的破壞 在情況嚴重時 伺服器可拒絕下載任何執行程序 便於編寫和使用 RMI使得Java遠程服務程序和訪問這些服務程序的Java客戶程序的編寫工作變得輕鬆 簡單 遠程介面實際上就是Java介面 服務程序大約用三行指令宣布本身是服務程序 其它方面則與任何其它Java對象類似 這種簡單方法便於快速編寫完整的分散式對象系統的服務程序 並快速地製做軟體的原型和早期版本 以便於進行測試和評估 因為RMI程序編寫簡單 所以維護也簡單  可連接現有/原有的系統 RMI可通過Java的本機方法介面JNI與現有系統進行進行交互 利用RMI和JNI 您就能用Java語言編寫客戶端程序 還能使用現有的伺服器端程序 在使用RMI/JNI與現有伺服器連接時 您可以有選擇地用Java重新編寫服務程序的任何部分 並使新的程序充分發揮Java的功能 類似地 RMI可利用JDBC 在不修改使用資料庫的現有非Java源代碼的前提下與現有關係資料庫進行交互  編寫一次 到處運行 RMI是Java 編寫一次 到處運行 方法的一部分 任何基於RMI的系統均可 %地移植到任何Java虛擬機上 RMI/JDBC系統也不例外 如果使用RMI/JNI與現有系統進行交互工作 則採用JNI編寫的代碼可與任何Java虛擬機進行編譯 運行  分散式垃圾收集 RMI採用其分散式垃圾收集功能收集不再被網路中任何客戶程序所引用的遠程服務對象 與Java 虛擬機內部的垃圾收集類似 分散式垃圾收集功能允許用戶根據自己的需要定義伺服器對象 並且明確這些對象在不再被客戶機引用時會被刪除  並行計算 RMI採用多線程處理方法 可使您的伺服器利用這些Java線程更好地並行處理客戶端的請求 Java分散式計算解決方案 RMI從JDK 開始就是Java平台的核心部分 因此 它存在於任何一台 Java虛擬機中 所有RMI系統均採用相同的公開協議 所以 所有Java 系統均可直接相互對話 而不必事先對協議進行轉換 lishixinzhi/Article/program/Java/hx/201311/26469

手寫一個RPC框架,看看100個線程同時調用情況如何

簡單的介紹RPC是什麼,RPC整個調用流程是什麼,包含了什麼組件。然後實際編寫一個RPC實例,模擬100個線程調用以驗證RPC的可用性,穩定性等。最後總結自己編寫的RPC框架存在哪些問題,可以去完善的,一個優秀的RPC框架應該必備的功能點。

RPC(Remote Procedure Call),遠程過程調用,可通過網路調用其他機器的服務請求。RPC是一種規範,和TCP、UDP都沒有關係,RCP可以採用TCP協議完成數據傳輸,甚至可以使用HTTP應用協議。RCP是C端模式,包含了服務端(服務提供方)、客戶端(服務使用方),採用特定的網路傳輸協議,把數據按照特定的協議包裝後進行傳輸操作等操作。先來了解下一個具體的RPC調用請求的執行過程

本圖來自網路

這就是一個完整的RPC調用過程,對使用方而言就 只暴露了本地代理對象 ,剩下的數據解析、運輸等都被包裝了,從服務提供方的角度看還有 服務暴露 ,如下圖DUBBO的架構圖。

學習寫RPC之前必須先了解 動態代理 和 反射 這兩個知識點,如不了解先自行了解,本學習筆記不涉及到此內容的介紹。

文件夾目錄

可以很清楚的看到convert方法就是從一個輸入流中讀取出類名稱、方法名等數據,組成一個MethodParameter對象,也就是上面所說的Request

服務暴露存儲了一個 MapString, Object objectMap 對象,所有可對外提供服務的都必須添加到該容器中,以便於收到網路數據後能找到對應的服務,然後採用反射invoke調用,返回得到的結果。

簡單的BIO模型,開啟了一個ServerSocket後,接收到數據後就把套接字丟給一個新的線程處理,ServerSocketRunnable接受一個socket後,解析出MethodParameter這個請求對象,然後調用服務暴露的invoke方法,再寫回到socket傳輸給客戶端

服務使用方需要使用register進行服務的註冊,會生成對應的本地代理對象,後續只需要通過本地代理對象。

代理對象被調用後生成一個MethodParameter對象,通過此IOClient把數據傳輸到服務端,並且返回對應的數據。

服務端

客戶端

測試服務

運行效果

這只是一個非常簡單的RPC實踐,包含了服務暴露、服務註冊(Proxy生成)、BIO模型進行網路傳輸,java默認的序列化方法, 對RPC有一個初步的認識和了解,知道RPC必須包含的模塊 。

不過還是有很多需要優化的點以改進。

還有例如服務統計、優雅下線、負載均衡等也都是一個成熟的RPC框架必須要考慮到的點。

本人微信公眾號(搜索jwfy)歡迎關注

Java開發中消息隊列和rpc框架都是做什麼的?

一,消息隊列服務一般用於設計多系統之間的信息傳輸,一般這種傳輸不需要對方對數據做出回應。它最常見的方式是構建非同步的生產者-消費者模式。我們在系統開發中,有些業務並不需要及時返回結果,我們可以把這些操作放到隊列中,然後另起一個消費者去處理它。比如日誌,資料庫非同步更新。

二,rpc一般是用於伺服器與伺服器進程之間通信,這種通信有請求和應答。它是建立在底層的socket通信之上的。封裝為rpc之後,更加方便建立通信。就像在同一個進程中調用對方的方法一樣。它本地的方法名一般和請求到達的伺服器的方法名一一對應。這樣可以更好的把模塊劃分。所以它是應對分散式而生的。比如一個網站,一開始可能所有的服務在一個進程中,但是隨著業務的增長,一個進程處理不過來,這時就需要把業務拆分成多個,分部到不同的機器上去。

rpc的實現機制是什麼

RPC 的全稱是 Remote Procedure Call 是一種進程間通信方式。它允許程序調用另一個地址空間(通常是共享網路的另一台機器上)的過程或函數,而不用程序員顯式編碼這個遠程調用的細節。即無論是調用本地介面/服務的還是遠程的介面/服務,本質上編寫的調用代碼基本相同。

比如兩台伺服器A,B,一個應用部署在A伺服器上,想要調用B伺服器上應用提供的函數或者方法,由於不在一個內存空間,不能直接調用,這時候需要通過就可以應用RPC框架的實現來解決。

RPC 會隱藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊)

RPC 是一個請求響應模型。客戶端發起請求,伺服器返迴響應(類似於Http的工作方式)

RPC 在使用形式上像調用本地函數(或方法)一樣去調用遠程的函數(或方法)。

二、常見RPC框架

幾種比較典型的RPC的實現和調用框架。

(1)RMI實現,利用java.rmi包實現,基於Java遠程方法協議(Java Remote Method Protocol)

和java的原生序列化。

(2)Hessian,是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能。 基於HTTP協議,採用二進位編解碼。

(3)THRIFT是一種可伸縮的跨語言服務的軟體框架。thrift允許你定義一個描述文件,描述數據類型和服務介面。依據該文件,編譯器方便地生成RPC客戶端和伺服器通信代碼。

二、RPC框架實現原理

在RPC框架中主要有三個角色:Provider、Consumer和Registry。如下圖所示:

RPC框架面試總結-RPC原理及實現

節點角色說明:

* Server: 暴露服務的服務提供方。

* Client: 調用遠程服務的服務消費方。

* Registry: 服務註冊與發現的註冊中心。

三、RPC調用流程

RPC基本流程圖:

RPC框架面試總結-RPC原理及實現

一次完整的RPC調用流程(同步調用,非同步另說)如下:

1)服務消費方(client)調用以本地調用方式調用服務;

2)client stub接收到調用後負責將方法、參數等組裝成能夠進行網路傳輸的消息體;

3)client stub找到服務地址,並將消息發送到服務端;

4)server stub收到消息後進行解碼;

5)server stub根據解碼結果調用本地的服務;

6)本地服務執行並將結果返回給server stub;

7)server stub將返回結果打包成消息並發送至消費方;

8)client stub接收到消息,並進行解碼;

9)服務消費方得到最終結果。

RPC框架的目標就是要2~8這些步驟都封裝起來,讓用戶對這些細節透明。

四、服務註冊發現

RPC框架面試總結-RPC原理及實現

服務提供者啟動後主動向註冊中心註冊機器ip、port以及提供的服務列表;

服務消費者啟動時向註冊中心獲取服務提供方地址列表,可實現軟負載均衡和Failover;

五、使用到的技術

1、動態代理

生成 client stub和server stub需要用到 Java 動態代理技術 ,我們可以使用JDK原生的動態代理機制,可以使用一些開源位元組碼工具框架 如:CgLib、Javassist等。

2、序列化

為了能在網路上傳輸和接收 Java對象,我們需要對它進行 序列化和反序列化操作。

* 序列化:將Java對象轉換成byte[]的過程,也就是編碼的過程;

* 反序列化:將byte[]轉換成Java對象的過程;

可以使用Java原生的序列化機制,但是效率非常低,推薦使用一些開源的、成熟的序列化技術,例如:protobuf、Thrift、hessian、Kryo、Msgpack

關於序列化工具性能比較可以參考:jvm-serializers

3、NIO

當前很多RPC框架都直接基於netty這一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推薦使用Netty 作為底層通信框架。

4、服務註冊中心

可選技術:

* Redis

* Zookeeper

* Consul

* Etcd

java java.lang.Class對象不能用於RPC傳輸嗎

RPC的過程是 傳遞參數 給 遠程的一個進程 執行相應的方法(這裡的遠程是相對的,其實不在同一個進程里,就可以),獲取到一個對象,這中間的問題是,你需要把調用參數傳遞給遠程的進程,但是這些參數是在你本地的內存里,遠程的進程是拿不到你本地的內存信息的,所以這中間 演變出一個 序列化的機制,簡單來說,就是把內存里的數據,變成一種可以傳輸的方式(簡單來說,把內存的狀態用一段數據來表示,這種數據可以是二進位數據,也可以是文本數據,常用的xml,json也是),序列化之後,就可以傳遞給遠程,作為參數,調用遠程的方法,同時 返回的結果也用序列化的方式,返回給本地。 java本身的序列化方式是,需要實現java.io.Serializable 就可以。 查看了下 Class的定義,

public final class ClassT implements java.io.Serializable,

GenericDeclaration,

Type,

AnnotatedElement

Class實現了那個介面,所以可以用來進行RPC傳輸。 這裡需要說明的一點是,序列號的方式其實有很多種,不是所有的序列化方式都需要實現Serializable來序列化,有很多別的方式,是不需要實現Serializable,也可以序列化的。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238443.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:11
下一篇 2024-12-12 12:11

相關推薦

  • 負載均衡伺服器

    一、什麼是負載均衡伺服器 負載均衡伺服器是一種將大型網站(如電子商務)的流量分散到多台伺服器上的技術。當用戶請求的並發量增加時,單個伺服器可能會變得很慢,甚至崩潰。負載均衡器旨在解…

    編程 2025-04-12
  • 微服務負載均衡詳解

    一、微服務負載均衡策略 微服務負載均衡是為了解決單點故障問題,保證系統的高可用性。負載均衡的策略可以分為以下幾種: 1、輪詢策略:按照伺服器列表的順序,依次將請求分配到每個伺服器上…

    編程 2025-01-13
  • java負載均衡,java負載均衡是什麼意思

    本文目錄一覽: 1、java 負載均衡 synchronized是否有效 2、Java 連接多個 mongodb 負載均衡 3、關於java負載均衡的概念 4、Java web項目…

    編程 2025-01-09
  • Dubbo負載均衡詳解

    一、Dubbo負載均衡的幾種方式 Dubbo支持以下幾種負載均衡方式: Random LoadBalance RoundRobin LoadBalance LeastActive …

    編程 2025-01-06
  • 配置NGINX反向代理實現負載均衡

    一、什麼是反向代理與負載均衡 反向代理是指客戶端不是直接向伺服器請求資源,而是向代理伺服器發起請求,代理伺服器再向被請求的伺服器轉發請求並將得到的結果返回給客戶端。通過反向代理,可…

    編程 2025-01-04
  • Nginx配置網路請求轉發與負載均衡

    Nginx是一個高性能的Web伺服器和反向代理伺服器,同時還可以進行負載均衡、HTTP緩存和動態內容處理。在網路請求轉發和負載均衡方面,Nginx的配置相比其他伺服器,更加直觀和簡…

    編程 2025-01-02
  • grpc負載均衡詳解

    在分散式系統中,負載均衡是必不可少的一環,它能夠幫助我們更好地利用系統資源,提高系統的性能和可用性。在grpc中,負載均衡同樣也是必不可少的。本文從多個方面詳細介紹grpc負載均衡…

    編程 2024-12-28
  • 負載均衡:從原理到應用

    在大規模的網路應用中,伺服器承載著海量的請求,而負載均衡技術成為了一種有效的解決方案。本文將從多個維度對負載均衡進行詳細闡述,包括負載均衡技術、路由負載均衡、負載均衡原理、網路負載…

    編程 2024-12-25
  • 阿里雲mysql資料庫負載均衡,阿里雲mysql性能

    本文目錄一覽: 1、阿里雲的伺服器如何負載均衡? 2、阿里雲的負載均衡產品與傳統硬體負載均衡系統高投入相比,成本可下降多少 3、阿里雲服務對象有哪些? 阿里雲的伺服器如何負載均衡?…

    編程 2024-12-24
  • 使用Nginx配置反向代理實現高效負載均衡

    一、什麼是反向代理及其作用 反向代理是一種代理模式,在伺服器端起到代理客戶端的作用。它不同於正向代理,正向代理是客戶端向代理伺服器發送請求,由代理伺服器代為訪問目標伺服器。而反向代…

    編程 2024-12-24

發表回復

登錄後才能評論