做一个分布式、跨语言、跨平台、敏捷 需要那些技术做支撑?

  做了7年的开发了,时间越久越是发现自己需要一个像标题写的那样的一个架构做为整个平台的支撑。

  我的技术种类又是.net开发,总觉得.net技术人才容易出现瓶颈;其实这种瓶颈更像是这种环境造成的。简单快捷的开发本来就是.net所追求的,而这种追求导致整个语言平台在技术上都喜欢用最直接简单的方法解决问题,至于架构,可维护,持续升级,还是等项目上线或是出了问题之后再说。成熟、稳健并被公认的技术架构似乎每个做技术的都是见仁见智,都有自己独立的理解,而像java一样ssh等成熟公认的架构在业界基本寥寥无几,也许你会把三层架构拿出来说事,但是我个人觉得,三层只适合做中小型项目。

  废话少说,直接切入主题,分布式,在我的理解看来,要解决几个问题(注:很多核心主键我将不限)数据库、会话、缓存、项目之间的通信、跨语言、同步等等。而这些问题在java环境中有各种各样的核心组件可以解决。而组件之间似乎大家都统一用spring做为中间的调和剂。而.net 这方面相对要欠缺一些,所以数据访问层需要自己实现支持访问不同数据库,支持分表,支持虚拟表访问,借助taobao的tddl,自己准备开发一个ddl.net,.net版的分布式数据访问层,借助.net 的异步访问,实现分库分表的多线访问并合并数据集。项目之间的通信我选择thrift,这样解决了跨语言和项目的目的。而缓存选择memcached,它也是我分布式会话的核心只是会话存储的内容是json数据格式,这样也解决了不同语言开发时候会话数据的统一格式。消息队列messagequeue,选用MSMQ。.net 的中间调和剂比较丰富,而且特点各一。最终我还是选择了spring.net毕竟是java比较成熟的产品,在.net平台下也不会差到哪里去。而且spring.net也自带了和mvc、wcf、windowservices等无缝集成的事例代码,可以说是完美的了,唯一的确定就是配置有点多,这个时候肯定要选择一个比较好的代码生成器,在现有的代码生成器中我没有找到好用的于是自己在已有大代码中改了一个,代码生成基于项目配置,基础数据由数据库中产生,支持sqlserver、mysql、oracle单代码生成和数据库无关只与配置相关,所以代码生成器可以离线工作。模块文件也是以项目为独立单元,所以一个代码生成器可以配置各种项目类型,并且模版也是相互独立的。这样也比较适合团队开发和代码规范。这样由于架构的灵活造成的大量代码问题也得以解决。然后是文件服务器,我现在的考虑是由thrift直接存储到对应的服务器中,再由文件服务器中的自动同步代码同步到不同服务器中。搜索也是独立的模块,Lucene.net 是基础库,ZoieNet(由java的项目修改过来,现在还没有发布)做real time index。当然做为行业垂直搜索引擎,在搜索的数据结构上根据不同的需要来做相应的调整。前端现在的工作量也是呈现爆炸式的增长。于是乎我选择了Combo.Net(自己开发的中间件),这样让组件方式的封装前端成为可能。

这是按照这个架构搭建的项目

驾驭 metronic 前端轻轻松松

http://www.hxteservices.com

下面附上部分代码:

ddl.net --配置不同的数据源

<atom-datasource
      name="group_test_3_001"
      provider="sqlServer4.0"
      property="sqlServer"
      connectionString="data source=${datasource};database=${database};user id=${userid};password=${password};connection reset=false;connection lifetime=5; min pool size=1; max pool size=50"
      />
    <atom-datasource
      name="group_test_4"
      provider="MySql"
      property="MySql"
      connectionString="data source=${datasource};database=${database};user id=${userid};password=${password};connection reset=false;connection lifetime=5; min pool size=1; max pool size=50"
      />

--数据库分组,读写分离配置 及相关权重配置

    <group-datasource name="ds_1_001" type="sqlserver">
      <settings>
        <atom name="group_test_1_001" weight="r10w10p0q0"/>
        <atom name="group_test_2_001" weight="r10w10p0q0"/>
        <atom name="group_test_3_001" weight="r10w10p0q0"/>
      </settings>
    </group-datasource>

