kafka netty_惠而浦:使用Netty和Kafka的微服务

kafka netty

介绍

在上一个博客中 ,我介绍了Netty用作Web服务器。 该示例运行良好……只要需要广播服务器即可。

大多数情况下不是很有用。 更有可能的是,每个客户端仅接收针对其的数据,并保留了特殊情况下的广播,例如“服务器在15分钟内停机!” 关于该特定服务器示例的另一件事是,一切都是独立的。 例如,单片应用程序很好,但是在当今环境中,分布式微服务要好得多。 可伸缩性和可靠性至关重要。

Netty和Kafka在一起很棒。 Netty擅长处理大量客户,Kafka擅长使大量服务协同工作。 结合起来,它们是开发中的最佳选择。 但是,有些“陷阱”可能会使其变得繁琐。 该博客以及示例微服务/ Netty体系结构和功能全面的代码将有望帮助减轻烦恼并实现甜味。

第一要务

示例代码位于此处 。

有详细的自述文件,描述了设置环境所需的内容。 我试图将需求降到最低,仅Java 8和Maven 。 SLF4J和Logback用于记录日志。 我为Mac OSX和Ubuntu设置了脚本(我在Parallels容器中运行的14.04版本是我测试过的脚本),因此如果您在Windows上进行开发,则表示歉意。 该代码全是Java,并且我在Windows上看到过Kafka教程,因此所有内容都应在此处运行。 Maven构建也应该产生可以启动的目标,因此,在安装Zookeeper / Kafka的时候加了一点肘油(您可以按照脚本查看需要的设置),手动运行它并不重要。视窗。

注:README.md中所述,该脚本将删除任何现有的Zookeeper / Kafka安装和数据。 如果您已有设置,请不要使用脚本!

安装和配置必备mvn package如果不使用脚本,请运行mvn package如果是,则运行maclocal_run.sh (或linuxlocal_run.sh )。 该脚本将下载Zk / Kafka(如果尚未下载),进行安装,配置,启动它们,运行mvn package ,启动服务并最终启动服务器。 一旦启动,就抵制离开外壳的冲动,因为它会自动为架构的每个部分弹出新的选项卡。 启动Whirlpool服务器之后,就可以开始了。

我强烈建议创建一个脚本,以在本地安装,配置,构建和启动微服务环境。 创建每个单独的服务是一个很大的痛苦。 必要时也可以使用Docker,但我发现只需本地运行所有内容,下载所需的内容就少得多。

作为一个预告片,这里是UI(您也可以从GitHub上的README.md看到它)。

