文档结构  
可译网翻译有奖活动正在进行中,查看详情 现在前往 注册?
原作者:Sean Wiley (2016-08-09)    来源:Dzone [英文]
CY2    计算机    2016-08-10    0评/1438阅
翻译进度:已翻译   参与翻译: 負愚侕歸 (7)

本文描述了如何创建高性能的聊天应用程序,可以做为微服务.这里的微服务,我将使用 Caucho 的 Baratine (v 1.0) 框架来做演示:

  1. 创建 .jars 而非.wars
  2. 异步非阻塞方法
  3. 发布/订阅功能
  4. 高性能与可扩展
  5. 基于API编程
  6. 使用单线程来解决多线程中的并发问题

仅供参考, 最近DZone中使用WebSoket构建聊天室的详细内容,可以在这里找到: https://dzone.com/articles/creating-websocket-chat. 这篇文章让人快速上手WebSocket,是一个很好的入门, 这个聊天应用程序使用了流行的Baratine开源框架,可以帮助开发者获得业内最佳实践.

第 1 段(可获 1.49 积分)

运行该示例

想要运行示例,需要做如下操作:

  1. 确保你已经安装了 Gradle 
  2. 从资源库下载: https://github.com/swily/WebSocketChat.git
  3. 执行 gradle build
  4. 执行 gradle run
  5. 打开浏览器并输入 localhost:8080

文件概要

这个程序包含几个 POJO 类, 大部分的工作是由下面的三个文件完成:

index.js / index.html – 显示聊天信息和聊天室

ChatWebSocket.java – 监听websocket连接,连接管道并接收PubSub消息

ChatService.java – 支持长轮询, 启动 Baratine 服务器

第 2 段(可获 1.2 积分)

ChatWebSocket.java

ChatWebSocket 依赖于Baratine实现的 WebSocket 协议. 为了进一步使用 WebSocket, 我们对Message做了参数化处理,用于实现ServiceWebSocket . Message 是我们定义的类,用于在WebScoket中通讯.

除了监听WebSocket端口, 我们在Baratine内部设置了自己的PubSub 消息 . PubSub 在 Baratine 有三个组件:

  1. Pipe代理
  2. Pipe订阅者 (PipeSub)
  3. Pipe发布者 (PipePub)

你会注意到,我们使用 了_messagePipeHandler, 当用户离开聊天室时调用close方法.

第 3 段(可获 1.33 积分)

按照如下步骤可以设置管道:

  1. 创建 PipeSub用于指明信息从管道流出到哪里,在我的项目中,我想让信息流到 OnPipeReceive 方法中. 我使用lambda表达式实现了这个.
  2. 我通过管道代理实例从PipeSub进行订阅.
  3. 断开链接后需要关闭管道.

下面就是设置管道:

Screen Shot 2016-08-05 at 3.56.47 PM

第 4 段(可获 0.99 积分)

ChatService.java

ChatService 负责创建 ChatMessages 并将信息传递到管道. 该方法非常简单; 另外如果扫阅代码,可以得出三个要点:

  1. 在发送方法上使用 @Query 注解,它支持HTTP 长轮询回滚机制. 此方法可以被WebSocket客户端直接调用,或者通过HTTP调用.
  2. 我们的主方法使用了 Baratine  (Web.include(foo.class)) 为了让Baratine 服务端访问这些类.
  3. Baratine的 Result 是异步非阻塞式的回调. 相反的,一个方法完成处理并调用 .ok() 就是同步的.

为了启动我们的Baratine web服务器,可以调用Web.start(),例如:

Screen Shot 2016-08-05 at 3.57.09 PM

第 5 段(可获 1.48 积分)

性能

如下的测试结果是在 MacBook Air Core i7 3667U 电脑上进行测试的 :

  • 2千万 消息/秒/实例 不需要确认消息

  • 9百万 消息/秒/实例 需要确认消息

  • 6百万 消息/秒/实例 完全双向,并对每个消息的确认

Baratine可以达到这个成绩,可以归功于自动的批处理与使用单线程方案. 更重要的是, 在类上加入 @Service 注解就可以 创建一个无锁且有序处理消息服务. Because 就是这样, 它不需要同步代码块用于解决并发; 数据只能由单个线程服务访问, 从而解决了并发访问.

实际上, 由于它对底层编程模型进行了改进, Baratine可以在内部保存数据,而无需在外部定义与落地. Baratine拥有已经授权的MySQL数据库驱动程序, 但大部分的程序与服务需要操作内存数据,所以在需要的时候Baratine会帮你持久化内部数据.

第 6 段(可获 2.29 积分)

结束语

Baratine 1.0 正式版基于 GPL 许可发布了,现如今敏捷开发非常火,他们做了很多改进,并对许多问题进行修复。开发者可以通过 Baratine, 快速的编写API, 用于不同语言(JSON也可以)实现的物联网客户端之间的交流. 这个应用程序可以被嵌入到企业级的java程序中,或做为一个独立的服务. 对应用程序而言,这就是微服务拥有的特色,在加入或删除时,并不会影响整个体系结构.

你现在的web应用程序中, 实现聊天功能对你来说并非必须, 而我希望大家可以在这个示例中,学习它的底层的架构,在需要的时候使用它.尽情的在GitHub上下载吧,接着继续开发!

第 7 段(可获 1.96 积分)

文章评论