combo.net

@using Combo;
@using Combo.Mvc;

--在插件内应用相应的js

@{
Html
//<!-- BEGIN CORE PLUGINS -->
.RequiresJs("jquery.min.js", HomeGlobal.ScriptCorePlugin, 101)
//<!-- END CORE PLUGINS -->

//<!-- BEGIN PAGE LEVEL SCRIPTS -->
.RequiresJs("frontend/layout/scripts/layout.js", HomeGlobal.ScriptPageLevel, 10006)
//<!-- END PAGE LEVEL SCRIPTS -->
;
}

<!--html 插件要用的html-->

--插件需要写入的html段

@{
Html.RequiresScript(@"
jQuery(document).ready(function () {
Layout.initFixHeaderWithPreHeader(); /* Switch On Header Fixing (only if you have pre-header) */
Layout.initNavScrolling();
});"
, 100);
}

生成好的代码

<script src="http://jac.hxteservices.com/combo.axd/assets/global/plugins/??jquery.min.js,jquery-migrate.min.js,bootstrap/js/bootstrap.min.js?v=1004.js" type="text/javascript"></script><script src="http://jac.hxteservices.com/combo.axd/assets/global/plugins/??fancybox/source/jquery.fancybox.pack.js,carousel-owl-carousel/owl-carousel/owl.carousel.min.js,slider-revolution-slider/rs-plugin/js/jquery.themepunch.revolution.js,slider-revolution-slider/rs-plugin/js/jquery.themepunch.tools.min.js?v=1004.js" type="text/javascript"></script><script src="http://jac.hxteservices.com/combo.axd/assets/??frontend/layout/scripts/back-to-top.js,global/scripts/fromserialize.js,global/scripts/mvcparammatch.js,frontend/pages/scripts/revo-slider-init.js,frontend/layout/scripts/layout.js?v=1004.js" type="text/javascript"></script>

        <script type="text/javascript">
            jQuery(document).ready(function () {
                Layout.init();
            });
        </script>

http://www.hxteservices.com

这个网站就是由它做的。生成好的前端代码绝对好看。而且它的功能还远不止这些。

--spring.net 配置文件

<context>
  <resource uri="file://~/App_Data/Config/Spring/thrift.config"/>  <!--thrift 集成-->

  <resource uri="file://~/App_Data/Config/Spring/controller.config"/><!--MVC -->

  <resource uri="file://~/App_Data/Config/Spring/persistence.campus.config"/> <!--数据库-->
  <resource uri="file://~/App_Data/Config/Spring/controller.campus.config"/>

  <resource uri="file://~/App_Data/Config/Spring/persistence.classify.config"/>
  <resource uri="file://~/App_Data/Config/Spring/controller.classify.config"/>

  <resource uri="file://~/App_Data/Config/Spring/persistence.ccenter.config"/>
  <resource uri="file://~/App_Data/Config/Spring/controller.ccenter.config"/>

  <resource uri="file://~/App_Data/Config/Spring/persistence.ucenter.config"/>
  <resource uri="file://~/App_Data/Config/Spring/controller.ucenter.config"/>
</context>

将项目按模块,一一区分开,并且将不同技术更灵活的集成在一起

代码生成器--包括配置文件的生成,和模块项目的生成。

只需要配置一次,允许脱机运行,支持多种数据库且基于项目,并随着项目的发展,模板,备注也会相应跟进,更适合团队开发

时间: 05-26

做一个分布式、跨语言、跨平台、敏捷 需要那些技术做支撑?的相关文章

写了一个分布式名字服务JCM

之前在公司里维护了一个名字服务,这个名字服务日常管理了近4000台机器,有4000个左右的客户端连接上来获取机器信息,由于其基本是一个单点服务,所以某些模块接近瓶颈.后来倒是有重构计划,详细设计做了,代码都写了一部分,结果由于某些原因重构就被终止了. JCM是我业余时间用Java重写的一个版本,功能上目前只实现了基础功能.由于它是个完全分布式的架构,所以理论上可以横向扩展,大大增强系统的服务能力. 名字服务 在分布式系统中,某个服务为了提升整体服务能力,通常部署了很多实例.这里我把这些提供相同服