漩涡浴

  • 要添加股票代码,请输入它(即“ GOOG”),然后单击“股票”下的A按钮。 要删除它,请单击X。
  • 要添加一个网站来测试它是打开还是关闭,请键入完全限定的URL(即http://facebook.com ),然后单击“ UpDown”下的A按钮。 要删除它,请单击X。
  • 要添加天气检查,请在中键入城市,州(即“芝加哥,il”),然后单击“城市,州”下的A按钮。 要删除它,请单击X。
  • 由于订阅与每个服务一起存储在内存中,因此订阅在页面刷新甚至登录/注销(具有相同的用户ID)后都不会丢失。 当然,“真实”系统将使用数据库。
  • 订阅每10秒钟更新一次,因此我不会压倒Yahoo API,因此添加数据后请耐心等待。

建筑

在此示例中,我试图考虑可能有用的良好通用服务。 我最终选择了股票报价服务,“此网站是否正常运转”服务以及气象服务。 这些中的每一个都独立于各自具有Kafka主题的其他主题运行。

我选择配置Kafka的方式是每个服务使用一个命令主题,每个服务使用一个数据主题。 一切都可以只使用一个全局主题,读者可以决定要处理的内容,但将其分离出来可以使其更加清晰和整洁。

这是数据如何通过Kafka流动的示意图。 它是通过一个免费的基于Keyhole的基于Web的实用程序Mockola完成的 。 请注意,服务器知道所有主题,但是服务仅知道它们自己的主题。 cmd主题用于将命令发送到服务,而数据主题(在其上没有-cmd主题)用于从服务发送数据。 同样,所有这些都可以在一个bus主题上进行处理,但是通过将它们分离出来,可以更轻松地了解发生了什么。

whirlpool_architecture

服务

现在让我们谈谈服务。 这三者非常相似,因此有一项基本服务可以完成大部分工作。 每个服务都有三个线程,由Java ExecutorService处理。 关于Executor服务的一件好事是,如果出现问题,它将自动重新启动线程。 这有助于弹性。

每个服务通过告诉基类使用什么主题和命令主题来启动自己。 然后,基类启动三个线程:一个用于从cmd主题读取命令,一个用于定期为客户端收集数据,一个用于在数据主题上发送数据。 这些线程使用非阻塞Java并发类ConcurrentLinkedQueueConcurrentHashMap 。 哈希映射存储每个用户的订阅集,队列存储准备发送给数据主题的响应。

每个服务的流程是同时工作的三个线程。 阅读器使用Kafka使用者从其命令主题读取命令。 根据命令,添加或删除订阅。 该线程非常笨拙,因为它不要求服务对请求进行任何验证,而只是盲目地将发送给订阅的内容添加进去。 生产代码显然会添加一个调用,要求服务在允许成功订阅之前验证命令。 创建一个响应以放置主题,然后等待下一个命令。

注意 :关于数据的一些话题。 我使用JSON作为传输格式,但是XML或您想要的其他任何内容也可以使用。 重要的是,每个人都同意数据格式并坚持使用。 通用模块具有POJO类,这些类定义了数据将遵循的协定。 通常对所有消息有用的是时间戳,消息类型和客户端的ID。

另一个有用的东西是到期时间戳。 这些示例消息永远存在。 Message类仅查看Message的类型和ID。 服务器使用它来确定需要处理哪种类型的消息以及谁对该消息感兴趣。 没有这些,就很难甚至不可能处理数据。 现在,消息格式可以涉及很多,其中一些格式使用标题和部分来描述复杂的数据。 本示例尝试使所有内容尽可能简单。

净值服务器

让我们一次上一堂课。

NettyHttpFileHandler

与以前的博客相比,该类几乎没有变化。 可重用的片段已移至WebSocketHelper类。 该文件的主要用途是提供浏览器要求的文件。

WebSocket助手

可能令人困惑的第一项是类变量clientAttr 。 在Netty Channel中存储数据要求将其附加到AttributeKey 。 这类似于Java并发类中的Atomic实例-它提供​​了数据容器。 我们将存储客户端ID(在本例中为用户名,但也可以很容易地作为会话ID),以便我们确定哪个Channel需要接收消息。

realWriteAndFlush()方法设置适当的标题,内容长度和cookie。 然后,它写入并刷新HTTP响应。 线

channel.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);

告诉Netty这是需要写入客户端的数据的结尾,因此Netty会将其发送出去。

特别说明 :关于cookie的创建,请确保未设置HTTP Only标志。 如果是,则JavaScript无法看到Cookie,也不会与WebSocket升级请求一起发送。 这样一来,您就必须创建自己的页面刷新管理和会话管理方法。

关于cookie的另一件事是使用Netty cookie编码器的STRICT版本,因此它将不允许多个具有相同名称的cookie。 我不确定何时允许这种情况发生。

WebSocketMessageHandler

这个类只是定义了一个接口WhirlpoolServerHandler使用交谈的WhirlpoolMessageHandler

WhirlpoolMessageHandler

这是Netty和Kafka之间存在连接的地方。 两个执行器处理一个读取器线程和一个写入器线程。

编写器线程在请求​​队列中查找消息(有关这些消息在一分钟内来自何处的更多信息),并将消息放置在适当的Kafka命令主题上。

阅读器线程在Kafka数据主题上查找传入消息,为每个主题查找正确的Channel,然后将消息写入这些主题。

当客户端通过WebSockets发送消息时, WhirlpoolServerHandler将确保已handleMessage()完整的消息,然后调用handleMessage() 。 该方法确定是否为有效消息,然后将请求添加到请求队列中,以便读取器线程可以将其提取并提供给Kafka。

WhirlpoolServerHandler

这堂课有几件有趣的事。 首先,它可以区分HTTP,REST和WebSocket消息之间的区别。 执行此操作的Netty重写方法是channelRead0 。 这是Netty用来告诉我们消息何时到达以及消息是哪种类型的方法。 对于HTTP和REST调用, handleHttpRequest调用handleHttpRequest ,对于handleWebSocketFrame将调用handleWebSocketFrame

如果存在cookie方法,则handleHttpRequest方法handleHttpRequest读取该cookie。 在POST上,它会查找登录和注销信息。 对于登录,它将找出用户名/密码,创建cookie,并防止多次使用相同的名称登录。 所有这些代码将在应用程序的生产版本中添加额外的安全性进行拆分。 要注销,它会查找Channel,清理,关闭它并使cookie过期。

