部署兩臺Service,如何在WEB中隨機訪問任意一臺Service
這裡是修真院後端小課堂,每篇分享文從
【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】
八個方面深度解析後端知識/技能,本篇分享的是:
【部署兩臺Service,如何在WEB中隨機訪問任意一臺Service】
大家好,我是IT修真院深圳分院第十期學員,一枚正直純潔善良的JAVA程式設計師。
今天給大家分享一下,修真院官網JAVA任務八——部署兩臺Service,如何在WEB中隨機訪問任意一臺Service
1.背景介紹
RMI簡介
RMI(Remote Method Invocation)是JAVA早期版本(JDK 1.1)提供的分散式應用解決方案,它作為重要的API被廣泛的應用在EJB中。
隨著網際網路應用的發展,分散式處理任務也隨之複雜起 來,WebService也得到普遍的推廣和應用。
2.知識剖析
RMI 指的是遠端方法呼叫 (Remote Method Invocation)。它是一種機制,能夠讓在某個 Java虛擬機器上的物件呼叫另一個 Java 虛擬機器中的物件上的方法。
可以用此方法呼叫的任何物件必須實現該遠端介面。
呼叫這樣一個物件時,其引數為 "marshalled" 並將其從本地虛擬機發送到遠端虛擬機器(該遠端虛擬機器的引數為 "unmarshalled")上。
該方法終止時,將編組來自遠端機的結果並將結果傳送到呼叫方的虛擬機器。
如果方法呼叫導致丟擲異常,則該異常將指示給呼叫方。
3.常見問題
為什麼要使用RMI,有什麼優點
4.解決方案
優點:
1、面向物件:
RMI可將完整的物件作為引數和返回值進行傳遞,而不僅僅是預定義的資料型別。
也就是說,可以將類似Java哈西表這樣的複雜型別作為一個引數進行傳遞。
2、可移動屬性:
RMI可將屬性從客戶機移動到伺服器,或者從伺服器移動到客戶機。
3、設計方式:
物件傳遞功能使您可以在分散式計算中充分利用面向物件技術的強大功能,如二層和三層結構系統。
如果使用者能夠傳遞屬性,那麼就可以在自己的解決方案中使用面向物件的設計方式。
所有面向物件的設計方式無不依靠不同的屬性來發揮功能,如果不能傳遞完整的物件——包括實現和型別
——就會失去設計方式上所提供的優點。
4、安全性:
RMI使用Java內建的安全機制保證下載執行程式時使用者系統的安全。
RMI使用專門為保護系統免遭惡意小程式侵害而設計的安全管理程式。
5、便於編寫和使用
RMI使得Java遠端服務程式和訪問這些服務程式的Java客戶程式的編寫工作變得輕鬆、簡單。
遠端介面實際上就是Java介面。
5.編碼實戰
如何實現(serer之間的切換)
import com.jnshu.czm.service.UserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Lazy; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.Random; public class SwitchService { private static Logger logger = LoggerFactory.getLogger(SwitchService.class); private static ApplicationContext applicationContext = new ClassPathXmlApplicationContext("rmiClient.xml"); public static UserService getUserService() { UserService userService = null; Random random = new Random(); int i = random.nextInt(2); if (i == 1) { try { logger.error("get data from server1"); userService = (UserService) applicationContext.getBean("RmiService1"); } catch (Exception e) { logger.error("get a error,turn to server2"); userService = (UserService) applicationContext.getBean("RmiService2"); } } else { try { logger.error("get data from server2"); userService = (UserService) applicationContext.getBean("RmiService2"); } catch (Exception e) { logger.error("get a error,turn to server1"); userService = (UserService) applicationContext.getBean("RmiService1"); } } return userService; } }
6.擴充套件思考
7.參考文獻
百度、維基、CSDN
8.更多討論
Q1:
registryPort和servicePort?
A1:
註冊埠:registryPort 註冊埠是RMI註冊遠端服務的埠。
服務埠:servicePort RMI的通訊需要的傳送資料的埠。如果沒有設定servicePort,則使用隨機埠。
Q2:
RMI 伺服器重啟,總是會出現客戶端連線拒絕的問題。
A2:
伺服器重啟會影響到客戶端,說明客戶端有儲存著重啟之前的伺服器連線相關記錄。有可能是客戶端有快取,所以只要重新整理快取即可解決問題。
Q3:
Spring RMI會佔用兩個埠?
A3:
Spring RMI 有兩個埠,一個是註冊埠(預設為1099),還有一個是資料傳輸埠,如果不指定,資料傳輸埠是隨機分配的。
鳴謝:
感謝XX、XX師兄,此教程是在他們之前技術分享的基礎上完善而成。
-------------------------------------------------------------------------------------------------------------------------
今天的分享就到這裡啦,歡迎大家點贊、轉發、留言、拍磚~
技能樹.IT修真院
“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫”。
這裡是技能樹.IT修真院,成千上萬的師兄在這裡找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。
快來與我一起學習吧~http://www.jnshu.com/home
騰訊視訊:https://v.qq.com/x/page/f0708rblz6a.html
更多內容,可以加入IT交流群565734203與大家一起討論交流
這裡是技能樹·IT修真院:http://www.jsnhu.com,初學者轉行到網際網路的聚集地