编程随笔
文章平均质量分 83
日常编程随笔
_whitepure
这个作者很懒,什么都没留下…
展开
-
整合支付功能
Slf4j@Override// 前置处理log.debug("开始执行前置处理.");if (!throw new PayException("支付前置处理失败,不能继续执行");log.debug("前置处理执行完毕");// 执行log.info("开始执行,请求参数 {}", JSON.toJSONString(orderInfo));log.info("执行完毕,响应参数 {}", JSON.toJSONString(result));// 后置处理。原创 2024-04-19 14:52:54 · 921 阅读 · 0 评论 -
管道流设计模式结合业务
Override@Override@Override// 执行// 是否继续执行调用链/*** 执行器* @param context 上下文对象*/原创 2024-04-18 11:18:50 · 841 阅读 · 0 评论 -
简要概述如何做好程序设计功能
有状态服务: 即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如 tomcat 中的 session。从DDD角度界限上下文、ER图、评审表结构设计是否合理,表的关联关系是否合理、是否创建索引、是否大数据量表考虑放到分片库以及分片字段设计。无状态服务:客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份。服务端不保存任何客户端请求者信息。与外部系统交互、本系统模块之间流程,比较好用的画圈软件draw .io或在线的process on。原创 2024-04-18 11:05:07 · 446 阅读 · 0 评论 -
解决内存泄漏问题
HashMap、LinkedList 等集合类,如果这些集合是静态的并且向集合中添加了对象,这些对象就算不再使用,也不会被GC主动回收的,它们的生命周期与JVM程序一致,容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。因为改变了对象属性的值相当于改变了改对象的hash值,删除的时候是根据对象的hash值来删除的,删除对象的时候找不到对应的hash值,所以不能删除,最终导致内存泄露。非静态内部类,自动生成的构造方法,默认的参数是外部类的类型,因此使用非内部内部类的时候会保留一个外部类的引用。原创 2024-04-17 16:35:32 · 748 阅读 · 0 评论 -
如何优雅规范编写Java代码
else并不会降低代码的复杂度,相反比较少见的写法可能会增加认知负荷,从而进一步增加了复杂度。else是为了对代码进行解耦合,方便扩展代码,最终方便对代码的维护。思路:定义一个注解,将需要校验的参数对象都标注该注解,利用SpringAOP,拦截该注解,将其中标注的参数取出,最后通过BeanValidator进行校验。是因为通常在编码过程中我们不只自己进行开发,通常需要一个团队来进行,开发好之后还需要维护,所以编码规范就显的尤为重要。代码维护时间比较长,那么保证代码可读性就显得很重要。原创 2024-04-17 16:30:58 · 906 阅读 · 0 评论 -
Hystrix熔断及工作流程
当微服务系统的一个服务出现故障时,故障会沿着服务的调用链路在系统中疯狂蔓延,最终导致整个微服务系统的瘫痪,这就是“雪崩效应”。为了防止此类事件的发生,微服务架构引入了“断路器”的一系列服务容错和保护机制。原创 2024-04-17 10:26:56 · 1047 阅读 · 0 评论 -
使用Validator框架进行参数校验
String message() default "请输入中文";Class原创 2024-04-17 09:49:35 · 584 阅读 · 0 评论 -
使用Hugo、Github Pages搭建自己的博客
需要注意的是,Github Pages需要在跟路径下创建一个docs文件夹,这个文件夹就是你的网站页面,我的是这样,docs里面保证根目录有一个index.html文件即可。除此之外,Hugo内置web服务器,可以在修改MarkDown文章之后切换到浏览器,页面会检测到更新并且自动刷新,呈现出最终效果,能极大的提高博客书写效率。它的极速和简约风格符合我的需求,让我能够专注于内容的创作。最初希望能将自己学习的知识记录下来,梳理自己的思想,于是开始搭建博客。就可以访问得到你的博客了,这就完成了博客的部署。原创 2024-04-15 11:21:38 · 893 阅读 · 0 评论 -
MQ概览及Kafka详解
为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果 producer 收到 ack,就会进行下一轮的发送,否则重新发送数据。这个问题怎么解决呢?由于index文件中的每条对应log文件中存储内容大小都相同,所以想要找到指定的消息,只需要用index文件中的该条的大小加上该条的偏移量即可得出log文件中指定消息的位置。原创 2024-04-13 13:26:12 · 1164 阅读 · 0 评论 -
常见接口优化方法
如果应用程序没有接入APM,可以在生产环境装一下arthas,利用trace接口方法和火焰图,大概能分析是那一块比较慢,定位能力稍微有点粗糙。线上接口很慢,线上生产问题,我们绝对不能马虎放过抱着侥幸心理,必须要找到根本原因及时处理,防止下次留下更大的坑.大致思路要定位接口问题,然后具体问题具体分析,讨论不同解决方案.要快速定位接口哪一个环节比较慢,性能瓶颈在哪里,可以使用应用性能监控工具(APM)定位问题。常见工具: skywalking、pinpoint、cat、zipkin。原创 2024-04-12 14:26:10 · 359 阅读 · 0 评论 -
如何快速打开Github
我们在浏览器输入 GitHub 的网址时,会向 DNS 服务器发送一个请求,获取到 GitHub 网站所在的服务器 IP 地址,从而进行访问。为什么我们打开Github速度很慢?很卡,甚至于访问不了,原因是中间有个域名通过DNS解析的过程,将域名解析为对应的ip地址,主要时间都是花在了DNS解析上了。有时候尝试过手动修改host文件来解决网站的访问问题,及更换网络但还是有时候无法如愿的访问GitHub,这里推荐一个备用方案,可以通过修改 hosts 文件,解决: GitHub 访问速度慢的问题,推荐。原创 2024-04-12 14:23:07 · 1249 阅读 · 3 评论 -
怎么重构一个程序
摘自《重构:改善既有代码的设计》重构(名词形式): 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。重构(动词形式): 使用一些列重构手法,在不改变软件可观察行为的前提下,调整其结构。重构的目的是使软件更容易被理解和修改。可以在软件内部做很多修改,但必须对软件可观察的外部行为只造成很小的变化,甚至不造成变化。与之形成对比的是性能优化,和重构一样,性能优化通常不会改变组件的行为,只会改变其内部结构。原创 2024-04-12 14:02:23 · 1055 阅读 · 0 评论 -
常见程序故障排查及程序配置
导入dump文件:在生成可疑泄漏报告后,会在对应的堆转储文件目录下生成一个zip文件。MAT最主要的功能是分析dump文件,其中比较重要的功能就是histogram(直方图)和dominator tree(支配树)原创 2024-04-12 13:34:58 · 850 阅读 · 0 评论 -
如何强制复制网站上的文字
一般多数情况会使用开发者工具或者禁用js脚本,来进行规避,但有些时候开发者工具打不开,比如一打开就出现debugger,放行会跳空页面,百度的文心一言就是这样。当在一些网站搜集资料的时候,按右键复制却出现弹窗,无法复制粘贴,必须关注公众号,或者是付费才能复制,这时候也能利用开发这工具进行规避,找到对应的html代码去掉即可。一种简单直接的方法,不用进行任何其他操作,直接选中文字,然后将文字拖动到文档或者社交软件对话窗口,直接就能自动粘贴你选中的文字,简单排版就可以使用了。有两种方法可以禁用网站的js。原创 2024-04-12 13:11:45 · 321 阅读 · 0 评论 -
Java中的数据结构与算法
java常用数据结构和常见基本算法原创 2022-09-27 09:13:16 · 1393 阅读 · 0 评论 -
IDEA常用插件及使用技巧
配置一些常用代码字母缩写,在输入简写时可以出现你预定义的固定模式的代码,使得开发效率大大提高,同时也可以增加个性化。例如: 输入sout会出现。原创 2023-05-05 10:36:44 · 1529 阅读 · 1 评论 -
如何写出整洁的代码
每个人对于整洁的代码理解肯定不同,在我看来,满足业务场景的情况下,可读性强,运行效率高,细节处理好,易扩展的代码就是整洁代码. 抛开业务场景不谈,只谈所谓的"整洁代码"就是所谓的耍流氓。整洁的代码总是看起来总是像是某位特别在意它的人写的.几乎没有改进的余地.代码的作者什么都想到了.如果你想改进它,总会回到原点。原创 2023-05-05 10:25:46 · 1172 阅读 · 0 评论 -
Nginx介绍
Nginx (“engine x”)是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好.Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。原创 2023-05-05 10:23:35 · 2013 阅读 · 0 评论 -
如何减少bug及解决bug思路
减少bug的出现只能多测多验证,哪怕单元测试通过都不能非常有效减少bug,因为受到写单元测试的人的思维角度限制,导致单元测试的片面性。1945年,一只小飞蛾钻进了计算机电路里,导致系统无法工作,一位名叫格蕾丝·赫柏的人把飞蛾拍死在工作日志上,写道:就是这个 bug(虫子),害我们今天的工作无法完成——于是,bug一词成了电脑系统程序的专业术语,形容那些系统中的缺陷或问题。关于bug的种类,最容易出现的bug是逻辑上的bug,如复杂庞大一点软件如果不是所有地方都熟悉就写代码是比较容易遗漏一些特殊情况的。原创 2023-05-05 09:31:28 · 1843 阅读 · 0 评论 -
Elasticsearch详解
Elasticsearch,简称为 ES, ES是一个开源的高扩展的分布式全文搜索引擎, 是整个 ElasticStack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比,如图:ES 里的 Index 可以看做一个库,而 Types 相当于表, Documents 则相当于原创 2023-05-04 15:37:53 · 1423 阅读 · 0 评论 -
微服务治理介绍及Spring Cloud
—大意:简而言之,微服务体系结构风格是一种将单个应用程序开发为一套小型服务的方法,每个服务运行在自己的进程中,并与轻量级机制(通常是HTTP资源API)通信。这些服务是围绕业务功能构建的,可以通过全自动部署机制进行独立部署。对这些服务的集中管理是最低限度的,这些服务可能用不同的编程语言编写,并使用不同的数据存储技术。原创 2021-09-26 14:31:37 · 1346 阅读 · 0 评论 -
MySQL详解
文章目录MySql逻辑架构MySqlSQL优化索引索引的优缺点索引分类及操作索引建立原则执行计划id、tableselect_typetypepossible_keys、keykey_lenrefrowsExtraSQL优化案例单表优化两表优化避免索引失效的一些原则SQL优化方法exist和in选择order by优化排查SQL慢SQL日志设置查看慢SQL日志模拟数据并分析SQL全局查询日志MySql锁机制使用锁表锁行锁MySql逻辑架构主要分为:连接层,服务层,引擎层,存储层。客户端执行一条sele原创 2021-09-21 19:22:01 · 1388 阅读 · 0 评论 -
Redis详解
文章目录Redis概述什么是Redis非关系型数据库Redis相关知识Redis基础命令Redis数据类型StringListSetHashZSetBitmapsHyperLogLogGeospatialRedis发布与订阅Redis事务Redis事务特性事务冲突悲观锁乐观锁Redis与缓存缓存穿透缓存击穿缓存雪崩Redis主从复制搭建主从复制主从复制过程一主二仆薪火相传反客为主Redis哨兵模式搭建哨兵模式复制延时选举机制Redis集群搭建Redis集群操作Redis集群Redis分布式锁Redis分布式原创 2021-09-09 14:58:40 · 1543 阅读 · 1 评论 -
分布式事务详解
文章目录基础概念什么是事务本地事务分布式事务分布式事务产生场景分布式事务基础理论CAP理论理解CAPCAP组合方式BASE理论分布式事务解决方案-2PC什么是2PC解决方案XA方案Seata方案分布式事务解决方案-TCC什么是TCC解决方案分布式事务解决方案-可靠消息最终一致性什么是可靠消息最终一致性解决方案本地消息表方案RocketMQ事务消息方案分布式事务解决方案-最大努力通知什么是最大努力通知解决方案方案1方案2分布式解决方案对比基础概念什么是事务什么是事务?举个例子:你去超市买东西,"一手交钱原创 2021-08-19 17:06:31 · 1207 阅读 · 0 评论 -
ORA-03113 end-of-file on communication channel
文章目录问题问题原因问题解决删除归档日志增加归档日志空间参考文章问题用数据库连接工具发现数据库连接不上了,登陆服务器一看发现数据库满了登陆root或oracle用户;登陆root需要切换到oracle:su - oracle;使用 sqlplus / as sysdba 命令切换到sqlplus;在 sqlplus 模式下使用startup命令,开启数据库。发现启动报错:问题原因在网上简单搜了一下,原因是Oracle 数据库归档日志满了。用df -h命令看了一下磁盘空间占用情况,磁盘已经满原创 2021-07-29 11:29:01 · 4130 阅读 · 0 评论 -
通过CPU使用过高定位到具体代码
CPU使用过高定位分析一般在生产环境排查程序故障,都会查看日志什么的,但是有些故障日志是看不出来的,就比如:CPU使用过高。那应该怎么办呢?我们需要结合linux命令和JDK相关命令来排查程序故障。第一步首先使用top命令,找出CPU占比最高的Java进程;然后进一步定位后台程序,可以使用jps -l命令或者ps -ef java命令。第二步定位到具体的线程;使用ps -mp 进程ID -o THREAD,tid,time命令可以找到线程ID。ps -mp 进程ID -o THREAD,t原创 2021-06-21 21:01:04 · 962 阅读 · 0 评论 -
学习Java参考资料
资源文档网站菜鸟教程:https://www.runoob.com/java/java-tutorial.htmlJavaSchool:http://www.51gjie.comPHP中文网:https://www.php.cnC语言中文网:http://c.biancheng.netWeb前端导航: http://www.alloyteam.com/nav五分钟学算法:https://www.cxyxiaowu.comAlgoMooc:https://www.algomooc.com芋道原创 2021-06-04 22:14:11 · 98 阅读 · 0 评论 -
HashMap原理详解
相关概念capacity: 容量,默认16。loadFactor: 加载因子,默认是0.75threshold: 阈值;阈值 = 容量 * 加载因子。默认12。当元素数量超过阈值时便会触发扩容。hash碰撞(冲突):当插入hashmap中元素的key出现重复时,就会覆盖之前key对应的值。结构JDK1.7:数组 + 单向链表JDK1.8: 数组 + 单向链表/红黑树在JDK1.8时,如果存储Map中数组元素对应的索引的每个链表超过8,就将单向链表转化为红黑树;当红黑树的节点少于6个原创 2021-05-05 22:30:58 · 239 阅读 · 2 评论 -
Java中的语法糖详解
语法糖语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。在编程领域,除了语法糖,还有语法盐和语法糖精的说法,篇幅有限这里不做扩展了。我们所熟知的编程语言中几乎都有语法糖。作者认为,语法糖的多少是评判一个语言够不够牛逼的标准之一。很多人说Java是一个“低糖语言”,其实从Java 7开始Jav转载 2021-04-10 10:28:49 · 111 阅读 · 0 评论 -
Java中的数组介绍
Java中的数组数组就是同类数据元素的集合易错数组是Java的引用数据类型数组也是对象,能够向下或者向上转型,能使用instanceof关键字int[] a = new int[8]; Object obj = a ; //数组的父类也是Object,可以将a向上转型到Object int[] b = (int[])obj; //可以进行向下转型 if(obj instanceof int[]){ //可以用instanceof关键字进行类型判定 }优缺点原创 2021-03-28 16:02:24 · 65 阅读 · 0 评论 -
gitlab-runner 设置用户为root
安装gitlab-runner默认会将用户设置为:gitlab-runner,该设置会使编写.ci的脚本,操作带来很大不便,本人深受其害。1.通过ps aux|grep gitlab-runner命令查看gitlab-runner进程,可以查看到gitlab-runner的工作目录和默认用户等一系列相关信息。2.通过该命令sudo gitlab-runner uninstall可以删除掉gitlab-runner3.重新安装gitlab-runner并将用户设置为rootgitlab-runner i原创 2020-08-16 17:30:07 · 4054 阅读 · 0 评论 -
docker基本介绍及安装
docker是什么:Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。总体来说,Docker 的接口相当简单,用户可以方便地创建和...原创 2020-04-01 16:09:24 · 163 阅读 · 0 评论 -
volatile关键字使用及原理
深入理解JVM书中对volatile的描述:一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。2)禁止进行指令重排序.(有序性)volatile只提供了保证访问该变量时,每次都是从内存中读取最新值,并不会使用寄存器缓存该值——每次...原创 2020-04-02 19:27:55 · 185 阅读 · 0 评论 -
Java基础常用易错点总结
常见的线程安全的类:Timer,StringBuffer,Stack(栈),Vector(向量),HashTable,EnumerationJava继承问题:Java中子类不能继承父类的构造方法,只能显式或隐式调用(用super)Java子类调用父类的构造方法不是必须用Super关键字调用可以用new关键字创建对象去调用子类构造方法中即使不写super()调用父类的构造方法,系统也会自动...原创 2020-04-02 19:51:38 · 148 阅读 · 0 评论 -
CAS原理及解决方案
CASCAS(Compare and Swap),翻译成比较并交换.CAS是java.util.concurrent.atomic包的基础,即AtomicInteger和AtomicLong等是用CAS实现的/* *expect 期望值 *update 更新值 */ public final boolean compareAndSet(int expect, int update)...原创 2020-04-05 00:03:41 · 113 阅读 · 0 评论 -
Java中常用集合的线程不安全问题
ArrayListArrayList线程不安全示例: public static void main(String[] args) { ArrayList<String> arrayList = new ArrayList<>(); for(int i=0; i< 3; i++) { new Thread(() -> { array...原创 2020-04-05 22:32:29 · 627 阅读 · 0 评论 -
Java中常用到的锁
公平锁是指多个线程按照申请锁的顺序来获取锁类似排队打饭 先来后到优点: 所有的线程都能得到资源,不会饿死在队列中。缺点: 吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。非公平锁是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象优点: 可以减...原创 2020-04-07 23:32:32 · 367 阅读 · 0 评论 -
Synchronized与ReentrantLock的区别
Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现ReentrantLock。synchronized用法同步一个代码块public void test() { synchronized (this) { //to do ... }}只作用于同一个对象,如果调用两个...原创 2020-04-09 11:54:23 · 67 阅读 · 0 评论 -
MQ使用场景及JMS模型介绍
MQ使用场景介绍mq(message queue),是分布式系统的重要组件,主要解决异步消息,应用解耦,消峰等问题。从而实现高可用,高性能,可伸缩和最终一致性的架构。使用较多的mq有:activeMQ,rabbitMQ,Kafka,metaMQ。异步消息处理可以将一些非核心流程,如日志,短信,邮件等,通过MQ的方式异步去处理。这样做的好处是缩短主流程的响应时间,提升用户体验。应用解耦合商品服务和订单服务之间。用户下单后,订单服务会通知商品服务。不使用MQ的情况是订单服务调用商品服务的接口原创 2020-08-16 17:16:07 · 292 阅读 · 0 评论 -
使用缓存需要注意的问题
缓存击穿key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存。大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。1.直接将key设为永不过期缓存穿透可简单理解为,避开缓存,疯狂请求数据库里没有的数据.从而造成服务器宕机1.布隆过滤器2.缓存空值,保护数据源缓存雪崩简单理解为,在某一个时间段,缓存key大面积失效,集中过期.或者服务器宕机1.原创 2020-08-16 17:20:20 · 102 阅读 · 0 评论