1.速读“消息中间件”架构体系-ActiveMQ:入门+原理分析+优缺点!接收
2.消息驱动交易系统单中心假死--ActiveMQ不生产也不消费
3.springboot用到了哪些技术?
4.盘点 35 个 Apache 顶级项目,消息消息我拜服了…
速读“消息中间件”架构体系-ActiveMQ:入门+原理分析+优缺点!源码
ActiveMQ,分析作为Apache开源的接收JMS实现,专为分布式系统设计,消息消息歪歪动漫源码旨在构建高可用、源码高性能和可扩展的分析企业级消息服务。它通过JMS规范,接收实现异步通信,消息消息使不同应用或分布式系统间无缝协作。源码
JMS,分析即Java消息服务,接收提供平台无关的消息消息API,允许跨应用程序间的源码消息传递,如ActiveMQ等MOM(消息导向中间件)就是其典型代表。MOM通过消息传送提供者协调操作,客户端通过API发送消息,消息在接收方确认前由提供者暂存。
JMS规范的核心目标是统一标准,解决不同中间件间的交互问题,包括连接工厂、JMS连接、会话、目的地、生产者和消费者等对象模型。点对点和发布/订阅模式是消息的主要类型,前者一对一,后者支持事件驱动。
安装ActiveMQ可选择Windows的命令行启动或Docker镜像,Spring Boot集成则展示了其与现代应用框架的兼容性。快速入门包括配置和测试,消息队列和主题的区别在于持久化订阅的处理方式。
ActiveMQ支持同步和异步发送,同步确保消息安全但性能较低,异步提高效率但可能有消息丢失风险。ProducerWindowSize用于限制消息积压。源码分析深入到连接建立、transport结构和发送机制,包括消息同步与异步的区别以及持久化策略。
ActiveMQ的优缺点明显,适合对TPS要求不高的系统,易于开发且监控方便。但吞吐量低、无内置分片功能,不适用于处理海量消息或高并发场景,这时可能需要外部扩展或自定义解决方案。
消息驱动交易系统单中心假死--ActiveMQ不生产也不消费
面对交易系统单中心假死的挑战,运维同事迅速应对,将生产流量引导至备用中心,确保了系统在短暂停顿后的稳定运行。然而,这一事件揭示了ActiveMQ作为消息中间件的核心地位,以及在特定架构下可能出现的隐患。为了解决这一问题,我们分析了问题现象、故障证据,并逐步深入故障定位,最终找到并解决根本原因。
一、问题现象
系统单中心假死,ActiveMQ消息队列中积压了大量未被消费的消息,消费者无法继续消费,生产者也无法继续生产,导致大量新订单积压,解析源码接口影响了系统的处理效率。这一现象的出现,暴露了ActiveMQ在特定架构下的瓶颈,以及系统设计中的潜在风险。
二、故障证据
通过日志分析,我们发现ActiveMQ的流量控制机制触发了内存限制,导致生产者被阻塞。这表明,尽管系统配置了较大内存值,但在特定条件下,消息队列的积压仍可能引发性能问题。
三、故障定位
在排查过程中,我们发现ActiveMQ的内存设置存在问题,导致流量控制机制过早激活。深入分析代码后,我们发现ActiveMQ通过限制生产者在内存满载时的生产速率来避免队列积压,以及在消费者无法进行有效消费时,主动暂停生产者的生产行为,以达到平衡队列中消息的流动。然而,这一机制在我们的特定场景下未能有效发挥作用,原因在于消费者未能及时确认消费的消息,导致生产者被无限制地阻塞。
四、问题深挖
通过深入源码分析,我们发现ActiveMQ客户端在接收到服务端的流量控制信号后,会阻塞在等待锁的获取过程中,从而导致消费者无法确认消息已被消费,进而影响生产者的正常运行。这一问题的根源在于ActiveMQ客户端与服务端之间的通信机制,以及在特定情况下锁管理的不足。
五、问题解决
为了解决上述问题,我们采取了以下措施:
1. 调整ActiveMQ的内存设置与流量控制参数,以适应系统负载变化。
2. 对数据库执行计划进行优化,确保在不同负载下都能选取最优执行路径。
3. 为生产者与消费者使用不同的连接,避免共享连接时的性能瓶颈与同步问题。
通过这些措施,我们不仅解决了单中心假死的问题,还提升了系统的整体性能与稳定性,确保了交易系统的高效运行。这一事件也提醒我们,在设计和优化系统时,需要充分考虑消息中间件的特性与限制,以及系统架构的潜在风险,以确保系统的稳定与高效。
springboot用到了哪些技术?
「SpringBoot实战」视图技术-Thymeleaf
在一个Web应用中,谨桐滑通常会采用MVC设计模式实现对应的模型、视图和控制器,其中,视图是用户看到并与之交互的界面。对最初的Web应用来说,视图是由HTML元素组成的静态界面;而后期的Web应用更倾向于使用动态模板技术,从而实现前后端分离和页面的动态数据展示。SpringBoot框架为简化项目的整体开发,提供了一些视图技术支持,并主要推荐整合模板引擎技术实现前端页面的动态化内容。本文对SpringBoot常用的Thymeleaf进行整合。
Thymeleaf是一种现代的基于服务器端的Java模板引擎技术,也是提交网页源码一个优秀的面向Java的XML、XHTML、HTML5页面模板,它具有丰富的标签语言、函数和表达式,在使用SpringBoot框架进行页面设计时,一般会选择Thymeleaf模板。我们在这里学习Thymeleaf常用的标签、表达式。
Thymeleaf标签
使用标签只需要加上一个命名空间就可以了。即修改原html的第二行就可以了。
变量表达式${ ..}主要用于获取上下文中的变量值,示例代码如下。
这是标题
-使用了Thymeleaf模板的变量表达式${ ..}用来动态获取p标签中的内容-如果当前程序没有启动或轮散者当前上下文中不存在title变量,该片段会显示标签默认值“这是标题”;-如果当前上下文中存在title变量并且程序已经启动,当前p标签中的默认文本内容将会被tite变量的值所替换,从而达到模板引擎页面数据动态替换的效果。
Thymeleaf为变量所在域提供了一些内置对象
结合上述内置对象的说明,假设要在Thymeleaf模板擎页面中动态获取当前国家信息,可以使用#locale内置对象
选择交量表达式和变量表达式用法类似,一般用于从被选定对象而不是上下文中获取属性值,如果没有选定对象,则和变量表达式一样,示例代码如下。
消息表达式#{ ..}主要用于Thymeleaf模板页面国际化内容的动态替换和展示。使用消息表这式#{ ..}进行国际化设置时,还需要提供一些国际化配置文件。关于消息表达式的使用,下文写国际化时会详细说明。
链接表达式@{ ..}一般用于页面跳转或者资源的引入,在Web开发中占据着非常重要的地位,并且使用也非常频繁。
片段表达式~{ ..}是一种用来将标记片段移动到模板中的方法。其中,最常见的用法是使用th:insert或th:replace属性插入片段
SpringBoot默认设置了静态资源的访问路径,默认将/**所有访问映射到以下目录。
我们创建一个springboot项目用于本次实验。项目名为springboot__thyme。java8,springboot2.6.6
创建一个LoginController类用于数据替换效果测祥腊试。
我们写一个login.html进行测试。我们导入一个bootstrap的样式到static/login里面,并且自己定义一些css。
最后我们通过访问可以查看效果
在resources目录下创建名为in的文件夹,数一数这个单词多少个字母internationalization,就知道为什么叫in了。
然后我们在in文件夹下面创建login.properties、login_zh_CN.properties、login_en_US.properties文件。
目录结构:这个ResourceBundle'login'时idea自动创建的,我们不需要管,只需要完成我们的就行。
login.properties
login_zh_CN.properties
login_en_US.properties
然后我们在配置文件application.properties里面添加代码
我们在config包下面创建一个MyLocalResovel类,自定义国际化功能区域信息解析器。
这里我们基本就完成了,但是在访问中文的时候会出现乱码现象。
我们打开idea的file-settings-fileEncodings.
将Defaultencodingforproperties的编码改为utf-8,同时勾选Transparentnative-to-asciiconversion
然后我们重新编写login.properties和其他相关的
但是这种方法1只对当前项目有效。下次创建还是使用GBK编码
本文我们主要了解了Thymeleaf的基本语法、标签、表达式、基本使用、同时还实现了页面登录页得国际化。
本文作者:hjk-airl
本文链接:
基于sprigboot构建web前端页面采用什么技术实现
spring-boot适合开发web应用的静态资源访问在我们开发Web应用的时候,需要引用大量的sklearn svc源码js、css、等静态资源。默认配置SpringBoot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:/static/public/resources/META-INF/resources举例:我们可以在src/main/resources/目录下创建static,在该位置放置一个文件。启动程序后,尝试访问页面的时候,要如何实现呢?模板引擎在动态HTML实现上SpringBoot依然可以完美胜任,并且提供了多种模板引擎的默认配置支持,所以在推荐的模板引擎下,我们可以很快的上手开发动态网站。SpringBoot提供了默认配置的模板引擎主要有以下几种:ThymeleafFreeMarkerVelocityGroovyMustacheSpringBoot建议使用这些模板引擎,避免使用JSP,若一定要使用JSP将无法实现SpringBoot的多种特性,具体可见后文:支持JSP的配置当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。当然也可以修改这个路径,具体如何修改,可在后续各模板引擎的配置属性中查询并修改。ThymeleafThymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于ApacheLicense2.0许可,由DanielFernández创建,该作者还是Java加密库Jasypt的作者。Thymeleaf提供了一个用于整合SpringMVC的可选模块,在应用开发中,你可以使用Thymeleaf来完全代替JSP或其他模板引擎,如Velocity、FreeMarker等。Thymeleaf的主要目标在唯没于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过指谈纳验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这些标签属性就会在DOM(文档对象模型侍纳)上执行预先制定好的逻辑。
学springboot之前要学什么1.Spring?Boot?是什么
我们刚开始学习?JavaWeb?的肆卖孙时候,使用?Servlet/JSP?做开发,一个接口搞一个?Servlet?,很头大,后来我们通过隐藏域或者反射等方式,可以减少?Servlet?的创建,但是依然不方便。
再后来,我们引入?Struts2/SpringMVC?这一类的框架,来简化我们的开发?,和?Servlet/JSP?相比,引入框架之后,生产力确实提高了不少,但是用久了,又发现了新的问题,即配置繁琐易出错,要做一个新项目,先搭建环境,环境搭建来搭建去,就是那几行配置,不同的项目,可能就是包不同,其他大部分的配置都是一样的。
Java?总是被人诟病配置繁琐代码量巨大,这就是其中一个表现。那么怎么办?Spring?快递通知源码Boot?应运而生,Spring?Boot?是?Pivotal?团队在??年开始研发的一个基于?Spring?的全新框架,试图将?Spring?中臃肿的配置进行简化,使?Java?开发更加轻量与快速,这个框架非常活跃,官方也非常重视。
Spring?Boot?主要提供了如下功能:
为所有基于?Spring?的?Java?开裂链发提供方便快捷的入门体配芹验。
开箱即用,有自己自定义的配置就是用自己的,没有就使用官方提供的默认的。
提供了一系列通用的非功能性的功能,例如嵌入式服务器、安全管理、健康检测等。
绝对没有代码生成,也不需要XML配置。
Spring?Boot?的出现让?Java?开发又回归简单,因为确确实实解决了开发中的痛点,因此这个技术得到了非常广泛的使用,大概从??年年初开始,Spring?Boot?基本上面试必问,现在流行的?Spring?Cloud?微服务也是基于?Spring?Boot,因此,所有的?Java?工程师都有必要掌握好?Spring?Boot。在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
从?Spring?Boot?诞生的过程中,我们可以看到:
Spring?Boot?并非另起炉灶,而是在现有的?Spring?框架的基础上整出来的,它把?Spring?中繁琐的配置进行了简化。
Spring?Boot?降低了?Spring?家族的使用门槛,使新手更易上手?Spring?框架。
既然?Spring?Boot?不是另起炉灶,那么?Spring?Boot?学习要不要跳过?SSM?呢?听松哥来分析。
2.要不要跳过?SSM
这是很多人问我的一个问题,我的建议是:不要。
Spring?Boot?基于?Spring,简单且容易上手,很多人想当然的跳过?SSM?直接上?Spring?Boot。但是当我们细究?Spring?Boot?中的自动化配置、条件注解、Java?配置等东西时,实在找不出太多新鲜玩意,Java?配置是?Spring3?开始提供的,条件注解?也是?Spring?中的东西,很多很多,都是?Spring?中就有的,只不过这些东西在?Spring?Boot?时代大放异彩。
也就是说,即使你跳过了?SSM?直接去学习?Spring?Boot,实际上还是在学习?Spring?中的东西,那既然这样,我们还不如坐下来,老老实实把?Spring?过一遍。
各个领域的开发工程师其实都会面临类似的问题,学习了一些优秀的封装框架之后,还有没有必要去学习底层?当然有必要!因为底层的东西可以让你深刻的理解你目前用的这个东西,也能让你在出问题时快速解决掉问题。
其实无论你想搞什么技术,都要有牢固的基础知识,这些牢固的基础知识就像肥沃的土壤,可以孕育出各种不同技术方向的牛人,基础掌握好了,学什么框架都快。今天你跳过?SSM?直接学了?Spring?Boot,假如有一天?Spring?Boot?不行了,Pivotal?团队又基于?Spring?框架搞了一个新的框架出来,那你是不是又要去学一遍?但是如果你一开始就掌握了?Spring?的各种用法,无论基于它搞出来什么样的框架,你都能快速上手。更进一步,如果你研究透了?Spring?中的?AOP、Ioc/DI,你会发现很多框架大同小异,核心思想就是这些东西,那么你在学习?Spring?之外的框架,就会容易很多。
3.都要学哪些
那么?Spring?Boot?学习都要学哪些东西呢?我这里列举了一个进阶路线:
最基础的当然是?Spring/SpringMVC?相关的东西了。
搭配各种页面模版的使用,例如?Jsp/Thymeleaf/Freemarker/Groovy?Templates?等。
和各种?SQL?数据库的整合,以及一些常见的数据持久化框架,例如?JdbcTemplate、MyBatis、Jpa?等。
和各种?NoSQL?数据库的整合,例如?Redis、MongoDB、Elasticsearch?等。
搭配安全管理相关的知识点,例如?Spring?Security、Shiro?等。
缓存的使用,例如?JCache、Ehcache?等。
和消息中间件的搭配整合,如?ActiveMQ、RabbitMQ、Kafka?等。
数据校验/定时任务/邮件发送等。
各种监控的使用。
结合?WebSocket?的使用。
Spring?Cloud?中相关组件。
上面这些只是我列出来的一些比较常见的技术点,每个技术点都还可以延伸出很多其他的东西,大家可以结合自己的情况,按照顺序一个一个来学,这里边还涉及到很多第三方的框架,例如?Redis、MongoDB、RabbitMQ?等,Spring?Boot?的出现只是让这些组件在和?Spring?家族的产品整合时变得更加方便,但是并不会简化这些组件原本的用法,所以,该学?Redis、该学?MongoDB、该学?RabbitMQ?等等,还是一个不能少。以?Redis?为例,学会了?Redis,学会了?Spring?整合?Redis,再回过头来看?Spring?Boot?整合?Redis,那简直太?easy?了。
当然,学习?Spring?Boot?最终我们还是奔着快速开发和微服务去的,所以,像?Docker、Spring?Cloud?等技术,也是需要去了解一下的。
4.怎么学
Spring?Boot?发展到今天,网上的资料和图书现在是越来越多了。在看资料学习的同时,大家也要留意以下几个点:
多看源码。不同于其他全新的框架源码你可能会看懵了,由于?Spring?Boot?是基于?Spring?的,所以只要你?Spring?基础扎实,看?Spring?Boot?源码可以说是毫无压力。如果看?Spring?Boot?源码觉得有压力,那可能你?Spring?基础不牢靠,这个时候不妨放下?Spring?Boot,去复习下?Spring。
每当学会?Spring?Boot?中的一个知识点,不妨想想这个功能在?Spring?框架中要如何使用,如何配置,两边都搞懂了,互相印证,加深对一个知识点的理解。
多多关注?Spring?Boot?的发展动态。不同于传统的框架可能一年更新一两次,Spring?Boot?更新非常频繁,二次每次更新都会带来一些好玩的东西,可能会有新的?API?加入进来,也可能会有旧的?API?失效,变化大,因此多多关注,避免掉坑。
最后,我这里给大家列举几个我自己经常关注的几个资源。
4.1?官方文档
老实说,Spring?Boot?的官方文档是我接触的所有官方文档中最条理清晰浅显易懂的,大家做开发,多多少少都接触过一些第三方的开放平台,很多平台的文档真是让人忍不住想吐槽,框架都做出来了,认认真真写个文档有那么难么?
不过?Spring?Boot?的官方文档可以算是非常非常友好了。虽然是英文的,但是实际上对英文要求并不高,连读带猜,其实很容易明白它的含义,我一般对?Spring?Boot?中某个知识点有疑问的时候,都是首选官方文档,当然,如果你嫌官方文档打开慢,也帮你下载好了最新版的?pdf。
盘点 个 Apache 顶级项目,我拜服了…
Apache软件基金会,全称为Apache Software Foundation(ASF),成立于年7月,是世界上最大的最受欢迎的开源软件基金会,是一个非营利性组织,专门支持开源项目。
目前,ASF旗下有超过+亿美元的价值,为开发者提供免费的开源软件和项目,惠及全球数十亿用户。
接下来,我们将盘点Apache软件基金会旗下的个顶级项目,这些项目在日常开发过程中常常遇到,有的可能已经使用过,而有的则值得学习了解,为未来项目提供参考。
1. Apache(httpd):Apache HTTP Server,中文名阿帕奇,是一个开源的HTTP服务器,支持在UNIX和Windows系统上运行。它自年4月起成为互联网上最受欢迎的web服务器,年2月庆祝了其岁生日。适用于HTML、等静态资源服务,类似于Nginx,但Nginx功能更为强大。
2. Tomcat:Apache开源的Java应用服务器,支持Java Servlet、JavaServer Pages、Java Expression Language和Java WebSocket技术。尽管近年来存在安全漏洞,但因其开源、免费的特性,仍被广泛应用于Java领域,成为主流应用服务器。
3. Commons:包含一系列Java公共组件的项目,提供Java核心API的额外组件,如StringUtils等。提供个实用的类库,极大地方便了Java开发。
4. POI:提供了一系列Java API对Microsoft Office格式文件进行读写处理,如Excel、Word、PowerPoint等文件的读写,功能强大。
5. HttpComponents:提供了HTTP及相关协议的Java组件和工具集,包括HttpCore、HttpClient、HttpAsyncClient,其中HttpClient是常用的HTTP客户端。
6. Logging services:包含Apache的日志服务,如Log4j,是使用最广泛的日志框架,还有Log4j 2、log4php、log4cxx等其他语言的日志框架。
7. Ant:一个较为老的Java项目编译和构建工具,虽然已经较少使用,但依然存在一定的价值。
8. Maven:是一个主流的软件项目管理工具,提供项目自动编译、单元测试、打包、发布等生命周期管理。
9. Subversion:一个开源的版本控制软件,用于代码版本控制、文件版本控制,几乎每个开发者都使用过。
. Struts:一个免费开源的MVC框架,用于创建Java web应用程序,曾风靡一时,但由于漏洞问题,已逐渐被Spring MVC、Spring Boot等替代。
. FreeMarker:是一个基于Java的模板引擎,允许使用简单而强大的模板语言引用Java代码中的对象来生成HTML页面、电子邮件、配置文件、源代码等。
. Velocity:一个基于Java语言的模板引擎,允许使用模板语言引用Java对象生成文本输出。尽管长期未更新,不再被Spring Boot 1.5.x版本支持,但仍推荐使用其他模板引擎。
. Tapestry:一个在Java Web开发界知名的面向组件的Web框架,用于创建高度可伸缩的Web应用程序。
. Shiro:一个功能强大且易于使用的Java安全框架,提供身份验证、授权、加密和会话管理等功能,有助于快速、轻松地开发和保护企业应用程序。
. Dubbo:阿里巴巴开源的分布式服务框架(RPC),曾停止维护后又重启维护并捐献给Apache软件基金会,现在在许多企业中仍大量运用。
. Thrift:一款优秀的、轻量级的RPC框架,最初由Facebook开发,后捐献给Apache软件基金会。支持多种语言,具备高度可扩展性。
. Zookeeper:一个分布式中间件神器,最初由Google Chubby的一个开源实现,主要用途包括配置中心、分布式锁等,支持高度可靠的分布式服务协调中间件。
. Curator:Zookeeper的Java客户端,提供一系列高级API和工具,简化了Zookeeper操作,易于使用。
. SkyWalking:一个可观测性分析平台和应用性能管理系统,提供分布式跟踪、指标监控、性能诊断、度量汇总和可视化的一体化解决方案。
. ShardingSphere:由一组分布式数据库中间件解决方案组成的开源生态系统,包括JDBC、Proxy、Sidecar(计划中),提供数据分片、分布式事务和数据库编排功能。
. Lucene:顶级的开源搜索框架,包括核心搜索库(Lucene core)和搜索服务器(Solr),提供强大的索引和搜索功能。
. ActiveMQ:一款灵活、强大的多协议开源消息中间件,支持JMS 1.1&2.0,目前最流行的Java消息中间件之一。
. RocketMQ:一款重量级、极具竞争力的消息队列产品,由阿里巴巴于年开源,年捐赠给Apache软件基金会,年正式毕业。
. Kafka:一款重量级开源项目,最初由LinkedIn公司开发,后捐献给Apache软件基金会。它是一种分布式、高吞吐量的发布订阅消息系统,能够实时处理大量数据。
. Hadoop:一种高可靠、可伸缩、分布式大数据处理框架,也是大数据行业公认的标准框架。
. HBase:建立在Hadoop HDFS上的非关系数据库,用于大数据存储,适用于随机、实时的读写访问。
. Pig:一个基于Hadoop的大数据分析平台,提供类似SQL的面向数据流的高级语言Pig Latin,用于执行Map Reduce任务。
. Hive:一个基于Hadoop的数据仓库工具,用于提取、转化和加载数据,可以将Hadoop原始结构化数据映射为Hive表,并提供类似SQL的HiveQL语言查询功能。
. Spark:一个用于大规模数据处理的统一分析引擎,支持无边界和有边界数据流上的有状态计算。
. Flink:一个分布式处理引擎框架,用于无边界和有边界数据流上的有状态计算,设计用于在所有常见的集群环境中运行。
. Storm:一个分布式实时计算系统,能够轻松可靠地处理数据流,类似于Hadoop的实时批处理。
. Cassandra:一款可伸缩、高可用、高性能去中心化的分布式数据库,最初由Facebook为了解决消息收件箱搜索问题而设计。
. CouchDB:一个面向文档的分布式数据库,以JSON作为存储格式和查询语言,提供直观可靠的RESTful API接口。
. Groovy:一个功能强大的基于JVM平台的动态编程语言,语法与Java相似,但更简洁、易于学习和高效。
. NetBeans:一款开源开发工具(IDE),集成开发环境和应用框架,支持Java、JavaScript、PHP等编程语言,最初由SUN公司开发,后被Oracle收购并捐赠给Apache软件基金会。
总结:这些顶级项目涵盖了基础组件、Web、分布式、搜索、消息中间件、大数据/数据库、编程语言、工具等多个领域,为Java生态系统的发展做出了巨大贡献。尽管有些项目面临淘汰,但它们都曾经辉煌过,正是这些开源项目推动了Java生态的繁荣。希望本文的分享对大家在日常开发中有所帮助。