如何优雅的编程——消息编程的分布式访问与微服务

     我理解的分布式访问与微服务是这样的,所谓分布式访问就是通过网络调用另一台机器上的模块或对象。所谓微服务,就是将一个程序的功能、模块拆解出来,放到另一台机器上运行,将一个大的程序拆解成小的服务单独运行,这方便系统的扩容及维护。

  在传统编程模式中,实现分布式访问、模块拆解成微服务是比较麻烦的,根本原因是对象之间的强耦合。在消息编程中,因为对象主要是通过消息来传递信息,因此消息编程天生具有分布式和拆解微服务的优势。现在我们实例看看如何的实现。

我们的实现要求:不修改代码就将一个程序中的模块拆解出来,放到另一台机器上运行,并实现原有的功能。现在以我们拿之前演示消息编程的一个案例——hello小明来实现,原案例文章见——统一对象消息编程(11)—对象消息编程框架应用2(demo—Hello小明)

  在hello小明案例中,我们演示了消息编程的基本模式。最新代码及配置见框架的demo/base/ ,配置文件目录/WEB-INF\classes\conf\demo\base 。程序运行逻辑流程如下:

 1、小明回家打开灯。

2、灯被打开,灯发消息给屋子。

3、屋子亮了,同时发消息给小明、妻子。

4  妻子正在睡觉,屋子亮了,她醒了。

5、屋子亮了后,小明开始上网。

程序通过消息配置、及自动传递实现上述过程。大概框图如下:

上面四个模块小明、妻子、屋子、灯都在一台机器内运行。现在我们要把上面的模式改成分布式或微服务,把妻子模块拆解出来放到另一台机器运行,框图如下:

原程序是单独一台机器内运行,无需网络。现在分开到两台机器,那么必然要加网络接口或模块。因为是屋子发消息给妻子,因此我们将屋子所在的原来机器为client端,妻子所在机器为service端。

现在分两步:

client (配置目录 \WEB-INF\classes\conf\demo\service\client):

  client端在原来的基础上,无需更改代码,在配置文件中增加网络访问模块 socketClientAgentPool,其配置文件为 socketClientAgentPool_config.xml 。内容如下:

<moduleConfig>
    <params>
        <defaultServer value="clientSocketServe" />
    </params>
    <servers>
        <!-- 如设定cerFile ,并且协议为wss 则启动ssl传输  -->
        <server name="clientSocketServe"  userType="username"  cerFile__="/mycerts.cer"
                url="ws://127.0.0.1:9081/ws" userName="tianlong118" userPasswd="12345"  autoConnect="false"  />
     </servers>
</moduleConfig>

 配置定义了妻子模块所在service端的网络参数 。屋子发消息的对象是妻子,现在如果不更改屋子的代码,如何实现通过网络给妻子发消息呢,我们还是通过配置,更改模块工厂的配置文件妻子对应的模块:

<modules>
    <!-- 用户自定义模块 -->
    <module name="appCenter" classfile=".base.MyAppCenter" configfile="appConfig.xml"/>
    <module name="house" classfile=".base.House"  singleton="true" />
    <module name="light" classfile="cn.tianlong.java.demo.base.Light" singleton="ture"/>
    <module name="xiaoming" classfile="cn.tianlong.java.demo.base.Person" />
    <!--module name="wife" classfile="cn.tianlong.java.demo.base.Person" /-->
    <module name="wife" proxyModule="socketClientAgentPool" configfile="socketClientAgentPool_config.xml" />
</modules>

   之前妻子wife的创建是通过本地的类cn.tianlong.java.demo.base.Person 来实例化的。现在更改为网络接口模块 socketClientAgentPool (proxyModule参数的意思是,当工厂实例化wife时,用proxyModule对应的类来实例化)。这里socketClientAgentPool模块冒充了妻子wife模块,这样任何发给wife的消息将发给模块socketClientAgentPool,对发送者屋子来说,该过程完全透明,屋子完全不知道它发送给wife的消息其实是发给了socketClientAgentPool,而socketClientAgentPool根据配置将消息发送到service端。再看service端:

service(配置目录WEB-INF\classes\conf\demo\service\server):

 在工厂配置中定义socketserver和wife 模块:

  <modulesParams>
      <!-- 如配置sslCerFile , 则启动ssl传输  -->
      <module name="clientSocketServer"    serverName="clientSocketServer" maxClient="5000"
              loglevel="debug"  nologtags="checkNoAuthChanaels"
              port="9081" hostname="127.0.0.1" sslCerFile__="/tomcat.keystore"  sslCerFilePwd="XXXXX"   />
      <module name="userManagerModule"   userType="username" logInOne="true"
              users ="taskuser:54321;tianlong118:12345"
              serverModuleName="clientSocketServer" />
      </modulesParams>
  <modules>
      <module name="wife" classfile="cn.tianlong.java.demo.base.Person" />
      <module name="clientSocketServer" proxyModule="webSocketServer" loglevel="trace"
              serverName="clientSocketServer" clientMsgHandler="clientMsgHandler"/>
  </modules>
      <factoryBoot>
         <msg destination="clientSocketServer" action="run"  waitFlag="false" usePreReturnMsg="false"/>
          <msg action="getModule"  moduleName="wife" usePreReturnMsg="false" />
        </factoryBoot>
