這系列文章將會一步步教你如何部署一個ICE服務,如果你正在讀這篇博客,我想你已經了解了什么是ICE(Internet Communications Engine),以及如何去實現ICE服務,并且了解什么是ICE對象、ICE對象標識符、ICE對象適配器、ICE服務實現servant、ICE通信器等概念,當然如果你連什么是ICE都不知道,我不建議你繼續讀下去。
先說一下ICE的基本組件:
(1) Slice工具:將Slice語言定義的接口編譯成各種特定語言實現的代碼,這屬于開發環境的一部分
(2) ICE容器:IceBox、Ice Node、Ice Registry、Ice Grid、Ice Admin等組件,這些是用于部署和管理Ice服務,你可以在你的服務中選擇其中的幾項使用。
(3)ICE運行庫:由ICE實現平臺提供的一套API,不同的語言有不同的實現,如java使用的是jar包,c++使用的是.so文件,這套API需要被ICE服務的客戶端和服務端調用
以實現底層通信。
我在寫這系列博客時使用的開發環境如下:
eclipse
Ice-3.3.1
jdk-1.6
CentOS release 5.11 (Final)
我們這里實現一個查詢雇員信息的服務,用于演示Ice服務的部署方式。
(一)我們先在eclipse中創建一個java項目,并在項目下創建一個名為slice的文件夾,然后使用Ice 的Slice語言定義Ice服務接口 并將文件命名為query.ice,并將文件放入項目中的slice文件夾中
[["java:package:com.yujie.ice"]]module info{struct EmployeeInfo{string name;int age;bool isLeave;double salary;string remark;};interface QueryEmployee{EmployeeInfo query(EmployeeInfo msg);};};
query.ice文件中定義了報名com.yujie.ice并用info進行包隔離最后生成的包名就是com.yujie.ice.info。
文件中定了一個EmployeeInfo結構體作為員工的信息結構體,定義了一個接口QueryEmployee,我們需要在自己的服務端代碼中實現這個接口。
(二) 使用Slice工具將query.ice定義的接口 生成java實現的具體代碼,我的eclipse已經安裝了ICE 編譯插件,直接編譯這個java項目就可以生成相應的接口客戶端和服務端的stub代碼。如果你沒有安裝Slice2java 編譯插件你可以使用類似slice2java –output-dir ../src/main/java/ query.ice這樣的命令生成代碼,前提是你已經設置了ICE相應的環境變量。
編譯之后的項目目錄如下所示:
(三)實現ice服務端代碼。
/** * 繼承服務端stub代碼_QueryEmployeeDisp類 并實現query接口 * @author yujie.wang * */public class QueryEmployeeImpl extends _QueryEmployeeDisp{@Overridepublic EmployeeInfo query(EmployeeInfo msg, Current __current) {// TODO Auto-generated method stubEmployeeInfo ei = new EmployeeInfo();ei.age = 23;ei.name = msg.name;ei.isLeave = false;ei.salary = 2000.0;ei.remark = "he is a good employee";return ei;}}
我們這里要實現一個查詢雇員信息的服務,返回一個雇員的的信息。
之后我們實現啟動ICE服務端的代碼,代碼如下所示:
/** * 實現啟動ICE服務端代碼 * @author yujie.wang * */public class QueryEmployeeServer {public static void main(String [] args){int state = 0;Ice.Communicator communicator = null;try {//初始化ice通信器communicator,可以使用args傳入一下ice初始化的參數如超時時間,線程池大小等communicator = Ice.Util.initialize(args);//創建一個名為queryEmployeeAdapter的適配器并且默認使用tcp協議 服務部署在10.4.30.81機器上 服務開啟10006監聽端口Ice.ObjectAdapter adapter = communicator.createObjectAdapterWithEndpoints("queryEmployeeAdapter","default -p 10006");// 創建服務端代碼實現servantQueryEmployeeImpl servant = new QueryEmployeeImpl();// 將servant與ice對象標識符建立映射關系,并添加到ice對象適配器中adapter.add(servant, Ice.Util.stringToIdentity("queryServer"));// 激活對象適配器adapter.activate();System.out.println("QueryEmployeeServer adapter activate");// 服務在退出之前一直保持監聽狀態communicator.waitForShutdown();} catch (Exception e) {// TODO: handle exceptionstate = 1;System.out.println(e);} finally{if(communicator != null){communicator.destroy();}}System.out.println("state: "+ state);}}
(四) 實現客戶端代碼
/** * 實現客戶端調用接口代碼 * @author yujie.wang * */public class QueryEmployeeClient {public static void main(String[] args) {// TODO Auto-generated method stubIce.Communicator communicator = null;try {//初始化ice通信器communicator,可以使用args傳入一下ice初始化的參數如超時時間,線程池大小等communicator = Ice.Util.initialize(args);// 傳入遠程服務單元的 ice對象標識符 協議默認tcp 主機 已經服務監聽端口Ice.ObjectPrx op = communicator.stringToProxy("queryServer:default -h 10.4.30.81 -p 10006");// 檢查通用客戶端代理op 是不是queryServer對象標識符所關聯的ice對象的代理QueryEmployeePrx qp = QueryEmployeePrxHelper.checkedCast(op);if(qp == null){throw new Exception("qp == null");}// 構造傳入參數EmployeeInfo ei = new EmployeeInfo();ei.name = "yujie.wang";// 調用接口EmployeeInfo result = qp.query(ei);if(result == null){throw new Exception("result == null");}// 輸出服務端返回結果System.out.println(result.remark);} catch (Exception e) {// TODO: handle exceptionSystem.out.println(e);}}}
(五) 服務部署
當然你可以直接在eclipse里運行服務端啟動ice服務的main方法,但是為了延續后面的服務部署思路,我這里打算將代碼打成jar包,通過一個簡單的shell腳本來運行這個main方法。
接下來 我們將java項目進行編譯,之后將編譯后的class代碼通過jar -cvf yujie-ice-test1.jar ./* 命令打成yujie-ice-test1.jar包。
我在服務器上寫了一個非常簡單的容器IceServer用于啟動這個ice服務,該容器的目錄結構如下所示:
bin目錄下面有如下兩個文件:
env.sh
#!/bin/shif [ -z "$JAVA_HOME" ]; then JAVA_HOME="/data/web/jdk"fiecho "JAVA_HOME:$JAVA_HOME"if [ -z "$SERVER_HOME" ]; then BIN_DIR=`readlink -f "$0"` echo "BIN_DIR:$BIN_DIR" BASE_DIR=`dirname "$BIN_DIR"` echo "BASE_DIR:$BASE_DIR" SERVER_HOME="`cd $BASE_DIR/.. && pwd`"else echo "SERVER_HOME IS NOT EMPTY"fiecho "SERVER_HOME:$SERVER_HOME"
startIceServer.sh
#!/bin/sh. ./env.shAPP_HOME=$SERVER_HOME/libAPP_MAINCLASS=com.yujie.ice.server.QueryEmployeeServerCLASSPATH=$APP_HOMEecho $CLASSPATHfor i in "$APP_HOME"/*.jar;do CLASSPATH="$CLASSPATH":"$i";doneecho $CLASSPATH$JAVA_HOME/bin/java -Xms1000M -Xmx1000M -Xmn500M -XX:PermSize=128m -XX:MaxPermSize=256m -cp $CLASSPATH $APP_MAINCLASS
lib目錄下面分別是ICE 平臺API jar包和我們自己服務的jar包。
現在我們用startIceServer.sh腳本來啟動服務端代碼
sh startIceserver.sh &
最后我們在本地運行客戶端調用代碼輸出如下:
(六)該部署方式總結
優點:直接使用服務端main函數啟動,沒有引入ice其他容器組件,客戶端和服務端直接通過tcp建立連接,是一個十分輕量級的服務。
確定:客戶端直接寫死了服務的Endpoint信息,及其不靈活;服務端部署方式簡單粗暴 不易運維,無法實現負載均衡、故障恢復
這種部署方式只是簡單粗暴的演示,完全不能作為工業級的部署方案。
下一節我們將實現另一種部署方案,該方案會解決該種部署方式的一些問題。
138731.html
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
寶泉嶺屬于鶴崗哪個區?寶泉嶺農場是黑龍江省鶴崗市蘿北縣下轄的一個行政村。城鄉分類代碼是220,是一個村。區劃代碼為230421506,居民身份證號碼前六位為230421。郵政編碼是154100,長途區號是0468,車牌號是黑h。寶泉嶺農場毗鄰共青農場、農業局、顏軍農場、名山農場、軍川農場、蔣斌農場、林業局、東明朝鮮族鄉、云山鎮、太平溝鄉、肇興鎮、團結鎮、名山鎮、河北鎮。鶴崗寶泉嶺農場是哪個區?寶泉...
U盤內存變小了是怎么回事???有三種可能會性第一:很有可能是內存量盤要是網上購買8GBU盤其神秘容量僅4G也可以更少的話,狀況多為衣服縮水U盤,也稱“快速擴容盤”。這種U盤是不法廠商可以使用一種量產中工具的軟件,決定U盤上的控制芯片信息,將U盤容量標住到遠為0其換算容量,以欺詐消費者的手段牟取暴利。當U盤的實際中容量大于或等于其標稱值的90%時,即被認為為未知質量問題的會縮水U盤。第二:換算大小和剩...
電信網上營業廳怎樣查詢固話余額?你好!感謝您對電信的支持!您可以通過以下方式檢查余額:1.11888充值熱線:本機撥打11888,然后根據語音提示選擇1-9-1,即可查詢本機余額。2.短信營業廳:電信手機用戶在本機編輯短信指令電信網上營業廳運營商服務密碼怎么修改?1.用手機撥打100013 1輸入原密碼修改。電信手機撥號免費;2.發短信“502#舊密碼#6位新密碼”到10001修改。發送和接收均免...