參考文檔
https://blog.csdn.net/u011784767/article/details/74539644
https://doc.zeroc.com/ice/3.6/ice-services/icegrid/getting-started-with-icegrid
在上一章的基礎上學習本章
https://blog.csdn.net/huiyanshizhen21/article/details/106455643
1.只使用icebox的問題
只使用IceBox組件來設計和啓動Ice服務,客戶端必須將服務端的EndPoint寫死到代碼中。
2.解決方法
Ice設計了服務註冊表Registry組件,這是一個以二進制文件形式存儲運行期Ice服務註冊信息的獨立進程,
作爲服務的metadata存儲數據中心,以供客戶端查詢。
依託Registry的功能,Ice服務實現了Service Locator組件,這是一個標準的Ice Object服務對象,
我們可以在自己的服務端調用這個尋址服務,從而解決客戶端尋址的問題。
3.Service Locator組件
Service Locator組件實現了兩個非常實用和重要的功能:
Ⅰ:自動實現了多種可選擇的負載均衡算法,客戶端代碼無需自己再實現
Ⅱ:服務部署位置和部署數量發送變化之後,客戶端無需重啓,自動感知和適應
4.啓動icegridregistry
4.1配置文件
安裝ice後默認在/etc下有個icegridregistry.conf可以參考下
mkdir -p /opt/ice_project/config /opt/ice_project/data/registry
cd /opt/ice_project/config && vim icegridregistry.conf
IceGrid.Registry.Client.Endpoints=tcp -p 4061 -h 192.168.1.25
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.Data=/opt/ice_project/data/registry
IceGrid.Registry.PermissionsVerifier=IceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=IceGrid/NullPermissionsVerifier
IceGrid.Registry.DynamicRegistration=1
4.2 啓動icegridregistry
nohup icegridregistry --Ice.Config=/opt/ice_project/config/icegridregistry.conf >/dev/null 2>&1 &
5.服務端代碼不改變
6.修改icebox的配置,添加
#Ice Registry的協議 地址 端口
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.1.25 -p 4061
#配置UserServiceServer的適配器Id
UserServiceServer.AdapterId=UserServiceServerAdapter
7.通過配置服務的AdapterId,我們就可以使用
service@adapterId的間接代理的EndPoint方式來尋址服務了。
8.啓動icebox
./startIceServer.sh &
9.開端口4061
sudo firewall-cmd --zone=public --add-port=4061/tcp --permanent
systemctl restart firewalld
10.修改客戶端代碼調用
package com.yinzhen.demo.ice.userservice;
import com.yinzhen.demo.ice.user.UserInfo;
import com.yinzhen.demo.ice.user.UserServicePrx;
import com.yinzhen.demo.ice.user.UserServicePrxHelper;
public class UserServiceClient {
public static void main(String[] args) {
Ice.Communicator communicator = null;
try {
String[] initParams = new String[]{"--Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.1.25 -p 4061"};
// 初始化通信容器
communicator = Ice.Util.initialize(initParams);
//這裏使用service@adapterId的形式尋址
Ice.ObjectPrx op = communicator.stringToProxy("UserServiceServer@UserServiceServerAdapter");
// 檢查通用客戶端代理op 是不是queryServer對象標識符所關聯的ice對象的代理
UserServicePrx userServicePrx = UserServicePrxHelper.checkedCast(op);
if(userServicePrx == null){
throw new Exception("qp == null");
}
UserInfo userInfo = userServicePrx.getUserInfoById("id");
if(userInfo == null){
throw new Exception("userInfo == null");
}
// 輸出服務端返回結果
System.out.println(userInfo.remark);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
}
}