Apache Thrift 跨语言服务开发框架

Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 IDL 来定义 RPC 的接口和数据类型,然后通过代码生成工具来生成针对不同编程语言的代码,目前支持 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCa

Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要哪些组件的支持? 四.如何安装? 五.Golang.Java.Python.PHP之间通过Thrift实现跨语言调用 1) Golang 客户端和服务端的实现及交互 2) python 客户端的实现与golang 服务端的交互 3) php 客户端的实现与golang 服务端的交互 4) java

如何做一个小型公司的技术总监

本文在腾讯内部论坛被浏览达7347次,收藏615次,评论几百条,曾经是讨论最热烈的项目管理文章之一.作为作者本身,感觉这个话题可以讨论的范围非常大,希望能有更多朋友一起切磋探索技术团队的管理之道. 资深程序员是团队中最强大的生产力,但往往被不合理的工作安排浪费掉.因此作为一个团队的技术的"头",必须要有明确清晰的认识,把主要的事务性工作剥离出来.并且放弃大量的管理"权力",以提高团队开发质量和效率为最主要的目标去安排自己的工作.一般来说技术总监其实会被要求做事实上是

Atitit.跨语言反射api&#160;兼容性提升与增强&#160;java&#160;c#。Net&#160;&#160;php&#160;&#160;js

Atitit.跨语言反射api 兼容性提升与增强 java c#.Net  php  js 1. 什么是反射1 1.1.       反射提供的主要功能:2 1.2.       实现反射的过程:2 2. 类反射中所必须的类: 的类反射所需要的类并不多,它们分别是:Field.Constructor.Method.Class.Object,2 3. . 反射的用处3 3.1. 可视化 3 3.2. 系统的灵活性.可扩展性 3 3.3. Json xml序列化3 3.4. 函数指针3 3.5. R

CLS(公共语言规范)的CLSCompliant(跨语言调用)

.net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:用C#写的一个类,编译到dll中,然后在VB.net中调用: using System;namespace CLSsample{ public class CLSTest {  public CLSTest()  {     }  public void ABC()  {   Console.WriteLine("ABC");  } }} 在VB.net中调用:Dim c As CLSsampl

比较跨语言通讯框架:Apache Thrift和Google Protobuf

前两天想在微博上发表一个观点:在现在的技术体系中,能用于描述通讯协议的方式很多,xml,json,protobuf,thrift,如果在有如此众多选择的基础上,在设计系统时,还自造协议,自己设计协议类型和解析方式,那么我只能说,您真的落后了,不是技术上,而是思想上.对于xml,和json我们不做过多描述了,参考相关文档就可以了.特别是json,如今在 web系统,页游系统的前后台通讯中,应用非常广泛.本文将重点介绍两种目前在大型系统中,应用比较普遍的两种通讯框架,thrift和Protobuf,

《从零开始做一个MEAN全栈项目》(1)

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 在本系列的开篇,我打算讲一下全栈项目开发的优势,以及MEAN项目各个模块的概览. 为什么选择全栈开发?     对于初学者来说,学习一门新的语言和技术的体验总是让人愉快的,也会满足于掌握了一些新的东西并且解决了一些实际问题.在一个小组中采用全栈开发时,你可以更加有效地把握项目全局概念,这也有利于让你了解项目中的不同模块以及它们之间是如何协同工作的.你会对你们的产品中他人的贡献更加清晰,你也就了解了这款产品如何

基于Thrift的跨语言、高可用、高性能、轻量级的RPC框架

功能介绍 跨语言通信 方便的使Java.Python.C++三种程序可以相互通信 负载均衡和容灾处理 方便的实现任务的分布式处理 支持服务的水平扩展,自动发现新的服务节点 能够兼容各种异常情况,如节点的异常down机 可视化管理 通过服务管理系统可以方便查看服务状态和统计信息 与原生thrift通信 支持与原生thrift服务进行通信 与业内方案的对比 与thrift.avro.hessian相比,harpc支持了高可用,并且更加易用 与dubbo相比,harpc支持了跨语言,并且更轻量级 与i