负载均衡之IceGrid

背景介绍
在现代分布式系统中,微服务架构已经成为主流,微服务架构将一个庞大的系统分解为多个小型、独立的服务,每个服务可以独立开发、部署和扩展,为了实现这些服务的高效通信和管理,负载均衡技术显得尤为重要,ZeroC IceGrid作为一种高效的微服务架构解决方案,基于RPC框架发展而来,具有良好的性能与分布式能力,本文将详细介绍IceGrid的负载均衡机制及其相关功能。
IceGrid的主要特点
集中的服务注册中心
微服务架构需要一个集中的服务注册中心以及某种服务发现机制,IceGrid通过XML文件定义服务注册,其服务注册中心是Ice Registry,这是一个独立的进程,并且提供了高可用(HA)机制,对应的服务发现机制是命名查询服务,即LocatorService提供的API,可以根据服务名查询对应的服务实例可用地址。
独立的进程部署
微服务架构中的每个微服务通常会被部署为一个独立的进程,在IceGrid中,一个IceBox就是一个单独的进程,当一个IceBox只封装一个Servant时,就是一个典型的微服务进程。
内嵌的负载均衡机制
IceGrid的负载均衡是通过客户端API内嵌的负载均衡算法实现的,相对于采用中间件Proxy转发流量的方式(如SpringCloud),IceGrid的做法更加高效,但增加了平台开发的工作量与难度,因为采用各种语言的客户端都需要实现一遍负载均衡的算法逻辑。
简化的应用部署
一个好的微服务架构平台应该简化和方便应用部署,IceGrid提供了grid.xml来描述与定义一个基于微服务架构的Application,一个命令行工具一键部署这个Application,还提供了发布二进制程序的辅助工具——icepatch2,下图显示icepatch2的工作机制,icepatch2server类似于FTP Server,用于存放要发布到每个Node上的二进制代码与配置文件,而位于每个Node上的icepatch2client则从icepatch2server上拉取文件,这个过程中采用了压缩传输及差量传输等高级特性,以减少不必要的文件传输过程,客观地评价,在Docker技术之前,icepatch2这套做法还是很先进与完备的,也大大减少了分布式集群下微服务系统的运维工作量。

IceGrid的典型技术方案
如果基于IceGrid开发系统,则通常有三种典型的技术方案:
方案一:比较符合传统Java Web项目的一种渐进改造方案,Spring Boot里只有Controller组件而没有数据访问层与Service对象,这些Controller组件通过Ice RPC方式调用部署在IceGrid里的远程的Ice微服务,面向前端包装为REST服务,此方案的整体思路清晰,分工明确,Leader在开源项目中给出了这种方式的一个基本框架以供参考。
方案二:适合前端JavaScript能力强的团队,比如很擅长Node.js的团队可以考虑用JavaScript来替代Spring Boot实现REST服务,主要做互联网App的系统则可以考虑方案三,浏览器端的JavaScript以HTML5的WebSocket技术与Ice Glacier2直接通信,整体高效敏捷。
方案三:在IceGrid 3.6版本之后还增加了容器化的运行方式,即Ice Node与Ice Registry可以通过Docker容器的方式启动,这就简化了IceGrid在Linux上的部署,对于用Java编写的Ice微服务架构系统,还可以借助Java远程类加载机制,让每台Node自动从某个远程HTTP Server下载指定的Jar包并加载相关的Servant类,从而实现类似Docker Hub的机制,下图显示了前面提到mycat-ice开源项目时给出的具体实现方案。
IceGrid的功能详解
1. 定位服务(Location service)

