`
kongshanxuelin
  • 浏览: 912338 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

异构语言高可用性服务端的设计与实现

阅读更多

本文的客户端基于我们的GQT开源项目:http://cxlh.iteye.com/blog/2021463

 

本人拙见,如有不同意见,欢迎拍砖,同时献给特别有对服务端跨语言需求的程序猿们!

 

客户端(GQT Demo V3(服务端配套版).rar)太大请挪步到QQ群下载(群号:101189702),注明:GQT或Java,C++等,Java服务端源码在附件中下载;

 

总体设计思路: 

 

  1. 高可用性:每个业务服务端都是独立的个体,任何一个业务服务器Crash时,都不会影响服务,并且业务服务器可以按需增加,业务服务端使用Java代码实现,主要是为了考虑更好的数据库操作,更好的事务支持,更好的社区支持以及可用更多的开源服务,提高开发效率;
  2. 自动负载均衡:当某个接口频繁调用,增加的响应服务器自动分流接口调用压力,也就说我们的异步的请求/响应模式下,有一个Broker仲裁程序决定客户端发来的请求交由哪个Java业务服务器来处理,这个Broker程序我们采用C++代码实现;
  3. 客户端(包括桌面或移动端)网关:根据策略选取远程Socket服务器连接,Socket服务器与服务器之间的消息通讯通过地址寻址远程路由,以便连在不同Socket服务器上的用户之间可以相互通讯,典型的应用就是聊天程序;
  4. 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>");
});

 

效果如下:

 

 

 

 

这样做的好处:

 

  1. 桌面或移动的客户端再也不用编写繁琐的网络通信相关的程序,只需要发送请求/订阅,处理响应/订阅数据包即可,也不用关心底层的数据分包合包,客户端代理,网络传输的加解密和压缩等;
  2. 客户端开发人员也几乎不用和服务端程序员沟通,通过JSON解析请求透传给Java,Java响应的数据带上包头和响应给客户端,客户端解析JSON即可;
  3. 跨语言的服务端虽然会损失一定的性能,但似乎这点ZeroMQ已做的足够好;

 

Demo程序部署步骤:

 

  1. 创建一个MySQL Demo数据库,数据库名:stock,utf-8编码,导入output下的stock.sql;
  2. 配置output下的config.properties文件,指定机器IP,配置jdbc.properties,确保数据库配置正确;
  3. 点击runStockServer.bat,运行stock的Java Demo服务器,可以开任意个;
  4. 配置gqt-server-communicator(cpp)下的config_ims.ini文件,IP地址全部换成机器IP;
  5. 启动ss_server.exe,ss_zserver.exe;
  6. 点击客户端GQT程序,配置config_ims.ini中的IP地址,切换到gateway的标签页,enjoy it!

 

 

  • 大小: 70.5 KB
1
0
分享到:
评论

相关推荐

    开涛高可用高并发-亿级流量核心技术

    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 后台系统操作可反馈...

    J2EE系统设计方案.doc

    J2EE体系结构提供中间层集成框架用来满足无需太多费用而又需要高可用性、高可靠性 以及可扩展性的应用的需求。通过提供统一的开发平台,J2EE降低了开发多层应用的费 用和复杂性,同时提供对现有应用程序集成强有力...

    J2EE系统设计方案(1).doc

    J2EE体系结构提供中间层集成框架用来满足无需太多费用而又需要高可用性、高可靠性 以及可扩展性的应用的需求。通过提供统一的开发平台,J2EE降低了开发多层应用的费 用和复杂性,同时提供对现有应用程序集成强有力...

    2020QECon 全球软件质量和效能大会(上海站)PPT汇总.zip

    打造聚能环:高可用服务端的质量保障体系 服务端业务测试高效测试之路 漏洞发展趋势 UI自动化测试稳定与效率提升之美 如何通过企业级业务架构方法提升B端软件开发效能 以一当十:高效引流自动Diff助力业务快速迭代 ...

    应用服务器中间件技术要求.doc

    " "集群与可用性要"必须支持通过Apache、IIS实现集群、负载均衡和系统 " "求 "扩展。 " " "支持多服务器群集部署、负载均衡、组件级的失效即时" " "恢复(Fail Over)。支持Web层的集群和EJB集群。应 " " "提供较...

    桃源网络硬盘 5.8.zip

    3、超强易用性、可用性:支持B/S(计算机或手机浏览器/服务器)加C/S(服务器/客户端)复合模式提供类windows资源管理器操作,会用鼠标即可应用无需培训。支持微软系统平台,易于部署、安装和运维,保证系统可用性。...

    超级有影响力霸气的Java面试题大全文档

    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 19、同步和异步有何异同,在什么情况下分别使用他们?举例说明。  如果数据将在线程间共享。例如正在写的数据以后可能...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    word源码java-exchange-parent:数据交换

    exchange是要打造一个轻量级,高扩展性的数据交换平台,支持对结构化及无结构化的异构数据源之间的数据传输,在应用层上具有数据权限管控、节点服务高可用和多租户资源隔离等业务特性,而在数据层上又具有传输架构...

Global site tag (gtag.js) - Google Analytics