</moduleConfig>

这里clientSocketServer 为我们要启动的server,它将接收来自client端的消息。这里wife 定义了具体的Person 类。client与server采用websocket的方式,server接收到屋子发来的消息,将消息传递给wife模块。

至此,我们没有修改任何代码,就将wife模块透明拆解出来运行在其他机器上了,同理,我们也可将小明、屋子、灯都拆解到不同的机器上运行。这就将原本一台机器上运行的程序变成了分布式或各微服务组成的的网络服务。随着网络负载的增大,通过增加服务代理接口,还可将再复制多个屋子、小明等。现在我们看运行情况:

首先,演示之前单程序的情况:

我们看到,wife模块和其他所有模块在一个程序内运行。

现在看看拆分之后的分布式模式:

1、首先服务端启动:

  wife模块启动,状态我睡觉,服务器运行,端口9081

2、client端启动:

比较单程序运行,没有wife模块的运行,现在再我们看服务端.:

这时服务端显示了wife的消息,说明屋子发送的消息通过网络透明的传给了wife。

到这里,我们轻松的实现了一个单一程序的分布式。或者说将一个大服务拆解成了多个小服务,而我们没有更改任何的代码 和业务逻辑。

案例代码见框架源码src\cn\tianlong\java\demo\service 下。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
pomelo 是由网易开发的基于node.js开发的高性能、分布式游戏服务器框架, 也可作为高实时web应用框架。 Pomelo的应用范围 pomelo最适合的应用领域是网页游戏、社交游戏、移动游戏的服务端,开发者会发现pomelo可以用如此少的代码达到强大的扩展性和伸缩性。当然还不仅仅是游戏,很多人断言未来的web时代是实时web应用的时代, 我们发现用pomelo开发高实时web应用也如此合适, 而且伸缩性比其它框架好。目前不推荐将pomelo用于大型的MMO rpg游戏开发,尤其是3d游戏, 还是需要象bigworld这样的商用引擎来支撑。 Pomelo的理念 pomelo的第一个理念是让游戏(高实时web应用)服务器的开发变得非常简单, 而不是解决某类算法或系统上的难题。这个设计理念跟rails是很类似的;第二个理念是重视性能和可伸缩性,用户用pomelo开发出来的游戏天生具有很强的伸缩性,扩展也很容易。我们在性能优化上也花了很多功夫,并且会持续进行;第三个理念是让第三方很容易扩展,框架用了很多插件式的设计, 组件component、路由规则、甚至管理控制台都可以完全由第三方扩展。 Pomelo的框架组成 pomelo包括三部分: 框架, pomelo的核心, 与以往单进程的游戏框架不同, 它是高性能、分布式的游戏服务器框架,并且使用很简单 库, 包括了开发游戏的常用工具库, 如人工智能(ai), 寻路, aoi等 工具包, 包括管理控制台, 命令行工具, 压力测试工具等 pomelo特性 快速、易上手的游戏开发模型和api 高可伸缩的多进程架构, 支持MMO的场景分区和其它各类分区策略 方便的服务器扩展机制,可快速扩展服务器类型和数量 方便的请求、响应、广播、服务器通讯机制, 无需任何配置 注重性能,在性能、可伸缩性上做了大量的测试、优化 提供了较多扩展组件,包括游戏开发常用的库和工具包 提供了完整的MMO demo代码(客户端html5),可以作为很好的开发参考 基于socket.io开发,支持socket.io支持的多种语言客户端 为什么使用pomelo? 高并发、高实时的游戏服务器的开发是很复杂的工作。跟web应用一样, 一个好的开源容器或开发框架可以大大减少游戏开发的复杂性,让开发变得更加容易。遗憾的是目前在游戏服务器开发领域一直没有太好的开源解决方案。 pomelo将填补这个空白, 打造一款完全开源的高性能(并发)游戏服务器框架。 pomelo的优势有以下几点: 架构的可伸缩性好。 采用多进程单线程的运行架构,扩展服务器非常方便, node.js的网络io优势提供了高可伸缩性。 使用非常容易, 开发模型与web应用的开发类似,基于convention over configuration的理念, 几乎零配置, api的设计也很精简, 很容易上手。 框架的松耦合和可扩展性好, 遵循node.js微模块的原则, framework本身只有很少的代码,所有component、库、工具都可以用npm module的形式扩展进来。任何第三方都可以根据自己的需要开发自定义module。 提供完整的开源MMO游戏demo参考(基于HTML 5)。 一个超过1万行代码的游戏demo,使开发者可以随时借鉴demo的设计与开发思路。 在线演示:http://pomelo.netease.com/demo.html 标签:开发框架  游戏框架

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值