Java
文章平均质量分 60
AlgoRain
欢迎访问我的个人博客www.rain1024.com
展开
-
for循环的鄙视链大可不必
今天刚好看到一篇文章,联系起了最近一直在思考的问题,新的技术就一定好吗,曾经我也是极其热衷于流式编程,只要是能看到的for循环,都想更换成stream方式来操作,直到后来开始维护别人写的代码时,逐渐发现简洁不一定就是好,自己开发时是非常了解业务逻辑的,所以写起来行云流水,自我感觉优雅的不行,但交到别人手里之后,他要看的是整个系统上万行代码,在不清楚需求背景的情况下,面对这种高度简洁的流式爆炸代码块,可读性,可维护性真的为0,功在当代,利却不在千秋。...原创 2022-07-27 22:04:41 · 251 阅读 · 2 评论 -
高并发业务的化解之道
在高并发业务中大量的流量冲击,经常会造成服务不可用,这些流量可能是异常的爬虫或者攻击,也有可能就是正常的大促活动,业务系统大多是独立的模块,某个链路节点的不可用不会造成整条链路阻塞,但在首页还真的有这样的问题,首页业务聚合了所有下游服务,一旦被流量冲垮就会造成所有用户不可访问,这样的影响是不可接受的,所以面对首页业务的大流量,其实也是解决高并发的三板斧缓存,降级,限流。...原创 2022-07-24 21:42:50 · 455 阅读 · 0 评论 -
重写线程池ThreadFactory接口实现对线程异常的捕获
在开发过程中经常会用到线程池,但创建线程池的方法都比较简单,使用Executors来创建相应功能的线程池,常用的方法有这些。1、 Executors.newFixedThreadPool(int nThreads);创建固定大小(nThreads,大小不能超过int的最大值)的线程池2、Executors.newSingleThreadExecutor():创建大小为1的固定线程池。3、Executors.newCachedThreadPool();创建corePoolSize为0,最大线程数为整型的原创 2021-07-16 13:41:41 · 669 阅读 · 0 评论 -
Java默认接口方法引发的多继承问题
Java8中的抽象类和抽象接口区别首先,一个类只能继承一个抽象类,但是一个类可以实现多个接口其次,一个抽象类可以通过实例变量(字段)保存一个通用状态,而接ロ是不能有实例变量的熟悉Java或者看过Java面试题的都知道,Java不支持多继承,原因是:安全性的考虑,如果子类继承的多个父类里面有相同的方法或者属性,子类将不知道具体要继承哪个。Java提供了接口和内部类以达到实现多继承功能,弥补单继承的缺陷。所以在实际开发中可以通过多个接口来灵活实现,但Java8中支持接口编写默认方法,变相等于可以原创 2021-06-28 20:48:04 · 350 阅读 · 0 评论 -
SpringCloudGateway手动编写路由规则对请求进行转发
这篇文章主要是提供一种转发路由的代码实现方式,之前说的gateway都是使用配置文件来对请求进行路由,这样虽然很简单,但是不够灵活,如果后端对应很多服务实例,网关想要根据自己的规则来转发请求,比如编写不同的负载均衡策略,做一些特别的权重,以及在运行过程中动态的变更转发地址,这些用配置文件来做都不够灵活,没法自由的定义规则。涉及的gateway版本 <dependency> <groupId>org.springframework.cloud<原创 2021-06-25 19:06:51 · 2210 阅读 · 1 评论 -
服务频繁发生YoungGC的处理过程(合理压测)
问题描述最近一直在做项目的GC优化,因为服务在运行过程中频繁发生GC问题,虽然不是FullGC,但Young频繁GC也会影响线上服务的性能,优化的方向有两个,1.修改JVM参数 ,2.优化代码逻辑。查看当前线上JVM配置调整年轻代的大小可以缓解因内存分配太小而发生频繁GC的问题。本次优化的重点在于代码逻辑的实现,主要原因是:在目前架构内,系统并不能通过改变eden区大小得到有效解决,年轻代内存区域调大,GC频率改善,但时长会变长。反之,作用也是相反。频繁的GC和pause清理耗时又引起jvm内原创 2021-06-22 16:33:47 · 3371 阅读 · 0 评论 -
无状态节点服务的缓存数据同步实现
在目前需求背景下要设计一套底层服务系统,提供一系列基本数据请求接口,这里把该系统服务称为P,为保证高可用高可靠性,P系统最少依赖外部中间件,例如数据库消息队列等组件,服务所涉及的数据全部缓存到本地缓存中,然后由其他服务来请求接口或数据库收集数据,将收集的数据存入Redis中,再去通知P系统更新本地缓存的数据,收集数据的服务称为D。以下为P,D,Redis关系图。需要注意的是,P并不会强依赖与Redis与D系统,因其本地缓存有一份全量的数据,只是对数据的实时性不能保证,要靠D系统来定时发送更新通知,本原创 2021-06-10 19:48:22 · 309 阅读 · 0 评论 -
从TheadLocalMap看哈希碰撞后开放寻址法的实现过程
从TheadLocalMap看哈希碰撞后开放寻址法的实现过程本来想说ThreadLocal,但看到了ThreadLocalMap中对哈希碰撞是采用开放寻址法来实现的,觉得很有意思,hash使用的场景很多,散列表就是一种高效而常用的数据结构,能将查找的时间复杂度降到O(1),它通过哈希函数来生成一个 hashcode 值,从而对数据进行一一定位,虽然现在的哈希函数已经能做到很好的随机,但还是会有冲突发生,也就是不同的对象经过哈希函数的计算,生成了相同的 hashcode 值。当哈希冲突发生时,一般有以下几种原创 2021-03-11 20:29:04 · 216 阅读 · 0 评论 -
浅析微服务注册中心的注册与发现
浅析微服务注册中心的注册与发现注册中心是用来集中管理微服务,实现服务的注册,发现,检查等功能,目前比较成熟的注册中心组件有很多,如Consul,eureka,zookeeper,etcd,nacos,不同组件之间性能,并发,高可用都会有差距。但对于用户来说基本的功能实现都是透明的。其实如果我们自己开发一套注册中心也可以,能够满足基本的功能即可。支持IP端口的注册:注册中心提供接口将服务发布者的信息添加进去。提供一些其他信息,如服务名称,只注册IP仅能实现基本功能,如果需要加密或者负载均衡时,如原创 2021-03-05 16:17:36 · 375 阅读 · 0 评论 -
Kafka实现订单超时取消的两种模拟策略
Kafka实现订单超时取消的两种模拟策略在业务场景中有一个需要定时15分钟后取消用户订单的功能,可以使用Java的任务调度框架来实现,但还需要引入框架依赖和设置数据表等,对业务的侵入性很大,有点大材小用的感觉,所以这里使用延时队列就可以,Kafka本身是不支持延时队列的,需要在生产消息和消费时进行一些二次开发,以下是我对该业务具体实现的思考。1.建立不同时间区间的topicKafka内部有很多延时性的操作,如延时生产,延时拉取,延时数据删除等,这些延时功能由内部的延时操作管理器来做专门的处理,其底层是原创 2021-03-01 14:44:21 · 2797 阅读 · 1 评论 -
对于mysql,redis,Kafka,zookeeper磁盘缓存技术使用分析
对于mysql,redis,Kafka,zookeeper磁盘缓存技术使用分析大部分组件是基于磁盘存储的,但由于CPU速度和磁盘速度之间的鸿沟,都会使用缓存技术来提高性能,缓存简单来说就是一块内存区域,首先将从磁盘读到的数据放在缓存中,之后查询或修改时直接操作缓存,对于缓存中的数据则以一定的频率刷新到磁盘上,怎样缓存,缓存多少,何时刷新,这些影响着整个组件的性能。在看过一些关于mysql等组件的架构原理后,会发现不论是基于磁盘的mysql数据库和Kafka消息中间件zookeeper分布式协调框架,还是基原创 2021-02-26 14:19:55 · 397 阅读 · 1 评论 -
分布式锁的锁优化
在去除原有synchronized单机锁后,在关键步骤添加分布式锁来对具体业务进行锁定,然而由于锁定范围大,导致锁竞争增加,不断发生锁等待,如果不进行优化,可能会让线程队列增大甚至阻塞,而且在等待时长超过设定的阈值时,线程将超时返回。在此,初步对锁进行优化,如何理解分布式锁与单机锁的应用范围和实现机制,分布式锁与单机锁并不冲突,单机锁类似于海选初赛,而分布式锁则相当于决赛,单机锁用于在当前服务器中,控制所有线程的访问,当最终有线程得到访问数据库或其他唯一性的可操作数据的中间件,再由分布式锁来控制所有进入最原创 2021-01-04 17:26:28 · 439 阅读 · 0 评论 -
数据库读写分离时,主从延时导致数据不一致的解决方案
数据库读写分离时,主从延时导致数据不一致的解决方案引入主从架构,数据读写分离,目的是为了解决业务快速发展,请求量变大,并发量变大,从而引发的数据库的读瓶颈。不过当引入新一个架构解决问题时,势必会带来另外一个问题,数据库读写分离之后,主从延迟从而导致数据不一致的情况。数据库系统架构主备架构公司业务发展的前期,由于数据访问量小,这时我们可以直接采用单库的架构,承载所有的访问请求。不过因为存在单点的问题。若数据库出现故障,这段期间业务将会不可用。这时我们可以增加一个备库,实时同步主库的数据一旦原创 2021-01-04 09:30:56 · 1043 阅读 · 0 评论 -
关于Pagehelper分页失效不起作用的问题-与Feign有关
关于Pagehelper分页失效不起作用的问题-与Feign有关今天偶尔在项目里试pagehelper分页分页功能时,怎么都不会生效,不管怎么设置pageNum,pageSize都是将所有内容输出,在网上搜索了一些也没有效果,大多都是maven依赖引入有问题,但我的maven依赖已经设置为全局统一。<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>page原创 2020-12-03 20:52:50 · 1420 阅读 · 0 评论 -
测试单节点Kafka在Zookeeper关闭后的运行状态和请求响应状态
测试单节点Kafka在Zookeeper关闭后的运行状态和请求响应状态Kafka版本:2.11-2.1.0zookeeper版本:3.5.5系统版本:centos7.6这个问题是在一次面试的时候面试官问的,当时确实懵了,只能模糊的去描述zookeeper关闭后的kafka 状态,自己并不非常肯定,回来之后一直想亲自试验一下,今天刚好搭了一个单节点的Kafka和单节点的zookeeper,之后有时间再去分别测试集群版环境的响应情况。先说结论:当Zookeeper关闭后,不影响Kafka正常生产和消费原创 2020-11-30 15:35:46 · 424 阅读 · 0 评论 -
SpringCloud-Gateway对multipart/form-data等其他POST请求类型的body体进行多次打开
本次代码仅在以下版本中测试通过<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId>原创 2020-11-10 14:18:32 · 7052 阅读 · 2 评论 -
Java性能调优分享
Java性能调优分享这次分享还是之前在公司对项目进行性能调优时,前期的调研,以及积累的一些经验,之前公司产品面对的用户并发量较小,所以测试通过后直接上线,不需要根据其他维度来进行分析优化,后来领导对我负责的系统提出了并发的要求,想知道系统能承受的并发量是多少,时延会达到多长,根据这些需求,进行一系列压测。1.为什么要做性能优化系统角度一款线上产品如果没有经过性能测试,那它就好比是一颗定时炸弹,你不知道它什么时候会出现问题,你也不清楚它能承受的极限在哪儿。有些性能问题是时间累积慢慢产生的,到了原创 2020-09-09 20:08:30 · 316 阅读 · 0 评论 -
sbt配置源报错:Error during sbt execution: java.lang.RuntimeException: Expected one of local, maven-local,
Error during sbt execution: java.lang.RuntimeException: Expected one of local, maven-local, maven-central, scala-tools-releases, scala-tools-snapshots, sonatype-oss-releases, sonatype-oss-snapshots, j...原创 2020-04-13 17:17:52 · 2069 阅读 · 0 评论 -
SpringBoot中@ConfigurationProperties对于多层嵌套参数的正确加载方法
SpringBoot中@ConfigurationProperties对于多层嵌套参数的正确加载方法今天想重构一下Kafka代码,将之前用@Value引入的一些参数全部替换掉,因为可读性和维护性太差,这是以前的样子。 @Value("${spring.kafka.bootstrap-servers}") private String servers; @Value("${sp...原创 2020-04-10 22:12:19 · 19532 阅读 · 14 评论 -
引入redis做为dubbo注册中心时报错
引入redis做为dubbo注册中心时报错信息如下,代码结构和maven依赖时复制官方示例的,原来是官方示例没有引入jedis依赖,加入即可<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId>...原创 2020-03-25 18:02:54 · 404 阅读 · 3 评论 -
微服务架构的多种部署模式
微服务架构的多种部署模式声明:本文主要内容来自《微服务架构设计模式》部署包含两个互相关联的概念:流程和架构。部署流程包括一些由开发人员和运维人员执行的过程,以便将软件发布到生产环境。部署架构定义了该软件运行的环境结构。以微服务架构开发的程序,经常涉及到多个服务组成,后端的网关模块,用户模块,日志模块,业务模块等,还有前端Node.js模块。以笔者所在公司为例,每次部署服务时都要互相之间沟...原创 2020-03-21 22:21:51 · 1748 阅读 · 0 评论 -
关于mybatis-plus中Service和Mapper的分析
在后端开发过程中,如果有用到mybatis-plus,肯定会发现在其内部存在着两种数据库操作接口,Iservice和BaseMapper,如果只是用增删改查会发现两者的功能是一致的,除了方法名称有所不同,其他的基本相似。对此,我颇为好奇,便打开两个接口的源码进行对比。先演示一下基本开发中的继承关系,手动创建的Service继承于ServiceImpl,并加载自己创建的Mapper@Servic...原创 2020-03-19 15:12:16 · 1924 阅读 · 0 评论 -
JAVA开发MQTT程序总结
JAVA开发MQTT总结MQTT 介绍它是一种 机器之间通讯 machine-to-machine (M2M)、物联网 Internet of Things (IoT)常用的一种轻量级消息传输协议适用于网络带宽较低的场合包含发布、订阅模式,通过一个代理服务器(broker),任何一个客户端(client)都可以订阅或者发布某个主题的消息,然后订阅了该主题的客户端则会收到该消息mq...原创 2020-02-24 18:13:01 · 1094 阅读 · 0 评论 -
Java高级应用---线程的三种创建方式
基本的Java线程模型有Thread类,Runnable接口,Callable接口和Future接口等,这些线程模型都是面向对象的。其中Thread类的run(),方法是线程中最重要的方法,用于执行线程要完成的任务,我们每次创建一个线程都要重写run方法,当然还有start()方法负责启动。Runnable接口用于标识某个Java类可否作为线程类,该接口只有一个抽象方法run,用于执行线程中的任务。一个尅实现Run原创 2017-02-14 11:01:05 · 289 阅读 · 0 评论 -
Java中导出jar包的方法以及错误处理
更多技术文章请访问我的个人博客总结一下关于JAR export finished with warnings.See details for additional information和找不到清单,加载不了主类的错误解决。今天在用java导出jar包的时候碰到了这个错误”JAR export finished with warnings.See details for additional inf原创 2017-02-10 20:48:33 · 25985 阅读 · 1 评论 -
Java中使用组件编写窗口实现网上文件的下载
如图package com.rain.get;import java.awt.*;import java.awt.event.*;import java.net.*;import java.io.*;import javax.swing.*;//从网络取得文件public class GetFileDemo extends JFrame{ JTextField jtfUrl;转载 2017-02-09 00:32:36 · 549 阅读 · 0 评论 -
Java中使用组件编写窗口实现网络图片的显示
更多技术文章请访问我的个人博客这篇文章使用Java组件显示窗口,在通过输入的图片url地址在窗口中显示出来,可作为一个网络图片查看器,感兴趣的可以打包成jar或者.exe文件方便使用,这里我只挂出了源码,效果如下图。package com.rain.image;import java.awt.*;import java.awt.event.*;import java.net.*;import转载 2017-02-08 23:00:59 · 3550 阅读 · 1 评论 -
使用Java对UTF8URL进行编码解码以及进行编码方式的判断
更多技术文章请访问我的个人博客在用搜索引擎搜索时,所输入的字符通常会被编码然后再查询,这篇文章将Java中对UTF8字符编码方式的检测,UTF8URL编码解码的代码挂了出来,需要时改变main函数中的url然后直接运行即可。package com.rain.demo;import java.io.UnsupportedEncodingException;public class UTF8{原创 2017-02-08 21:40:46 · 4835 阅读 · 2 评论 -
Java中的Base64加解密方法
Base64加密方法很方便,在保存一些特别数据时可以直接调用方法进行加密和解密的操作,我会发一篇专门介绍base64原理的文章,有兴趣的可以去我的个人博客里查看。下面是使用java进行base64加密与解密的源码,使用时在java项目中新建一个类,然后将代码挂上,在外部加密或解密直接实例化类,再调用响应函数即可,记住值的传递与接收原创 2017-02-06 17:10:26 · 585 阅读 · 0 评论 -
Java中线程同步的两种方式
更多技术文章请访问我的个人博客http://www.rainweb.site在多线程中,需要控制线程的访问次数,频率和优先级。比如在取钱时如果多个线程同时修改了账户余额,就会出现同步错误,所以Java中提供了线程同步的概念以保证某个资源在某一时刻只能由一个线程访问,保证共享数据的一致性。下面是一个模拟多线程存取钱时的操作。BankAccount.javapackage com.rain.demo;原创 2017-02-24 09:42:47 · 616 阅读 · 0 评论 -
Java线程同步之同步锁
更多技术文章请访问我的个人博客http://www.rainweb.site同步锁Lock是一种更强大的线程同步机制,通过显式定义同步锁对象来实现线程同步。同步锁提供了比同步代码块,同步方法更广泛的锁定操作,实现更灵活Lock是控制多个线程对共享资源进行访问的工具,能够对共享资源进行独占访问,每次只能有一个线程对Lock对象加锁,线程访问共享资源之前需要先获得Lock对象,某些锁可能允许对共享资源并原创 2017-02-27 09:33:08 · 491 阅读 · 0 评论 -
基于JavaWeb开发的图书管理系统
使用Java开发的图书管理系统如题,用Java开发而成,具备基础功能,读者可以注册登录,登录时会判断账号类型再分别跳到各自对应的页面,读者可以查找,借阅,还书,查看历史借阅记录,修改个人资料,密码等,管理员可以修改添加图书,修改添加读者,修改添加分类,管理借阅信息等等。项目在GitHub上的链接地址https://github.com/rainweb521/java_book_mana...原创 2018-03-21 09:26:42 · 73531 阅读 · 129 评论 -
人事管理系统
人事管理系统使用JavaEE开发,基于SpringMVC+Mybatis框架,该项目包含了用户管理、部门管理、职位管理、员工管理、公告管理、下载中心等多个模块,页面使用JQuery框架完成动态功能,用户管理、部门管理等模块包含了项目开发中常用的增删改查动作,下载中心包含了 Spring MVC的文件上传、下载等功能系统功能介绍用户管理的功能包括:添加用户,用户可以为管理员或者普...原创 2018-06-11 15:10:20 · 30437 阅读 · 55 评论 -
Java虚拟机内存区域溢出测试
Java虚拟机内存区域溢出测试测试内存溢出前,先配置Debug configurations,在Arguments中的VM arguments文本框中输入对应的虚拟机启动参数。然后在进行Run执行。这样可以让虚拟机在出现内存溢出异常时Dump当前的内存堆转储快照以便事后进行分析。Java堆溢出import java.util.ArrayList;import java.u...原创 2018-07-04 11:41:27 · 412 阅读 · 0 评论 -
Spring与微服务
Spring与微服务微服务的理念在微服务的概念逐步形成之前,绝大部分基于Web的应用都是使用单体架构的风格来进行构建的。在单体架构中,应用程序作为单个可部署的软件制品交付,所有的UI,业务,数据库访问等逻辑程序都被打包在一个应用程序中并部署在一个应用程序服务器上。虽然应用程序可能是作为单个工作单元部署,但大多数情况下,会有多个开发团队开发这个应用程序。每个开发团队负责应用程序的不同部分,随着...原创 2019-03-31 18:04:41 · 359 阅读 · 0 评论 -
《HeadFirst设计模式》第二章观察者模式-读书笔记
《HeadFirst设计模式》第二章观察者模式-读书笔记1. 背景这次的引子是关于气象站的应用,案例中要建立一个应用,有三种天气预报的展现形式,使用一个WeatherObject对象获得最新测量到的天气数据,然后对三个布告板进行实时更新。并且以后可能会新加入其他的布告板,需要系统有很高的扩展性。WeatherData对象知道如何跟物理气象站联系,以取得更新的数据。WeatherData对象会...原创 2019-09-27 16:04:11 · 283 阅读 · 0 评论 -
Gateway网关简介及使用
Gateway网关简介及使用1. 什么是 API 网关(API Gateway)分布式服务架构、微服务架构与 API 网关在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。AP...原创 2019-10-09 20:54:32 · 282834 阅读 · 54 评论