IceBox
IceBox 是一种简单的应用服务器,可用于协调许多应用组件的启动和停
止。简单理解,就相当于tomcat,我们只需要关注业务接口实现,用一个
配置文件定义需要加载的服务列表、启动参数等信息
Node、Registry 、 IceGrid
Node: 服务节点,管理一个节点上挂载的IceBox,采集主机底层负载信息
Registry:注册中心,实现各服务信息注册管理,实现多策略调用负载,监控节服务的状态变化,实时切换主从
IceGrid:用来管理node和registry的工具,支持命令行,有api服务,也有GUI界面
Glacier2
Glacier 是 Ice 防火墙服务:它能让客户与服务器通过防火墙安全地进行
通信,且又不牺牲安全性。客户-服务器之间的通信数据使用公钥证书进
行了完全的加密,并且是双向的。 Glacier2支持相互认证,以及安全的会话
管理。
服务端
服务端启动
客户端
iceclient.properties 配置规则(1)
一、注册中心配置与默认版本配置
--Ice.Default.Locator=DemoIceGrid/Locator:tcp -h ice_registry_node1 -p 4062:tcp -h ice_registry_node2 -p 4062
--Ice.Default.OldRegistry=DemoIceGrid/Locator:tcp -h ice_registry_old_node1 -p 4062:tcp -h ice_registry_old_node2 -p 4062
idleTimeOutSeconds=60000
app.version=-uhome-v1
二、接口指定版本
tddl.sequences.SequenceService=
tddl.sequences.OrderSequenceService=-V1
segi.datacachesvr.queryCustomInfo.CCustomInfoI=-v1
segi.datacachesvr.queryInfo.CCBuildI=-v1
segi.datacachesvr.queryInfo.CCommunityI=-v1
iceclient.properties 配置规则(2)
三、接口指定服务地址(支持注册中心或单接口服务地址)
#AdminUserServiceBox
segi.common.adminuser.AdminUserServicePrx=DemoIceGrid/Locator:tcp -h ice_registry_old_node1 -p 4062:tcp -h ice_registry_old_node2 -p 4062:tcp -h ice_registry_old_node3 -p 4062:tcp -h ice_registry_segi_node1 -p 4062:tcp -h ice_registry_segi_node2 -p 4062
segi.common.adminuser.curd.CurdAdminUserServicePrx=OldRegistry
四、Glacier2配置
--Ice.Default.Glacier2Router=Glacier2-SSL/router:ssl -h nginx_to_internet.segi -p 5064
IceSSL.DefaultDir.Glacier2Router=/public/uhome/ice/message-push/ca
IceSSL.Keystore.Glacier2Router=client114.jks
IceSSL.Password.Glacier2Router=123456
Ice.RetryIntervals=-1
Ice.Plugin.IceSSL=IceSSL.PluginFactory
Ice.Trace.Network=0
IceSSL.VerifyPeer=0
IceSSL.Trace.Security=1
IceSSL.KeystoreType.Glacier2Router=JKS
segi.common.authuser.AuthUserServicePrx=Glacier2Router
segi.common.user.mq.UserMqServicePrx=Glacier2Router
segi.common.push.message.writeMessage.WriteMessageApiServicePrx=Glacier2Router
com.segi.uhomecp.pay.wx.WxPayServicePrx=Glacier2Router
客户端调用工具类 IceClientUtil
•private static void initLocator()
初始化工具类,加载iceclient.properties服务配置。应用启动后初次调用接口时会执行此方法
•public static Ice.Communicator getIceCommunictor(String clsName)
获取服务通信器,每个接口会创建一个通讯器(为了支持多注册中心),缓存在静态map中。通信器中存储了各接口链接的服务地址
•private static ObjectPrx createIceProxy(Class serviceCls)
获取接口代理,从通讯器中通过传入的接口名称获取对象代理。返回的对象代理中包含了注册中心负载均衡后下发的其中一个节点路径
•public static <T> T getServicePrxByClass(Class<T> serviceCls)
客户端调用服务接口入口,传入需要调用的接口类,返回对象代理。
•Ice.UnknownLocalException、Ice::ObjectNotExistException、Ice.OperationNotExistException、Ice.UnmarshalOutOfBoundsException
错误信息:
[12 16:06:18,635 ERROR] [http-nio-11040-exec-3] rest.PublicInfoRest -
Ice.UnknownLocalException
unknown = "Ice::NoEndpointException
Ice.OperationNotExistException
id.name = "segi.servcieOrder.orderqueryserver.OrderQuery-gamma-v1"
id.category = ""
facet = ""
operation = "getOrderSubmitTrackDetail"
常见异常:
Ice.UnmarshalOutOfBoundsException
reason = ""
at IceInternal.BasicStream.readAndCheckSeqSize(BasicStream.java:691)
at segi.servcieOrder.userScoreslsHelper.read(userScoreslsHelper.java:46)
错误原因:从以下几个方面检查
1. client, server 使用的slice编译的对象不一致。
2. 注册服务配置错误、接口调用版本不对,等
3. 服务中心没有加载正确的启动类,启动类冲突
4. 能够找到相应的对象适配器 , 但是该对象适配器中无法找到相应的对象;通常是服务中心没有加载正确的启动类,启动类冲突
常见异常:
• Ice::ConnectionLostException、 Ice::ConnectTimeoutException
错误描述:连接突然断开 ( 比如对方因为段错误而程序停止 , 或者在连接过程中正常关闭 ) : 发生在使用代理调用接口的时候 ( 连接丢失 )、链接超时,注册中心地址或接口地址配置错误
错误信息:
[11 15:20:11,551 DEBUG] [orderServiceQueryBox1-orderServiceQuery-Ice.ThreadPool.Server-270] orderServiceQueryBox1-orderServiceQuery - Network closed tcp connection
local address = 192.168.1.11:24800
remote address = 192.168.2.38:53836
Ice.ConnectionLostException
常见原因:
1. 已经建立连接的对方突然断开、通常对方服务重启或core机
2. 客户端存在双网卡,注册中心采集节点地址时,用了外网地址,导致调用不通,可配置时制定使用ip
常见异常:
获取不到调用接口地址、或者接口服务调用不通
错误信息:
常见原因:
1. 注册中心有这个接口配置,但是提供这个接口服务未启动
2. 请求版本与服务注册版本不一致(客户端版本、注册中心配置版本、服务器启动时配置版本)需三方一致
3. 客户端使用的对象描述与服务端的对象描述不一致(jar包版本不匹配)
注意事项:
• Eclipse (自动编译)下配置使用 #include在eclipse 下如果你引用其他的slice文件,还需要做一件事情,就是要把include路径增加进去。项目右键->属性->Slice2Java Properties->在tab Options里增加Location of Include Files
• pom.xml 增加编译代码••• linux环境slice2java解析ice文件,注释不能在代码后面,否则编译会被忽略,或编译报错1. 编译完成后丢失属性
2. 编译报slice语法错误