对于WebSocketUpgrade ,它要求Netty处理启动websocket所需的复杂握手。 完成此操作后,会将用户添加到握手期间创建的Channel。 这是用户连接到Channel的地方,如果cookie没有在请求中出现,那将不是一件容易的事。

在此唯一需要注意的另一件事是,此类设置为处理为SPA(单页应用程序)编码的客户端,因为它将将所有无法识别的调用重定向到index.html

该类中的其他方法更多地是为了提供信息,将在高级情况下使用。

漩涡服务器

此类启动Netty服务器并创建通道管道。 这是Netty的一个标准类,紧随Netty示例。

最后的想法

显然,此代码中还有更多内容。 每个服务和服务器的多个实例可以同时运行,并且Zk / Kafka可以集群以帮助提高弹性。 一个测试微服务应用程序弹性的强大实用程序是另一个名为TroubleMaker的免费开源Keyhole实用程序。 我还没有机会测试这个例子,但是我很期待这个机会。

我们没有涉及安全性,尽管我以前希望展示Netty与Shiro的集成,但这是一个非常复杂的话题。 我只能说这是有可能的,但是我还没有将所有内容都包裹在脑海中,以至于无法形成一个连贯的博客。

希望您喜欢该博客,并找到有用的代码。 通过博客或Twitter与我联系( @johnwboardman ,在这里我总是很欣赏新的关注)。

翻译自: https://www.javacodegeeks.com/2016/05/whirlpool-microservices-using-netty-kafka.html

kafka netty

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HH SaaS电商系统的拼团系统设计

文章目录拼团业务流程拼团单实体拼团单的状态拼团型订单的销售状态注意点拼团业务流程 创建活动 管理后台创建拼团活动,设置好活动有效期、成团人数、成团时效、限购数量、活动对象、添加活动商品,设置团长价和团员价,活动开始后活动对象在买…

统信uos系统考试题_离Windows更近一步!微信Linux原生版上线:国产统信UOS系统已适配...

就在本月11号,国产操作系统-统信 UOS发布了专业版 V20(1030),功能更强大,同时性能和安全性均有所提升。而距离这个好消息过去没多久,统信软件官方再次发布了一个好消息:那就是微信桌面客户端(统信 UOS 版)研发完成&…

npm 引用子项目模块_Java / Web项目中的NPM模块Browser-Sync

npm 引用子项目模块Browser-Sync是一个方便的基于Node.js的NPM模块,可用于更快的Web开发。 浏览器同步可在许多设备之间同步文件更改和交互。 最重要的功能是实时重新加载。 我们也可以在Java / Web项目中使用Browser-Sync。 Cagatay Civici创造了一个伟大的 视频教…

xrd精修教程_XRD精修系列干货 | 带你领略晶体之美

1. XRD精修教程(一)——XRD精修基本原理与GSAS软件简介(附GSAS软件下载链接)点击上图即可查看全文X射线衍射分析(XRD)在研究材料的相结构、相成分等多个方面有广泛的应用,但最常用的多晶衍射法有个缺点:得到的谱峰重叠严重,从而造成大量材料结…

多个cpp文件生成so_C++:C++的文件搜索路径

在做大型工程的时候,除了有C语法知识之外,还要有工程能力。最先要具备的能力是:理解C文件的编译,链接过程。明白C头文件的搜索路径。本文,介绍C的文件搜索路径。对于C文件来说,主要有两种,一种是…

HH SaaS电商系统的店铺系统设计

文章目录为什么店铺运营模式要区分B2C、C2C、O2O?O2O店铺B2C店铺自营B2C店铺第三方B2C店铺C2C店铺为什么O2O店铺不允许售卖快递类的商品?B2C、C2C模式的自提和O2O的自提有什么区别?B2C、C2C模式的配送和O2O的配送有什么区别?为什么…

监听js变量的变化_JS监听事件型爬虫

点击上方“Python数据科学”,选择“星标公众号”关键时刻,第一时间送达!作者:zuobangbang来源:zuobangbang最近开始研究网页参数的JS加密,但是大型网站的JS文件过于繁杂,不适合新手上路&#xf…

HH SaaS电商系统的支付模块设计

文章目录支付单支付单状态流转逻辑说明支付相关实体支付流水记录支付方式支付渠道支付单 销售订单生成时,同步生成支付单,如果销售订单的应付金额由首付款和尾款组成,那么会生成两个支付单 支付单与销售订单的“联合单号”或者“退款单ID”关…