作为一个ICE定位服务,IceGrid的实施使客户能够间接地绑定到他们的服务器,提高应用程序的灵活性和适应不断变化的需求。
2. 按需激活(On-demand server activation)
分布式部署的节点服务器,不需要立即启动,在客户端向服务器发送一个服务请求时,Icegrid检查到该服务所在的服务器存在但是没有激活,则icegrid会激活这个服务器,这一过程对于客户端来说是透明的。
3. 应用程序部署(Application distribution)
IceGrid提供了一种很方便的方式来部署应用到一组计算机中,不再需要一个文件共享系统或者是复杂的部署脚本,简单的使用IcePath2的配置服务,就能够保持必要的程序和文件的同步。
4. 复制和负载均衡(Replication and load balancing)
IceGrid的支持复制功能,将几台服务器中的是对象适配器复制成一个单一的虚拟对象适配器,在客户端和服务器间接绑定期间,客户端能够连接到任意一个对象适配器的端点,IceGrid监听每一台服务器的负载情况,当客户端请求服务时,IceGrid使用这些监听信息来决定分配哪个端点来处理客户端的请求。
5. 会话和资源分配(Sessions and resource allocation)
客户端可以建立一个会话(session)来独占某个对象或者代理甚至服务器,IceGrid会阻止其他的客户端使用这个分配的资源,直到客户端释放它或者session过期,IceGrid的session服务增强了安全性,通过使用集成了一个Glacier2路由器的认证机制。
6. 自动容错(Automatic failover)
ice支持在任何一个包含多个端点的代理中自动重试和容错功能,当结合IceGrid的复制和负载均衡的支持时,自动故障转移意味着客户端发送一个请求,服务器处理请求失败时,IceGrid会选择一个最低负载的端点重新处理请求。
7. 动态查询(Dynamic queries)
在客户端通过查找的方式,查找出所有的代理端口信息,并由客户端决定使用哪个代理。
8. 状态监测(Status monitoring)
IceGrid提供Slice接口,允许应用程序监控其各项活动和收到有关重大事项的通知,可以使用监控接口来整合现有的监控系统。
9. 管理(Administration)
IceGrid包括命令行和图形化的管理工具,它们支持所有的平台,并允许启动,停止,监控,和重新配置任何服务器。
部署(Deployment)
使用XML文件,通过描述符部署服务器到每台计算机,使用模板描述符可以简化相同服务器的部署。
11. 数据库独立(Database Independence)
默认情况下,IceGrid的使用Freeze数据库以保存其状态,您可以配置IceGrid使用不同的数据库,如MySQL。
IceGrid的架构解析
一个 IceGrid域由一个注册表(Registry)和任何数目的节点(Node)构成,注册表和节点一起合作管理一些信息以及包含一些应用(Application)的服务进程,每个应用程序分配到特定节点的服务器,这个注册表维护了这些信息,注册表中的信息记录被持久化到数据库中,而节点负责启动和监测其指定的服务器进程,对于一个典型的配置,一个节点运行在一台计算机(称之为Ice服务器主机),注册表并不消耗很多处理器时间,所以它常常是和节点运行在同一台计算机上的,注册表和一个节点可以运行在同一进程中,如果要想容错机制达到理想的状态,注册表也支持复制(Replication)功能使用主从式的设计,下图显示一个很简单的IceGrid应用,它运行在一个有三台计算机的网络上,该IceGrid Registry 是PC1主机中唯一的一个进程中,而IceGrid Node运行在PC2和PC3主机上,此示例中,一个服务已经被分配给每个节点,客户端安装在一台独立的PC4上,从客户端应用程序的角度来看,注册表的主要责任,是解决作为Ice定位服务的间接代理问题,这方面的作用是非常明显的:当客户端第一次尝试使用一个间接代理,客户端的Ice run time连接注册表,并且将代理的符号信息转化为端点,使用这个端点允许客户端建立一个连接,尽管注册还提供了一些其他的功能,不仅仅是一个简单的查询表,一个定位请求可能提示一个节点自动启动目标服务,或注册表可能会根据每台电脑的负荷统计选择适当的端点,间接代理的好处:位置服务可以提供很多功能,而客户端不需要任何额外的特定的操作,这点和直接代理不同,客户端不需要更多的服务器的地址和端口信息,只是间接代理的方式允许已经部署的服务器迁移到不同的计算机上,而不需要更新客户端所持有的代理。
到此,以上就是小编对于“负载均衡之icegrid”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复