本文的客户端基于我们的GQT开源项目:http://cxlh.iteye.com/blog/2021463
本人拙见,如有不同意见,欢迎拍砖,同时献给特别有对服务端跨语言需求的程序猿们!
客户端(GQT Demo V3(服务端配套版).rar)太大请挪步到QQ群下载(群号:101189702),注明:GQT或Java,C++等,Java服务端源码在附件中下载;
总体设计思路:
- 高可用性:每个业务服务端都是独立的个体,任何一个业务服务器Crash时,都不会影响服务,并且业务服务器可以按需增加,业务服务端使用Java代码实现,主要是为了考虑更好的数据库操作,更好的事务支持,更好的社区支持以及可用更多的开源服务,提高开发效率;
- 自动负载均衡:当某个接口频繁调用,增加的响应服务器自动分流接口调用压力,也就说我们的异步的请求/响应模式下,有一个Broker仲裁程序决定客户端发来的请求交由哪个Java业务服务器来处理,这个Broker程序我们采用C++代码实现;
- 客户端(包括桌面或移动端)网关:根据策略选取远程Socket服务器连接,Socket服务器与服务器之间的消息通讯通过地址寻址远程路由,以便连在不同Socket服务器上的用户之间可以相互通讯,典型的应用就是聊天程序;
- Sub/Pub类消息:客户端订阅服务端的服务,服务端有多个Pub服务器(Java编写),交由Socket服务器将客户端Sub的消息Push给Client,此时Socket服务只作为Proxy用;
好了,其实这里只有2个C++核心组件(Socket服务器,Broker仲裁程序)和N个Java业务服务器(请求处理服务器,Pub服务器),以下介绍用法:
客户端发送请求,异步收取,编写业务代码步骤:
编写业务请求的服务端非常简单,看起来就这么几句:
public class StockServer extends BaseReqServer { private static Logger logger = LogManager.getLogger(StockServer.class.getName()); public StockServer(String ip, String port, ReqCallBack callback) { super(ip, port, callback); } public static void main(String[] args) { logger.info("=============StockServer========"); new Thread(){ @Override public void run() { ReqCallBack callback = new StockCallBack(); String ip = prop.getProperty("gqt-reqserver-ip"); String port = prop.getProperty("gqt-reqserver-port"); final StockServer ss = new StockServer(ip,port,callback); ss.startServer(); } }.start(); } }
处理请求Java代码:
public class StockCallBack extends ReqCallBackAbstract{ final SpringInstance si = SpringInstance.getInstance(); final private StockService stockService = (StockService)si.getService("stockService"); @Override public void solve(JSONObject json,String c, String args) { try{ String[] commandArray = StrUtil.split(c, "."); if(commandArray.length == 2){ String objStr = commandArray[0]; String objFunc = commandArray[1]; //Map<String,Object> argMap = (Map<String,Object>)JSON.parse(args); if(objStr.equals("stock")){ Map<String,Object> argMap = new HashMap<String, Object>(); if(objFunc.equals("listStockByKeyword")){ argMap.put("kw", args); }else if(objFunc.equals("listByDate")){ argMap.put("date", args); } Object ret = invokeMethodRequest(stockService, objFunc, argMap); JSONObject jsonBODY = json.getJSONObject("body"); jsonBODY.put("ret",ret.toString()); } } }catch(Exception ex){ ex.printStackTrace(); } } }
Java代码跟数据库打交道:
编写Java服务端,比如我们编写一个按关键字读取股票列表等接口(依赖注入用的Spring): @Repository @CacheNamespace(implementation = org.mybatis.caches.ehcache.EhcacheCache.class, readWrite = true) public interface StockDao { @Select("select SYMBOL,SHORT_NAME from `master`") public List<Map> listStock(); @Select("select SYMBOL,SHORT_NAME from `master` where SHORT_NAME like '%${k}%' or SPELL_NAME like '%${k}%' or SYMBOL like '%${k}%' limit 0,10") public List<Map> listStockByKeyword(Map<String,String> map); @Select("select SYMBOL,SHORT_NAME from `master` where exch_id=8") public List<Map> listAllSh(Map<String,String> map); @Select("select SYMBOL,SHORT_NAME from `master` where trade_date=#dt#") public List<Map> listStockByDate(Map<String,String> map); }
编写客户端C++或脚本:
gw.req("命令代码"."命令代码对应的参数列表"); //回调函数 gw.s_cb_gw.connect(function(trcode,msg){ log("-----------------------------------------------------------------"); log("<p>gqt server异步方式获取数据,回调信息:trcode=" + trcode + ",msg=" + msg+"</p>"); });
效果如下:
这样做的好处:
- 桌面或移动的客户端再也不用编写繁琐的网络通信相关的程序,只需要发送请求/订阅,处理响应/订阅数据包即可,也不用关心底层的数据分包合包,客户端代理,网络传输的加解密和压缩等;
- 客户端开发人员也几乎不用和服务端程序员沟通,通过JSON解析请求透传给Java,Java响应的数据带上包头和响应给客户端,客户端解析JSON即可;
- 跨语言的服务端虽然会损失一定的性能,但似乎这点ZeroMQ已做的足够好;
Demo程序部署步骤:
- 创建一个MySQL Demo数据库,数据库名:stock,utf-8编码,导入output下的stock.sql;
- 配置output下的config.properties文件,指定机器IP,配置jdbc.properties,确保数据库配置正确;
- 点击runStockServer.bat,运行stock的Java Demo服务器,可以开任意个;
- 配置gqt-server-communicator(cpp)下的config_ims.ini文件,IP地址全部换成机器IP;
- 启动ss_server.exe,ss_zserver.exe;
- 点击客户端GQT程序,配置config_ims.ini中的IP地址,切换到gateway的标签页,enjoy it!
相关推荐
为此,框架需要维护可用性列表,确保主调(客户端)与被调(服务端)之间的通信稳定性。同时,名字服务传输的主调和被调两端需要本地代理和远端代理进行编码和解码处理,保证RPC调用的可靠性。 在注册发现机制的...
基于SOA/J2EE的电信增值业务AAA系统设计与实现,不仅解决了传统系统中存在的问题,如紧耦合导致的难以扩展等问题,还充分利用了现代技术的优势,实现了高性能、高可用性的目标。未来,随着更多新技术的发展,该系统...
1.2 高可用原则 10 1.2.1 降级 10 1.2.2 限流 11 1.2.3 切流量 12 1.2.4 可回滚 12 1.3 业务设计原则 12 1.3.1 防重设计 13 1.3.2 幂等设计 13 1.3.3 流程可定义 13 1.3.4 状态与状态机 13 1.3.5 后台系统操作可反馈...
云架构的特性包括大规模性、高可用性、可伸缩性、高性能、信息安全保密、许可证和计费管理以及集成和标准化。这些特性确保了云服务的高效稳定运行。 主流的云计算提供商如IBM和Google,提供了丰富的云计算平台和...
为解决这些问题,Lancer系统设定了高吞吐、低延迟、数据安全、时效性以及系统高可用性的目标。 Lancer系统采用双流架构,分为实时流和离线流。实时流主要用于实时埋点数据的上报,通过SDK收集服务端和客户端数据,...
中间件的概念及作用: 中间件是位于操作系统和应用软件之间的一类软件,它构建在硬件和操作系统之上,为应用软件提供...ICE的集群功能通过ICEStorm消息处理机制和其他组件共同协作,为分布式系统提供高可用性的支持。
- **优势**:分布式计算能够提高系统的可用性和性能,支持多地点的资源共享。 - **挑战**:涉及网络编程、协议设计、跨平台兼容性等问题。 #### 八、面向对象分布式计算的特点 - **客户端与服务端的角色划分**:...
【基于Java的CORBA组件技术...结合Java的强大特性和Oracle数据库的稳定性,开发者可以构建出高性能、高可用性的分布式应用。而随着技术的不断进步,CORBA组件技术在未来的云计算和物联网场景中仍将继续发挥重要作用。
- **无状态性**:服务应避免保持会话状态,以便提高可伸缩性和可用性。 - **明确接口**:服务接口需要清晰明确,以便其他服务能够正确调用。 - **松耦合**:服务之间应尽量减少相互依赖。 - **最佳实践**:为了...
通过配置ICE服务节点,可以自动分发请求,平衡负载,同时提供故障转移机制,确保服务的高可用性和可靠性。 总结来说,ICE中间件为构建分布式应用提供了强大而灵活的解决方案,尤其在异构环境和多语言开发方面表现...
在这个名为“海量数据的实时读写和查询实践”的PPT中,详细介绍了如何构建一个能够处理亿级数据并保证高可用性的系统架构。以下是该文档中涵盖的关键知识点: 1. **多租户SAAS系统场景**: - 该系统服务于数万租户...
### 网络环境下数据交换方案的设计与实现 #### 概述 本文旨在探讨网络环境中高效数据交换的方法。通过对当前数据交换技术的研究和分析,作者提出了一种基于XML和Web服务的新颖数据交换方案。该方案的核心优势在于...
ASM6000提供了多种部署选项,包括典型部署、高可用性部署和复杂环境部署,以适应不同的组织结构和安全策略。 总结,盈高入网要求规范管理系统ASM6000是一款专为解决企业内部网络安全问题设计的高级解决方案,它通过...
5. 高可用集群与负载均衡:通过选举算法,确定服务端主server,并在故障时自动接管,确保系统的高可用性。 6. 线性扩展及功能横向扩展能力:采用基于X86的分布式架构,产品性能随着服务器扩展呈线性扩展。 7. 可视化...
- **高可用性与动态迁移:**确保虚拟机具有高可用性,并能在不同主机之间动态迁移,提高资源利用率。 2. **Operations Manager 2007 R2 (SCOM):** - **健康监控:**为物理和虚拟服务器提供全面的健康状态监控,...
打造聚能环:高可用服务端的质量保障体系 服务端业务测试高效测试之路 漏洞发展趋势 UI自动化测试稳定与效率提升之美 如何通过企业级业务架构方法提升B端软件开发效能 以一当十:高效引流自动Diff助力业务快速迭代 ...
此外,双机热备策略对于保证系统高可用性至关重要,当主节点故障时,备份节点可以无缝接管服务,减少业务中断。 总结来说,ArcSDE for Oracle(AIX)分布式部署涉及多个步骤,包括安装ArcSDE软件,配置Oracle客户端,...
**原因:** 这样做可以保持监听套接字的可用性,以便继续接收其他客户端的连接请求。 ### 19. 生产者-消费者模型 **概念:** 一种经典的多线程同步模型,其中生产者负责生成数据,消费者负责消费数据。 **同步机制:...