添加几个手机联系人_One UI 3.0: 更细腻、更好用,这才是手机系统该有的样子

作为全球出货量最多的 Android 手机厂商,三星宣布将于北京时间 1 月 14 日正式召开 2021 年度的新品发布会。伴随着 S21 的即将发售,我想借此机会和大家一起来聊一聊前不久刚刚推送正式版本的 One UI 3.0。One UI 3.0 是三星基于 Android 11.0 打造的新一…

HH SaaS电商系统的商城模块设计

文章目录好获SaaS电商系统层级关系商城实体商城运营模式商城可选子系统创建商城商城管理后台有供应系统和无供应系统的B2C和混合模式的商城系统对比有仓储系统和无仓储系统的B2C和混合模式的商城系统对比有店铺系统和没有店铺系统的商城系统对比商城关闭商家入驻通道B2C模式商城…

HH SaaS电商系统的物流单设计

业务说明 物流信息提交后,系统生成物流单,出库单与物流单是一对多的关系 退货时买家填写物流信息,提交后系统生成物流单和入库单,物流单需要保存入库单的id 物流单实体

pcl_openmap_OpenMap教程5 – 3层GIS应用程序

pcl_openmap1.简介 欢迎使用OpenMap系列教程的第5个教程。 OpenMap是一个免费的开源Java GIS库。 这是以前的教程列表: 在第一个教程中,我们创建了一个基本的OpenMap GIS应用程序,该应用程序在JFrame中显示一个从文件系统加载的具有一个形状…

HH SaaS电商系统的商品系统设计

文章目录商品信息结构商品信息总结构商品信息结构图发布商品商品类型虚拟商品服务商品为什么服务商品要分类前端根据服务商品类型来设计不同的界面和交互订单状态和服务类型有关商品档案上下架运营商品上下架(即商品营销上下架)删除商品租户删除自供商品…

HH SaaS电商系统移动端商城,买家选择商品规格的交互设计

文章目录未完整选择商品规格时商品图如何显示库存如何显示价格如何显示选择规格提示文案如何显示原型图已选完整选择商品规格时商品图如何显示库存如何显示价格如何显示原型图SKU下架后如何显示原型图购买数量如何交互未完整选择商品规格时 商品图如何显示 显示SPU的主图&…

aws lambda_适用于无服务器Java开发人员的AWS Lambda:它为您提供了什么?

aws lambda无服务器计算如何帮助您的生产基础架构? 在过去的几年中,无服务器计算架构一直受到关注,因为它专注于应用程序的主要组件之一:服务器。 这种体系结构采用了不同的方法。 在下面的文章中,我们将解释无服务器…

HH SaaS电商系统的销售订单毛利润模块设计

HH SaaS电商系统的销售订单利润分析,仅是简单分析供运营人员参考而已,所以订单生成后就自动根据商品成本价和实际交易价生成利润表,而不需要等到订单归档后才生成。 销售子单的毛利润最终交易总额-成本总额销售子单的毛利率毛利润/最终交易总…

eclipse preference没有server_Java Web开发的前期准备工作,部署Tomcat服务器和Server环境创建...

Java Web: 顾名思义,就是用Java的方式来解决Web开发,我也不讲太多的理论问题,直接将如何上手来进行Java Web开发。那么,我们一般进行Java Web开发,可以使用的工具很多,我这里使用eclipse。选择eclipse的版本…

java int不将0忽略_Java微服务:蛋糕是骗人的,但您不能忽略它

java int不将0忽略构建微服务实际上意味着什么? 通过微服务框架的眼光回答 忽略微服务的趋势已变得不可能。 有些人会说这只是另一个难以忍受的流行语,而另一些人会背诵打破巨石的优势或采取逆势方法并关注负面因素。 在本文中,我们将全面了…

4怎么放大字体_Word字体怎么放大?简单教你几招轻松搞定

一般情况下我们都会选择用Word编辑文章。文章编辑完成之后我们通常会对文章进行排版。在排版的过程中如果我们需要将Word字体放大该怎么办呢?下面我就来教大家几个Word字体放大的小技巧,一起来看看吧。下面以放大“字体演示”为例为大家演示操作过程。一…

js splice坑_JavaScript的splice()方法在for循环中使用可能会遇到的坑!!!

在我们日常敲代码的时候,常常会用到splice()方法来删除数组中的元素(就是以截取的方式),因为它会直接对数组进行修改。在使用splice之前,必备条件是,要先有一个数组。var arr new Array(1,2,3,4,5); // 初始化一个数组var delete…