java
文章平均质量分 93
-无-为-
做过开发,创过业,踩过坑。从Java后台开发,PL/SQL开发,Pro*C开发,到shell脚本,再到兼职开发的MySQL DBA。
为人友善诚恳,工作踏实,吃苦耐劳,富有朝气,激情,以及团队合作意识。
https://github.com/zhouxx1055
https://zhouxx.blog.csdn.net/
展开
-
科普文:springcloud之-Ribbon
Ribbon的负载均衡,主要通过LoadBalancerClient来实现的,而LoadBalancerClient具体交给了ILoadBalancer来处理,ILoadBalancer通过配置IRule、IPing等信息,并向EurekaClient获取注册列表的信息,并默认10秒一次向EurekaClient发送“ping”,进而检查是否更新服务列表,最后,得到注册列表后,ILoadBalancer根据IRule的策略进行负载均衡。原创 2024-07-28 09:34:48 · 527 阅读 · 0 评论 -
科普文:分布式架构中的三高:高并发、高性能、高可用
所谓的水平伸缩,指的是不去提升单机的处理能力,而是使用更多的服务器,将这些服务器构成一个分布式集群,通过这个集群,对外统一提供服务,以此来提高系统整体的处理能力。此外,还有外部环境引发的不可用,比如促销引来大量用户访问,导致系统并发压力太大而崩溃,以及,黑客攻击、机房火灾、挖掘机挖断光缆,各种情况导致的应用不可用。比如用更快频率的 CPU,用更多核的 CPU,用更大的内存,用更快的网卡,用更多的磁盘组成一台服务器,使单台服务器的处理能力得到提升。增加同样的费用,并不能得到同样的计算能力。原创 2024-07-27 22:54:54 · 614 阅读 · 0 评论 -
实战:在Spring Boot中使用线程池
线程池管理多个线程,但当线程发生异常时,线程池会如何处理这些线程呢?当线程池中的线程遇到异常时,常见的处理策略包括线程销毁和线程复用。线程池是一种管理和复用线程的机制。它预先创建一定数量的线程,当有任务需要执行时,可以从池中取出线程来处理,处理完后再将线程返回池中。Java中的ThreadPoolExecutor默认会销毁异常线程并创建新线程,但开发者可以自定义afterExecute方法来实现复用异常线程的策略。在这个示例中,asyncMethod将会在一个独立的线程中执行,而不是在调用它的线程中。原创 2024-07-27 22:46:48 · 586 阅读 · 0 评论 -
实战:Redis实现排行榜、点赞和关注功能的基本操作
关注功能是社交网络中的核心功能,用户可以关注其他用户以获取其动态。Redis的集合(Set)数据结构也适合实现关注功能,分别用两个集合存储每个用户的关注列表和粉丝列表。:使用有序集合(Sorted Set),其中成员是用户ID或项目ID,分数是对应的积分或权重。:使用集合(Set),一个集合存储关注列表,一个集合存储粉丝列表。原创 2024-07-27 22:39:20 · 396 阅读 · 0 评论 -
科普文:11个后端API接口性能优化技巧
对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题。该问题说简单也简单,说复杂也复杂。有时候,只需加个索引就能解决问题。有时候,需要做代码重构。有时候,需要增加缓存。有时候,需要引入一些中间件,比如mq。有时候,需要需要分库分表。有时候,需要拆分服务。等等。。。导致接口性能问题的原因千奇百怪,不同的项目不同的接口,原因可能也不一样。本文我总结了一些行之有效的,优化接口性能的办法,给有需要的朋友一个参考。原创 2024-07-27 22:30:29 · 279 阅读 · 0 评论 -
科普文:11个编程原则助你写出优雅代码
糟糕的代码形式可以千千万,优雅且高质量的代码却是极其的相通,如何写出让人信服的高质量代码?编程是一个看似简单,但是还是有很大学问,特别是编写出高质量的优雅代码,最后我们再总结下本文总结的 11种原则:RefactorSOLID。原创 2024-07-27 21:22:02 · 583 阅读 · 0 评论 -
科普文:JDK678三个版本内存布局变化
在之前的文章中我们说到过,Oralce 拥有 JRockit 与 HotSpot 两款优秀的虚拟机,在 JRockit 中并没有永久代,为了将 JRockit 优秀的设计融入 HotSpot 中,在 JDK 1.8 中 HotSpot 移除了永久代。这两个参数的限制,这两个参数在物理空间上又受到 JVM 设定的内存大小限制,这就会导致在使用中永久代可能出现内存溢出的问题,因此在 JDK 1.8 及之后的版本中彻底移除了永久代,用元空间来进行替代,其中。用于分配一个容量为1024字节的直接内存区域。原创 2024-07-26 10:01:48 · 621 阅读 · 0 评论 -
科普文:田哥万字总结JVM核心知识
JVM 全称 Java Virtual Machine(Java 虚拟机) ,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。JRE全程Java Runtime Environment,是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。原创 2024-07-23 18:48:09 · 809 阅读 · 0 评论 -
科普文:搞懂多线程和多线程同步C++版
一个进程内多个线程并发执行的情况就叫多线程,每个线程是一个独立的执行流,多线程是一种编程模型,它与处理器无关、跟设计有关。并行计算:充分利用多核,提升整体吞吐,加快执行速度。后台任务处理:将后台线程和主线程分离,在特定场景它是不可或缺的,如:响应式用户界面、实时系统等。我们用 2 个例子作说明。原创 2024-07-23 16:51:20 · 986 阅读 · 0 评论 -
科普文:万字图文解说Dubbo的RPC调用核心流程
到这终于讲完了一次RPC请求在Dubbo中经历整个核心流程不知道你看完有什么感受这里我再来画一张图总结整个调用过程值得注意是,上面提到的所有调用环节,注意说的是所有,Dubbo都留了对应的扩展点也就是说,小到一个Filter,大到整个通信协议你都可以进行自定义扩展从这也可以看出,Dubbo在设计上的优秀之处。原创 2024-07-23 11:10:50 · 599 阅读 · 0 评论 -
实战:MyBatis适配多种数据库:MySQL、Oracle、PostGresql等
很多时候,一套代码要适配多种数据库,主流的三种库:MySQL、Oracle、PostGresql,刚好mybatis支持这种扩展,如下图所示,在一个“namespace”,判断唯一的标志是id+databaseId,刚好写了三个同样的方法,一个不带databaseId,两个带databaseId,此时当前库如果连接的是oracle则执行databaseId=’oracle‘的方法,如果连接的是MySQL则执行databaseId=’mysql‘的方法。原创 2024-07-22 13:51:17 · 1163 阅读 · 2 评论 -
科普文:TransmittableThreadLocal通过javaAgent实现线程传递并支持ForkJoin
不使用JavaAgent技术的支持 ForkJoin使用手动捕获,重放的ForkJoinTask实现传递,但是需要暴露ForkJoinPool的使用。通过 javaAgent技术可以添加jvm启动参数后无感支持Runnable,Callable,TimerTask,ForkJoinTask。默认开启Runnable,Callable,ForkJoinTask,并且目前不支持第三方框架重写的线程池逻辑,并做了一定程度的去干扰操作。原创 2024-07-22 10:11:23 · 696 阅读 · 0 评论 -
科普文:TransmittableThreadLocal线程间传递逻辑示例解析
利用装饰器对ExectorService包装后一步步的继续利用装饰器一直装饰到要执行的目标对象接口例如Runnable,Callable等对初始化,执行前,执行后三个时机进行增强重写了InheritableThreadLocal#childValue 方法来传递 TTL定义的一个中转map对象 key为 TTL对象。原创 2024-07-22 10:03:45 · 677 阅读 · 0 评论 -
实战:ForkJoinPool对大文件导入技术优化指南
Fork/Join框架是Java7提供了的一个用于并行执行任务的框架。ForkJoinPool是Java中提供了一个线程池,特点是用来执行分治任务。主题思想是将大任务分解为小任务,然后继续将小任务分解,直至能够直接解决为止,然后再依次将任务的结果合并。是一种工作窃取算法的线程池,它特别适用于计算密集型任务,尤其是那些可以递归分解成更小子任务的问题。ForkJoinPool的原理主要基于两个核心概念:fork和join。Fork。原创 2024-07-22 08:17:38 · 1302 阅读 · 0 评论 -
科普文:后端性能优化的实战小结
分块传输编码(Chunked Transfer Encoding)是一种HTTP/1.1协议中的数据传输机制,它允许服务器在不知道整个内容大小的情况下,就开始传输动态生成的内容。这种机制特别适用于生成大量数据或者由于某种原因数据大小未知的情况。在分块传输编码中,数据被分为一系列的“块”(chunk)。每一个块都包括一个长度标识(以十六进制格式表示)和紧随其后的数据本身,然后是一个CRLF(即"\r\n",代表回车和换行)来结束这个块。原创 2024-07-22 02:33:59 · 930 阅读 · 0 评论 -
科普文:Jmeter 性能压测-分析定位
科普文:Jmeter 性能压测-分析定位。1、压测过程中TPS上不去?请求响应时间过长?硬件资源不足:服务器的CPU、内存、磁盘等硬件资源不足,无法支撑高并发的请求处理。可以通过增加硬件资源或者优化服务器配置来提升TPS。网络带宽限制:网络带宽不足,导致服务器无法及时响应请求。可以通过增加网络带宽或者优化网络传输方式来提升TPS。数据库性能问题:数据库的读写性能不足,无法满足高并发的请求。可以通过优化数据库结构、索引、查询语句等方式来提升数据库性能。代码逻辑问题:应用程序中存在性能瓶颈原创 2024-07-22 02:24:36 · 402 阅读 · 0 评论 -
规范:java代码编写规范
比如在项目中不同的类型的业务可能需要上传各种各样的附件,此时就可以定义好不同的一个附件的枚举,来区分不同业务的附件。不要在代码中直接写死,不定义枚举,代码阅读起来非常困难,直接看到数字都是懵逼的。。我们做了这么多的工作,最终也只有跑起来才能够看到效果,所以在maven打包的时候,不要在了,让测试跑起来。如果可以的话,把单元测试加到我们的CI/CD流程中,只有常态化的用起来,才可以真正的产生效果。上面这些只是我在进行代码质量实践时的一些经验,并不适用于所有人或者场景,但是不管我们可以做到多少,怎么做,原创 2024-07-22 02:08:54 · 800 阅读 · 0 评论 -
规范:Git代码管理规范
master 为主分支,也是用于部署生产环境的分支,需要确保master分支稳定性。对于工作量小的功能开发(工时小于1天),可以直接在devolop 分支进行开发,否则由 develop 分支检出 feature 分支进行开发,开发完后合并到develop 分支。develop 为开发环境分支,始终保持最新完成以及bug修复后的代码,用于前后端联调。一般开发的新功能时,feature分支都是基于develop分支创建的。线上出现紧急问题时,需要及时修复,以master分支为基线,创建hotfix分支。原创 2024-07-21 10:42:02 · 1094 阅读 · 0 评论 -
规范:前后端接口规范
一个接口一般对参数(请求数据)都会进行安全校验,参数校验的重要性自然不必多说,那么如何对参数进行校验就有讲究了。一般来说有三种常见的校验方式,我们使用了最简洁的第三种方法业务层校验Validator + BindResult校验Validator + 自动抛出异常业务层校验无需多说,即手动在java的Service层进行数据校验判断。不过这样太繁琐了,光校验代码就会有很多而使用。原创 2024-07-21 10:19:19 · 1062 阅读 · 0 评论 -
规范:java日志格式规范
在程序中写日志是一件非常重要,但是很容易被开发人员忽视的地方。写好程序的日志可以帮助我们大大减轻后期维护压力。在实际的工作中,开发人员往往迫于巨大时间压力,而写日志又是一个非常繁琐的事情,往往没有引起足够的重视。开发人员应在一开始就养成良好的日志撰写习惯,并且应在实际的开发工作中为写日志预留足够的时间。原创 2024-07-21 09:55:58 · 618 阅读 · 0 评论 -
实战:一文搞懂InheritableThreadLocal
而且我们自己测试的时候是在几个按钮中重复点击,如果线程的第一个请求是/user/query,当你再次发起这个请求的时候如果刚好分配的是这个线程,页面就是正常的,于是就出现页面时好时坏的情况.某天测试环境更新后,有小伙伴反应页面会随机性的发生请求参数为空的情况(request.getParamter为空),但是前端的参数是传了的,而且不能稳定重现,需要在页面上经过一番操作之后才会发生,而当问题重现之后,之前那些可用的页面就变得不可用了,然后就会在可用和不可用之间交替......最终造成了错误的数据传递。原创 2024-07-21 09:34:26 · 1029 阅读 · 0 评论 -
科普:一文搞懂ThreadLocal
ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。原创 2024-07-20 17:52:02 · 860 阅读 · 0 评论 -
实战:springboot用LocalDateTime快速替换Date
在项目中大家从Date升级到在设计上更加现代化、易用且安全,克服了Date和Calendar的诸多缺点。虽然它们在功能上有重叠之处,但提供了更好的 API 和功能,推荐在 Java 8 及以上版本中使用新的日期和时间 API。原创 2024-07-20 09:08:25 · 678 阅读 · 0 评论 -
科普文:深入理解final关键字
1. final 修饰类中的变量表示该变量一旦被初始化便不可改变,这里不可改变的意思对基本类型变量来说是其值不可变,而对对象引用类型变量来说其引用不可再变。其初始化可以在两个地方:一是其定义处,也就是说在 final 变量定义时直接给其赋值;二是在构造方法中。这两个地方只能选其一,要么在定义时给值,要么在构造方法中给值,不能同时既在定义时赋值,又在构造方法中赋予另外的值。2. final 修饰类中的方法。原创 2024-07-20 08:34:41 · 860 阅读 · 0 评论 -
科普文:为什么String要用final修饰?
被final修饰的类,默认其下属性和方法都是final。被final修饰后,在jvm中独一份,可以更换的被共享。1.final修饰类,被final修饰的类不能被继承,即它不能拥有自己的子类,否在会在编译期间报错;2.final修饰方法,被final修饰的方法不能被重写;3.final修饰变量,final修饰的变量,无论是类属性、对象属性、形参还是局部变量,都需要进行初始化操作。String是引用类型,也就是每个字符串都是一个String实例。原创 2024-07-20 08:10:01 · 967 阅读 · 0 评论 -
科普文:JDK9新特性解读String底层char字符数组改成byte字节数组
2.String字符数组改字节数组,还增加了编码标志(ISO-8859-1/Latin-1 (one byte per character), or as UTF-16 (two bytes per character))标识用了什么编码;如果这个时候使用char[],一个char要占用两个byte,会占用双倍的内存空间。5.新版的String其实支持两个编码: Latin-1和UTF-16,如果String的内容中有汉字等超出Latin-1表示范围的字符。[]而不是char[]的原因是为了。原创 2024-07-20 07:42:57 · 844 阅读 · 0 评论 -
科普文:搞懂java多线程
用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。很多人都对其中的一些概念不够明确,如同步、并发等等,让我们先建立一个数据字典,以免产生误会。多线程:指的是这个程序(一个进程)运行时产生了不止一个线程并行与并发:并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时原创 2024-07-19 16:36:19 · 958 阅读 · 0 评论 -
科普文:线程池、连接池、动态线程池
线程池是一种用于管理和重用线程的机制,它允许开发人员有效地执行并发任务。线程池能够有效地管理系统资源,通过限制并发任务的数量和重用线程,减少了线程创建和销毁的开销,提高了系统资源利用率。通过合理地配置线程池大小和任务队列,可以优化任务执行流程,降低了线程的上下文切换成本,提高了任务的执行效率和系统的吞吐量。线程池可以控制并发任务的数量,防止系统因创建过多线程而导致资源耗尽,从而提高了系统的稳定性和可靠性。原创 2024-07-19 05:17:15 · 952 阅读 · 0 评论 -
科普文:万字详解MapStruct使用教程
MapStruct是一个Java注解处理器,它的主要功能是自动生成类型安全、高性能且无依赖的bean映射代码。这个工具基于“约定优于配置”的原则,极大地简化了Java Bean类型之间的映射实现过程。在多层架构的应用中,经常需要在不同的对象模型之间进行转换,例如在持久层的实体和传输层的DTO(Data Transfer Object,数据传输对象)之间。手动编写这种映射代码是一项繁琐且容易出错的任务。原创 2024-07-19 04:38:17 · 1119 阅读 · 0 评论 -
科普文:TaobaoVM信息收集
由于淘宝目前无疑是中国最大的Java技术应用方,那么淘宝究竟是采用什么样的技术对Java虚拟机进行优化的呢?淘宝的技术团队对Java虚拟机的优化工作其实早已不是停留在简单的参数调制上面,而是充分结合了企业自身的业务特点以及实际的应用场景,在OpenJDK的基础之上通过修改大量的HotSpot源代码,深度定制了淘宝专属的高性能Java虚拟机——TaobaoVM。既然是结合业务特点深度定制的一款Java虚拟机,那么性能必然在某一些特定的应用场景上会比Oracle官方的HotSpot更强,如图1-8所示。原创 2024-07-18 14:24:25 · 667 阅读 · 0 评论 -
科普文:字节码class文件和字节码增强技术
Java字节码是Java程序的核心组成部分,它是Java程序的二进制表示形式,是Java虚拟机执行Java程序的基础。Java字节码具有以下重要性:Java字节码是Java程序的基础:Java字节码是Java程序的二进制表示形式,是Java虚拟机执行Java程序的基础。Java字节码是Java程序的可移植性:Java字节码可以在不同的Java虚拟机上运行,因此Java字节码具有良好的可移植性。原创 2024-07-18 10:53:54 · 672 阅读 · 0 评论 -
实战:Eureka的概念作用以及用法详解
Netflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 进行了二次封装,主要负责完成微服务架构中的服务治理功能。Spring Cloud Eureka 是一个基于 REST 的服务,并提供了基于 Java 的客户端组件,能够非常方便的将服务注册到 Spring Cloud Eureka 中进行统一管理。原创 2024-07-18 09:40:19 · 1477 阅读 · 0 评论 -
阿里:深入探讨Java的分层编译
一开始接触到分层编译是因为我们这的服务每次发布/重启后都会短暂地出现CPU满线程池满的情况,然后过一段时间又能自动恢复。排查后发现是启动时JVM将部分热点代码编译为机器代码导致的,这个过程中JIT编译器会占用大量的CPU。一个Java的源代码文件变成可直接执行的机器指令,需要经过两段编译,第一段是把.java文件转换成.class文件。第二段是把.class文件转换为机器指令。第一段的编译相对固定,也就是将Java代码翻译为字节码并打包为jar的过程。原创 2024-07-18 09:15:06 · 745 阅读 · 0 评论 -
实战:Java 8中的函数式编程
函数式编程是一种编程范式(programming paradigm),追求的目标是整个程序都由函数调用(function applying)以及函数组合(function composing)构成的。函数调用大家容易理解,但在函数式编程中,函数调用有一个限制——它不会改变函数以外的其它状态,换而言之,即函数调用不会改变在该函数之外定义的变量值。这种函数有个专门的术语——纯函数(purely function)。纯函数有个特点,当参数值不变的时候,多次运行纯函数,得到的结果总是一样的。原创 2024-07-18 06:23:10 · 914 阅读 · 0 评论 -
实战:详解Spring创建bean的流程(图解+示例+源码)
我们来看下 Spring Framework 的官方文档:简而言之,bean 是由 Spring IoC 容器实例化、组装和管理的对象。对于普通的 Java 对象,当 new 的时候创建对象,然后该对象就能够使用了。一旦该对象不再被使用,则由 Java 自动进行垃圾回收。而 Spring 中的对象是 bean,bean 和普通的 Java 对象没啥大的区别,只不过 Spring 不再自己去 new 对象了,而是由 IoC 容器去帮助我们实例化对象并且管理它,我们需要哪个对象,去问 IoC 容器要即可。原创 2024-07-18 05:47:25 · 973 阅读 · 0 评论 -
实战:在项目中常用的8种设计模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。对于一个进阶高级开发的技术人员来说,了解设计模式的理念和具体的实现颇为重要,本期内容分享就到这里了,希望对你能有所帮助。原创 2024-07-17 03:52:49 · 753 阅读 · 0 评论 -
科普文:详解23种设计模式
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素)的书,该书首次提到了软件开发中设计模式的概念。四位作者合称GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。原创 2024-07-17 03:51:24 · 673 阅读 · 0 评论 -
实战:Spring Boot与Apache CXF构建企业级服务SOAP
通过结合使用 SpringBoot 和 Apache CXF,开发者可以快速、高效地构建和部署高性能、可扩展的 Web 服务。SpringBoot 简化了配置和依赖管理,而 Apache CXF 提供了强大的 Web 服务功能和灵活性,使得构建现代企业级应用变得更加容易。通过 SpringBoot 的自动配置和依赖管理功能,开发者可以快速构建基于 Apache CXF 的 Web 服务应用。它通过自动配置、独立运行和生产就绪的功能,使开发者能够专注于业务逻辑,而无需处理繁杂的配置和依赖管理。原创 2024-07-17 03:50:34 · 879 阅读 · 0 评论 -
实战:SpringBoot 15个功能强大Bean
其实SpringBoot为我们注册了一个Bean对象,在代码中可以直接注入该对象我们还可以拿到原始配置的参数信息输出结果可以根据自己的需要进行解析处理。如果你想在项目中获取Banner信息,那么你可以直接在代码中注入对象。注意:确保你没有关闭Banner,也就是说你没有进行如下的配置。编程方式如果你关闭了Banner,那么上面的注入将会报错。ConversionService是个非常重要及强大的类,该类在SpringBoot启动过程中将配置文件中的配置数据转换为对应的数据类型。原创 2024-07-17 03:49:53 · 853 阅读 · 0 评论 -
科普文:java 9新特性 接口方法私有化
commons();commons();//定一个私有的方法,把重复部分的代码抽离出来。然后在methodA与methodB方法内部去调用。//私有方法只能在本类中调用,这里包括接口的实现类也不能调用。测试代码在接口中使用private修饰方法即可。在方法的内部去调用。在 Java 9 的接口中,私有方法可以分为实例私有方法和静态私有方法两种类型:实例私有方法:这些方法不能在接口外部调用,只能在接口内部的默认方法或其他私有方法中调用。原创 2024-07-17 03:49:03 · 747 阅读 · 0 评论