
java web 知识汇总
文章平均质量分 76
介绍java web 的前端,后端知识。
方丈的寺院
个人网站@ stone-fang.cn
公众号@方丈的寺院
展开
-
应用启动加速-并发初始化spring bean
随着需求的不断迭代,服务承载的内容越来越多,依赖越来越多,导致服务启动慢,从最开始的2min以内增长到5min,导致服务发布很慢,严重影响开发效率,以及线上问题的修复速度。所以需要进行启动加速。...原创 2022-07-21 08:44:13 · 1129 阅读 · 1 评论 -
单机高并发模型设计
在微服务架构下,我们习惯使用多机器、分布式存储、缓存去支持一个高并发的请求模型,而忽略了单机高并发模型是如何工作的。这篇文章通过解构客户端与服务端的建立连接和数据传输过程,阐述下如何进行单机高并发模型设计。...原创 2022-07-09 08:50:17 · 584 阅读 · 2 评论 -
API接口性能优化总结
在web开发过程中,经常会遇到接口RT高的情况,除了通过监控事后优化的方式,我们还需要掌握一些常用的手段,避免写出慢的接口。从前端发起调用到后端一般经过网关层、应用层、存储层。每一层都可以优化,本篇文章主要是应用层优化。原创 2022-05-20 22:30:30 · 991 阅读 · 1 评论 -
应用缓存预热方案设计
背景随着业务的发展,微服务越来越多,缓存相关的场景也比较多,通常的做法是基于缓存数据库(如redis),client来进行缓存操作。这样的问题有两个如果更换缓存数据库改造成本比较高对于批量查缓存、缓存穿透等场景没有统一实现,逻辑分散所以需要一个统一的缓存框架。另外针对一些活动、大促场景需要对缓存数据进行预热。所以需要设计一套通用的预热系统。所谓预热,其实就是提前请求数据,使缓存生效。缓存和预热有关联,但是可以设计成独立的两套系统。缓存框架目标是实现去除样板代码getDataWith原创 2022-05-18 07:53:28 · 994 阅读 · 3 评论 -
微服务如何划分
摘要作为团队架构师/技术负责人你该如何进行微服务的划分呢?在以前的文章中讨论过这个话题,可落地的DDD(4)-如何利用DDD进行微服务的划分(2),最近结合在不同的开发团队实践,又有了新的思考,相比较之前的基于DDD会更加全面,也欢迎大家留言讨论。为何要划分微服务微服务架构被广泛用于互联网公司,其优势在于每个服务足够小,相互之间具备隔离性。配合一些基础设施,能够使得需求快速迭代上线。但是每个服务的粒度应该多大呢,服务之间的关系应该是怎样的呢?首先我们来探讨一下微服务划分的目标。微服务划分涉及到两个对原创 2022-03-06 11:27:30 · 12201 阅读 · 2 评论 -
mapstruct解放Java对象转换
摘要当前web后端开发,都是使用多层工程结构,需要在VO,BO,DTO,DO等各种数据结构中相互转换。这些转换代码都是些比较简单的字段映射,类型转换,重复性工作比较高,可以使用一些工具解放我们的双手技术方案实现类转换的方案很多,不同方案有优缺点,需要开发者自行取舍方案优点缺点手写代码1. 灵活性高 2.方便后续重构1. 重复性工作多 2. 手写代码容易遗漏掉有些字段BeanUtils.copyProperties 使用反射实现1. 使用简单 2. Apache 的包原创 2020-08-02 12:10:20 · 728 阅读 · 0 评论 -
深入浅出Spring MVC
Spring MVC 的常见扩展点工作原理基于java的MVC框架众多,早些年比较火的有struts,spring mvc常见扩展点HandlerMapping接口 – 处理请求的映射保存请求url到具体的方法的映射关系,,我们可以编写任意的HandlerMapping实现类,依据任何策略来决定一个web请求到HandlerExecutionChain对象的生成。SpirngMVC的第二个扩展点 HandlerInterceptor 接口--拦截器 HandlerIntercep.原创 2020-05-31 11:01:11 · 1267 阅读 · 0 评论 -
rocketmq初识
概念说明通常一个消息队列需要掌握的知识点有Topic(主体)、Producer(生产者)、Consumer(消费者)、Queue(队列)、Delivery Semantics(消息传递范式)蛋疼的是不同的消息队列关于这些名词叫法不一样,含义也不是很精确。所以阿里起了一个项目OpenMessaging去发起首个分布式消息领域的国际标准。不过好像并没有多少人买账,但这并不妨碍我们按照这个规范去梳理学习消息队列的知识。有兴趣的可以对照着看:https://github.com/openmessaging/s原创 2020-05-28 23:08:39 · 2465 阅读 · 0 评论 -
线上故障处理手册
摘要通常处理线上问题的三板斧是重启-回滚-扩容,能够快速有效的解决问题,但是根据我多年的线上经验,这三个操作略微有些简单粗暴,解决问题的概率也非常随机,并不总是有效。这边总结下通常我处理应用中遇到的故障的解决方案。原则处理故障的时候必须遵循的一些原则提早发现问题,避免故障扩散故障的出现链路一般如下图所示每一层都有可能出现问题,越底层出现问题,影响面越大。所以每一个层次都需要有相应的问题监控机制,这样越早发现问题,越能尽早解决故障,避免问题的扩散。比如服务依赖的一个数据库主库有问题了,如果等原创 2020-05-27 22:14:11 · 1009 阅读 · 0 评论 -
数据迁移(2) - 如何快速迁移
摘要在上一篇中我们介绍了数据迁移的套路,但是没有介绍具体的方案,这篇着重介绍下具体的数据迁移方案一. 设计目标设计一个数据迁移的方案,需要实现以下目标迁移速度qps 需要达到1k,这样能保证1亿的数据能够在1~2天内跑完迁移qps可控迁移有可能对线上服务有影响,需要可动态调整qps数据完整,不丢失不能遗漏数据,虽然事后我们有数据校验的过程,但是设计数据迁移方案时,需要尽可能的包装数据不丢失。进度可控迁移过程可中断,可重试。比如先迁移10分之一的数据,再继续来二.原创 2020-05-17 21:36:09 · 841 阅读 · 0 评论 -
数据迁移的套路
数据迁移的类型随着业务的发展,存储也会经常性的需要迁移。以下场景是我们开发过程中经常遇到的业务、团队在快速扩张,需要适当时机进行微服务的拆分,需要独立的数据库,将数据从源数据库迁移到新的数据库单表的记录数比较大,需要进行分库分表。需要将老表的数据迁移到新的分表中。存储选型不对,比如关系型数据库的相互迁移, PG, MySQL,Oracle的相互迁移。NoSQL的Mongo,Cassand...原创 2020-05-04 11:56:12 · 835 阅读 · 1 评论 -
居然要周末加班才解决这个问题
摘要万万没想到,最近的一个任务居然在一周没有解决,弄得周六在家忙了一天,还没完成,直到周日早上灵光一闪,才完成了。坦白讲,我已经好久没有过这种体验了,被一个技术问题困扰了好几天,如此这般茫然失措,不过好在最后问题解决了。虽然这个任务可能你不会遇到特别相似的,但是我还是想把问题的解决过程分享给大家,顺便聊聊如何解决技术问题。问题背景需要将一个开源的python项目接入到公司的微服务体系(主要是...原创 2019-10-30 22:10:55 · 5085 阅读 · 7 评论 -
http服务端架构演进
摘要在详解http报文相关文章中我们介绍了http协议是如何工作的,那么构建一个真实的网站还需要引入组件呢?一些常见的名词到底是什么含义呢?什么叫正向代理,什么叫反向代理服务代理与负载均衡的差别有了nginx,为啥还需要LVS都有哪些负载均衡的方式服务端演进在前面文章中我们介绍过最简单的一种客户端-服务端响应模式,如下这是http服务最简单的一种形式,服务端就一层web服务...原创 2019-10-20 20:44:18 · 2810 阅读 · 0 评论 -
guava缓存批量获取的一个坑
摘要Guava Cache是Google开源的Java工具集库Guava里的一款缓存工具,一直觉得使用起来比较简单,没想到这次居然还踩了一个坑背景功能需求抽象出来很简单,就是将数据库的查询sthMapper.findById(Long id)的结果缓存起来。但同时还有批量请求,为了提高效率,肯定要批量查询数据库,sthMapper.findByIds(Collection ids)对于的...原创 2019-10-14 21:45:19 · 2257 阅读 · 3 评论 -
线程池管理(1)-为什么需要线程池
摘要为什么需要线程池呢,没想明白这个问题,看再多线程池的源码都没有用,先要知道线程池技术解决了什么问题,才能看的懂源码。因为所有的代码都是为了解决问题问题抛几个问题,看看你是否知道,不知道的话,可能你对线程池的理解还不够深入,还是一知半解。...原创 2019-05-04 15:51:46 · 1682 阅读 · 10 评论 -
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct (no Creators)
摘要记录下使用lombok遇到的反序列问题,一开始在lombok1.16.18中并没有发现,然后应用中没有指定lombok全局版本,引入的其他二方包将lombok版本提升到了1.16.20,然后报错。因为这个问题需要允许时才能发现,很可能会造成线上故障,所以不能等到出现问题时才发现,需要提前知晓。错误栈com.fasterxml.jackson.databind.exc.InvalidDef...原创 2019-04-14 12:33:18 · 18381 阅读 · 0 评论 -
领域模型驱动开发(1)
摘要习惯了MVC模式,习惯了敏捷开发,习惯了了小步快跑,还适合谈论领域驱动开发吗。领域开发是否就是慢节奏的开发, 本文结合自己的开发经历,和大家聊聊这个话题。一.业务代码是如何写烂的java web开发通常都是mvc模式,从早期的ssh主键到Spring+ Mybatis。所以通常一个工程的项目结构图就是controllerservicemanagerdao问题1:...原创 2018-06-17 20:47:18 · 2632 阅读 · 0 评论 -
Springboot 配置多数据源Mybatis的UnderScore不生效
摘要本文是一篇问题解决经验分享的文章。因为在网上没有搜到相关的介绍文章,而在遇到这个问题的解决过程中,犯过一些想当然的错误,所以记录在此,希望能够对后面遇到此问题的朋友有所帮助问题参考官方文档进行了相关配置。https://github.com/mybatis/spring-boot-starter/blob/master/mybatis-spring-boot-autocon...原创 2018-04-27 22:09:50 · 9176 阅读 · 0 评论 -
Java Web开发常用工具
摘要本篇是工具类总结文章,不包含深度分析,仅个人从业数年的一些总结,希望能够对你有帮助。本文不定期更新,如果你有好的工具也可以推荐给我系统相关everything :window平台非常快捷的搜索工具pushbullet 跨平台,PC浏览器,APP直接的一个同步APP,可以多人协作。不过有可能因为是国外的软件,有时候同步比较慢,比较着急google docs : 非常方便写...原创 2018-04-19 22:22:12 · 1427 阅读 · 0 评论 -
数据库连接(2) - 为什么C3P0连接池那么慢
摘要承接上篇数据库连接(1)从jdbc到mybatis,介绍下数据库连接池技术为什么需要连接池在上一篇中我们介绍说客户端建立一次连接耗时太长(建立连接,设置字符集,autocommit等),如果在每个sql操作都需要经历建立连接,关闭连接。不仅应用程序响应慢,而且会产生很多临时对象,应用服务器GC压力大。另外数据库server端对连接也有限制,比如MySQL默认151个连接(实际环...原创 2018-04-15 21:15:48 · 6411 阅读 · 0 评论 -
数据库连接(1)-从JDBC到MyBatis
摘要因为有持久层框架,和Spring的存在,越来越多的人对数据库连接这块不甚了解,只知使用方便,不知其原理。所以写一个数据库连接的系列文章,总结下本人在数据库连接方面遇到的问题,和对数据库连接的理解。JDBCjdbc:Java DataBase Connectivity,Java 数据库连接,一套标准的Java API,用来执行SQL语句。这套命名应该是很老了,毕竟将Data Ba...原创 2018-03-18 22:02:29 · 2355 阅读 · 0 评论 -
SpringBoot 加载不出来application.yml文件
摘要记录一次SpringBoot加载不出来application.yml文件的问题解决过程问题配置了application.yml文件,但是映射到properties bean的时候失败@ConfigurationProperties( prefix = "com.fs")public class DemoProperties { private Str原创 2018-02-01 22:43:34 · 83015 阅读 · 3 评论 -
ERROR [com.alibaba.druid.pool.DruidDataSource] - abandon connection
摘要本文描述了如何解决一个Druid connection 泄露的问题,因为过程有些曲折,就详细记录下解决步骤与思路,如果对你有所帮助与启发,请留言项目结构MyBatis+TDDL问题https://github.com/FS1360472174/javaweb/issues/58 ERROR [com.alibaba.druid.pool.DruidDataS原创 2018-01-28 20:38:45 · 49290 阅读 · 0 评论 -
解决一个远程主机强迫关闭连接的bug
摘要本文描述了如何解决一个rpc调用发生的问题,旨在提供一种解决思路,而不是一个具体的问题解决方案问题描述通过dubbo调用一个API时,间歇性的出现远程主机强迫关闭连接的问题 java.io.IOException: 远程主机强迫关闭了一个现有的连接。 at sun.nio.ch.SocketDispatcher.read0(Native Method)原创 2018-01-20 16:13:47 · 10445 阅读 · 0 评论 -
mongo driver类加载导致的错误
摘要一次类加载导致的错误,之所以要记录下来,是因为错误的发现不是在本地开发环境或者预部署环境,而是在生产环境。这应该是个易于重现的问题,但是不知道为什么直到生产环境部署时才报错。问题Unsatisfied dependency expressed through constructor parameter 3: Could not convert argument value of type [co原创 2017-07-22 10:40:07 · 1156 阅读 · 0 评论 -
Warning maven relocated xml-apis to 1.0.b
maven 依赖在maven项目中,一些基础的jar包被引用多次是很常见的事情。maven选择jar的版本是基于 - 依赖深度浅的 比如C项目依赖xml.jar。C依赖的B也引入了xml.jar。那么优先选择C中指定的 - 如果依赖深度一样,第一次依赖的jar被选中实际项目开发,一般是exclude掉B项目中的xml.jar,在C项目中显示指定xml.jar的版本。<dependency>原创 2017-07-01 11:29:35 · 3053 阅读 · 0 评论 -
cassandra 堆外内存管理
为什么需要堆外内存呢单有一些大内存对象的时候,JVM进行垃圾回收时需要收集所有的这些对象的内存也。增加了GC压力。因此需要使用堆外内存。java 分配堆外内存org.apache.cassandra.utils.memory.BufferPool也有相应的实现方法 private static ByteBuffer allocate(int size, boolean onHeap) {原创 2017-04-09 15:11:29 · 3167 阅读 · 0 评论 -
Spring Boot 中应用Spring data mongdb
摘要本文主要简单介绍下如何在Spring Boot 项目中使用Spring data mongdb.没有深入探究,仅供入门参考。 文末有代码链接准备安装mongodb 需要连接mongodb,所以需要提前安装mongodb.在本地安装安装文档见官网 install mongodb安装完mongodb后配置环境变量。创建目录“C:\data\db”作为mongo 数据存储的默认文件 注意本篇文章原创 2016-09-10 12:48:45 · 1354 阅读 · 0 评论 -
JDK 源码学习——ByteBuffer
ByteBuffer 在NIO的作用Java SE4 开始引入Java NIO,相比较于老的IO,更加依赖底层实现。引入通道(Channels),选择器(selector),缓冲(Buffers).都更加接近操作系统执行I/O的方式.所以速度更快。NIO 是非阻塞IO,非阻塞IO的实现是基于事件的,选择器定义了一个IO通道,程序继续运行。选择器上发生事件时,会唤醒选择器并执行相应动作。IO...原创 2016-08-07 13:33:50 · 2209 阅读 · 0 评论 -
Anakia 转换xml文档为其他格式
一.简介 Anakia 使用JDOM 和Velocity将XML文档转换为特定格式的文档二.解析xml文档方法1.DOMjava jdk,xml-api.jar 需要加载整个xml文档来构建层次结构2.SAX(Simple API for XML)基于事件模型,不需要读取整个xml文档3.JDOM(Java-based Document Object Model)本身不包含解析器,通常使用SAX原创 2016-01-05 18:23:28 · 1249 阅读 · 0 评论 -
introduction of velocity
introduction of velocity一.velocity 简介基于java 的模板引擎,apache 旗下的开源软件项目。 目的在于隔离 表示层和业务逻辑层,当然现在做的不仅仅是这些。二.应用场景web 应用程序:创建html页面,页面的动态信息有velocity框架来处理 意味着可以不使用JSP等动态语言源代码生成:基于模板生成java,sql源代码email 生成:将邮件模原创 2016-01-04 13:55:04 · 821 阅读 · 0 评论 -
Eclipse中设置VM参数
eclipse.ini-Xms256m //设置堆最小值-Xmx1024m //设置堆最大值Eclipse做JVM 的分析时,需要动态设置JVM的参数来进行各种测试,可以在下图地方进行设置JVM Parameter Settinghttp://www.oracle.com/technetwork/java/javase/tech/vm原创 2016-04-13 22:00:18 · 18621 阅读 · 0 评论 -
gradle 入门介绍
gradle ????Groovy??????????,?maven????????????xml?????script????gradle ???????build.gradle ????,build.gradle ????maven?pom.xmlbuildscript { repositories { mavenCentral() maven {原创 2016-07-22 17:40:26 · 1868 阅读 · 0 评论 -
ajax post请求request.getParameter("")取值为null
写一个简单的ajax 请求,发现通过request.getParamter(“”)取到的值为null 前台代码:$(document).ready(function(){ $("#ajax").click(function(){ var depart="depart"; $.ajax({ url :path+ "/AjaxR原创 2015-03-29 15:34:39 · 16609 阅读 · 0 评论 -
Java读取properties文件
1.jsp页面展示代码<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% User user=(User)request.getAttribute("user");%>读取property文件读取proper原创 2015-01-31 18:09:43 · 1356 阅读 · 0 评论 -
基于Struts+Hibernate开发过程中遇到的错误
1.import javax.servlet.http.HttpServletRequest 导入包出错导入包出错,通常是包未引入,HttpServletRequest包是浏览器通过http发出的请求, 需要将tomcat/lib 目录下的 servlet-api.jar导入。但是导入后仍然不行,重启eclipse也无法让他生效最后通过 project -clean来生效的。原创 2014-05-18 13:22:09 · 1486 阅读 · 0 评论 -
完整剖析SpringAOP的自调用
摘要spring全家桶帮助java web开发者节省了很多开发量,提升了效率。但是因为屏蔽了很多细节,导致很多开发者只知其然,不知其所以然,本文就是分析下使用spring的一些注解,不能够自调用的问题。因为本身这类文章很多,所以有些地方不会详述,直接引用其他文章。问题使用了Spring中哪些注解不能进行自调用为什么代理了就不能自调用Spring常用的 @Cache, @Async,@T...原创 2019-09-16 20:05:11 · 847 阅读 · 0 评论 -
详解http报文
摘要作为一个web开发者,每天都在使用者Http协议,却总是一知半解。本文参看Http RFC7230规范,梳理了http报文部分。http 报文构成start-line: 起始行,描述请求或响应的基本信息*( header-field CRLF ): 头CRLF[ message-body ]: 消息body,实际传输的数据header起始行起始行的格式就是start-lin...原创 2019-09-30 21:30:04 · 7011 阅读 · 1 评论 -
2019秋-走的太久忘记了为什么出发
其实我一直都是敏感的人,没事就爱琢磨生活,思考人生的,完了还要用文字记录下来,用来回味复盘。这就像敏捷开发中的retro,2个星期一个迭代,就得做一次复盘,总结下过去的二周做的好与不好。但是这篇文档纠结了很久到底要不要写,先说说纠结的原因吧。内心纠结我一直是个纯粹的人,或者企图保持纯粹的人。我希望我的工作和生活分开,技术和人生分开,不喜欢掺杂在一起。以前分享出来的文章都是技术相关的,...原创 2019-09-29 21:36:11 · 1875 阅读 · 5 评论 -
深入分析Mybatis 使用useGeneratedKeys获取自增主键
摘要我们经常使用useGenerateKeys来返回自增主键,避免多一次查询。也会经常使用on duplicate key update,来进行insertOrUpdate,来避免先query 在insert/update。用起来很爽,但是经常踩坑,还不知为何。本篇就是深入分析获取自增主键的原理。问题首先摘两段我司一些老代码的bug批量插入用户收藏for (tries = 0; trie...原创 2019-09-07 13:33:27 · 2526 阅读 · 0 评论