java后端
文章平均质量分 60
Wayyyyyyyy
Java程序猿 积累 沉淀
展开
-
@Async 导致该Bean在循环依赖时启动报错
今天在开发代码的时候遇到了一个启动错误,错误内容大致就是:org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'classA': Bean with name 'classA' has been injected into other beans [classB] in its raw version as part of a circular referen原创 2021-05-12 18:23:14 · 518 阅读 · 0 评论 -
Codis与RedisCluster的原理详解
Codis与RedisCluster的原理详解背景介绍#我们先来看一下为什么要做集群,如果我们要部署一个单节点Redis,很明显会遇到单点故障的问题。首先能想到解决单点故障的方法,就是做主从,但是当有海量存储需求时,单一的主从结构就会出问题,说问题之前要先了解一下主从之间是如何复制的。我们把Redis分为三个部分,分别是客户端、主节点以及从节点,如果从节点要同步主节点的数据,它首先会发Sync指令给主节点,主节点收到指令之后会执行BGSAVE命令生成RDB文件,这个RDB文件指的是快转载 2021-03-13 14:58:50 · 206 阅读 · 0 评论 -
SpringBoot集成kafka全面实战
一、生产者实践 普通生产者 带回调的生产者 自定义分区器 kafka事务提交 二、消费者实践 简单消费 指定topic、partition、offset消费 批量消费 监听异常处理器 消息过滤器 消息转发 定时启动/停止监听器 一、前戏1、在项目中连接kafka,因为是外网,首先要开放kafka配置文件中的如下配置(其中IP为公网IP),advertised.listeners=PLAIN转载 2021-01-05 17:18:05 · 720 阅读 · 0 评论 -
一致性hash算法详解
目前正在维护公司的分布式任务调度平台,在任务节点的分配上使用到了一致性hash算法,特此记录,那么在后面的博文中会给出基于java实现的一致性hash算法的代码,以及分布式调度平台的一些设计思路。1.hash算法那么什么是hash算法呢,百度百科的定义如下:哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。普通的hash算法在分布式应用中的不足:比如,在分布式的存储系统中,要将数据存储到具体的节点上,如果转载 2020-12-08 16:04:09 · 146 阅读 · 0 评论 -
布隆过滤器介绍以及布隆过滤器的实现
一·简介 布隆过滤器(Bloom Filter)实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”。二·原理1·刚开始是一个全部位为0的bit 向量或者说 bi...原创 2020-12-04 11:17:50 · 209 阅读 · 0 评论 -
动态修改LOGGER级别—— Arthas
一·背景记得前阵子,我在工作中就遇到过一个生产环境数据的排查,但是大多数情况下,我们的项目在部署的时候就已经定义了LOGGER级别,用来控制输出的信息范围。一般生产环境上我们的日志级别会设置成info级别因为,过多的输出会影响输出和查看日志的效率,另一方面,过少的日志让问题定位变得困难。所以当生产出现问题时,线上容器通常定义在info级别,发生一些疑难问题时,光靠info级别的日志很难定位问题。二·Arthas介绍Arthas是阿里开源的Java诊断工具。官方网站:h..原创 2020-12-04 11:09:50 · 876 阅读 · 0 评论 -
Java的快速失败与安全失败与遍历修改
一、快速失败(fail—fast)在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出 Concurrent Modification Exception。原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变 modCount 的值。每当迭代器使用 hashNext()/next() 遍历下一个元素之前,都会检测 modCount 变量是否为 expectedmodCou原创 2020-10-21 10:48:43 · 182 阅读 · 0 评论 -
Zookeeper集群与Leader选举
ZooKeeper是一个开源分布式协调服务、分布式数据一致性解决方案。可基于ZooKeeper实现命名服务、集群管理、Master选举、分布式锁等功能。高可用为了保证ZooKeeper的可用性,在生产环境中我们使用ZooKeeper集群模式对外提供服务,并且集群规模至少由3个ZooKeeper节点组成。集群至少由3个节点组成ZooKeeper其实2个节点也可以组成集群并对外提供服务,但我们使用集群主要目的是为了高可用。如果2个节点组成集群,其中1个节点挂了,另外ZooKeeper节点不能正常转载 2020-08-18 15:40:33 · 788 阅读 · 0 评论 -
CP和AP有是什么?有什么区别?
最近有时间研究分布式架构,因为公司使用的Zookeeper,并没有使用Spring Cloud Eureka,所以想探究一下他们之间的区别,于是看到简书里的文章:Spring Cloud Eureka简介及与Zookeeper对比,明显的区别可能就是Zookeeper为CP设计,而Eureka为AP设计,但是对CAP/AP/CP很不理解,于是查阅资料,做一个简单的了解。Eureka服务治理机制与Dubbo服务治理机制的比较Feature Eureka Zookeeper 服务健康检转载 2020-08-18 15:31:32 · 18800 阅读 · 4 评论 -
Hystrix熔断机制原理剖析
一、前言在分布式系统架构中多个系统之间通常是通过远程RPC调用进行通信,也就是 A 系统调用 B 系统服务,B 系统调用 C 系统的服务。当尾部应用 C 发生故障而系统 B 没有服务降级时候可能会导致 B,甚至系统 A 瘫痪,这种现象被称为雪崩现象。所以在系统设计时候要使用一定的降级策略,来保证当服务提供方服务不可用时候,服务调用方可以切换到降级后的策略进行执行。二、Hystrix 中基于自反馈调节熔断状态的算法原理我们可以把熔断器想象为一个保险丝,在电路系统中,一般在所有的家电系统连接外部供电转载 2020-08-14 14:10:27 · 491 阅读 · 0 评论 -
谈谈服务限流算法的几种实现
保障服务稳定的三大利器:熔断降级、服务限流和故障模拟。今天和大家谈谈限流算法的几种实现方式,本文所说的限流并非是Nginx层面的限流,而是业务代码中的逻辑限流。为什么需要限流按照服务的调用方,可以分为以下几种类型服务1、与用户打交道的服务比如web服务、对外API,这种类型的服务有以下几种可能导致机器被拖垮: 用户增长过快(这是好事) 因为某个热点事件(微博热搜) 竞争对象爬虫 恶意的刷单 这些情况都是无法预知的,不知道什么时候会有10倍甚至20倍的流转载 2020-08-13 17:53:40 · 253 阅读 · 0 评论 -
常用4种限流算法介绍及比较
1、计数器(固定窗口)算法计数器算法是使用计数器在周期内累加访问次数,当达到设定的限流值时,触发限流策略。下一个周期开始时,进行清零,重新计数。此算法在单机还是分布式环境下实现都非常简单,使用redis的incr原子自增性和线程安全即可轻松实现。这个算法通常用于QPS限流和统计总访问量,对于秒级以上的时间周期来说,会存在一个非常严重的问题,那就是临界问题,如下图:假设1min内服务器的负载能力为100,因此一个周期的访问量限制在100,然而在第一个周期的最后5秒和下一个...转载 2020-08-13 17:46:18 · 223 阅读 · 0 评论 -
限流算法
保障服务稳定的三大利器:熔断降级、服务限流和故障模拟。今天和大家谈谈限流算法的几种实现方式,本文所说的限流并非是Nginx层面的限流,而是业务代码中的逻辑限流。为什么需要限流按照服务的调用方,可以分为以下几种类型服务1、与用户打交道的服务比如web服务、对外API,这种类型的服务有以下几种可能导致机器被拖垮: 用户增长过快(这是好事) 因为某个热点事件(微博热搜) 竞争对象爬虫 恶意的刷单 这些情况都是无法预知的,不知道什么时候会有10倍甚至20倍的流转载 2020-08-13 17:42:02 · 132 阅读 · 0 评论 -
代理模式中静态代理、jdk动态代理、cglib动态代理有什么不同?
1.静态代理首先,写一个要实现的目标的接口:/** * @author liangliwei * @description * @date 2020-08-12 09:42:20 */public interface TargetInterface { String sayHello(String name);}然后再写一个目标实现类,也就是需要被代理(增强)的类:/** * @author liangliwei * @description * @date原创 2020-08-12 11:37:25 · 113 阅读 · 0 评论 -
Java并发之AQS详解
Java并发之AQS详解一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大纲: 概述 框架 源码详解 简单应用 若有不正之处,...转载 2020-07-29 15:15:08 · 126 阅读 · 0 评论 -
看完这篇ThreadLocal的详解,你也能用得这么溜
开场白张三最近天气很热心情不是很好,所以他决定出去面试跟面试官聊聊天排解一下,结果刚投递简历就有人约了面试。我丢,什么情况怎么刚投递出去就有人约我面试了?诶。。。真烦啊,哥已经不在江湖这么久了,江湖还是有哥的传说,我还是这么抢手的么?太烦恼了,帅无罪。暗自窃喜的张三来到了某东现场面试的办公室,我丢,这面试官?不是吧,这满是划痕的Mac,这发量,难道就是传说中的架构师?张三的心态一下子就崩了,出来第一场面试就遇到一个顶级面试官,这谁顶得住啊。你好,我是你的面试官Tony,看我的发型转载 2020-07-29 10:51:37 · 305 阅读 · 0 评论 -
synchronized四种锁状态的升级
一、背景在 Java 语言中,使用 Synchronized 是能够实现线程同步的,即加锁。并且实现的是悲观锁,在操作同步资源的时候直接先加锁。加锁可以使一段代码在同一时间只有一个线程可以访问,在增加安全性的同时,牺牲掉的是程序的执行性能,所以为了在一定程度上减少获得锁和释放锁带来的性能消耗,在 jdk6 之后便引入了“偏向锁”和“轻量级锁”,所以总共有4种锁状态,级别由低到高依次为:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。这几个状态会随着竞争情况逐渐升级。注意:锁可以升级但不能降级。转载 2020-07-10 11:23:26 · 207 阅读 · 0 评论 -
CountDownLatch怎么使用?一个简单的Demo与使用注意事项
前言在工作中,大家应该比较少用到CountDownLatch,但是CountDownLatch在面试中或者多线程的相关知识点面试中还是经常被问到,所以这次跟大家复习一下CountDownLatch的简单使用。什么是CountDownLatch(线程计数器 )CountDownLatch 类位于 java.util.concurrent 包下,利用它可以实现类似计数器的功能。比如有一个任务 A,它要等待其他 4 个任务执行完毕之后才能执行,此时就可以利用 CountDownLatch.原创 2020-07-09 16:17:46 · 807 阅读 · 0 评论 -
java多线程-线程池ThreadPoolExecutor的拒绝策略
在分析ThreadPoolExecutor的构造参数时,有一个RejectedExecutionHandler参数。RejectedExecutionHandler是一个接口:public interface RejectedExecutionHandler { void rejectedExecution(Runnable r, ThreadPoolExecutor executor);}里面只有一个方法。当要创建的线程数量大于线程池的最大线程数的时候,新的任务就会被拒绝,.原创 2020-06-22 09:54:24 · 351 阅读 · 0 评论 -
单例模式详解以及破坏单例模式的方法
前言单例模式是 Java 设计模式中最简单的一种,只需要一个类就能实现单例模式,但是,你可不能小看单例模式,虽然从设计上来说它比较简单,但是在实现当中你会遇到非常多的坑,所以,系好安全带,上车。单例模式的定义单例模式就是在程序运行中只实例化一次,创建一个全局唯一对象,有点像 Java 的静态变量,但是单例模式要优于静态变量,静态变量在程序启动的时候JVM就会进行加载,如果不使用,会造成大量的资源浪费,单例模式能够实现懒加载,能够在使用实例的时候才去创建实例。开发工具类库中的很多工具类都应用...转载 2020-06-20 18:36:59 · 259 阅读 · 0 评论 -
如果这篇文章说不清epoll的本质,那就过来掐死我吧
从事服务端开发,少不了要接触网络编程。epoll作为linux下高性能网络服务器的必备技术至关重要,nginx、redis、skynet和大部分游戏服务器都使用到这一多路复用技术。文/罗培羽因为epoll的重要性,不少游戏公司(如某某九九)在招聘服务端同学时,可能会问及epoll相关的问题。比如epoll和select的区别是什么?epoll高效率的原因是什么?如果只靠背诵,显然不能算上深刻的理解。网上虽然也有不少讲解epoll的文章,但要不是过于浅显,就是陷入源码解析,很少能有通俗易懂的。于是转载 2020-06-10 16:28:57 · 165 阅读 · 0 评论 -
epoll的简单讲解
首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来),这时候该怎么办?阻塞:阻塞是个什么概念呢?比如某个时候你在等快递,...转载 2020-06-10 15:22:09 · 159 阅读 · 0 评论 -
常见数据库连接池性能分析对比
背景对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池。 NOTE: 本文所有测试均是MySQL库测试结论 1:性能方面hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。 2:druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。 3:综合性能,扩展性等方面,可考虑使用druid或者hik...转载 2020-06-10 11:48:56 · 956 阅读 · 0 评论 -
Java反射遍历判断值是否属于枚举类Enum
今天在开发的时候遇到一个判断需求:判断一个值是否属于枚举类。之前写的话都是通过在if里面写上|| 或来连接 或者为每个枚举Enum写一个遍历判断的方法。后来想了一下实在太麻烦了,加入枚举类改变的话业务代码的判断也需要改变比较麻烦,工具类也没找到相关的,于是自己通过反射写了一个循环遍历判断枚举类。首先,是一个枚举类:public enum AuditState { TO_BE_AUDIT(0, "待审核"), AUDITED(1, "已审核"); .原创 2020-06-08 10:53:18 · 8381 阅读 · 1 评论 -
Java Html实现带token的文件上传
今天要实现一个带token认证的文件上传 参数中既有token 也有文件流首先上html代码:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>文件上传测试</title></head><b...原创 2020-04-09 12:07:12 · 983 阅读 · 0 评论 -
redis应用中自增安全吗?
redis是单线程运行,所以多个redis命令是一个一个执行,所以是线程安全的 但是分开的两个redis命令,对于整个应用来说不是线程安全的,因为这两个redis命令之间会有其他命令,就像多线程环境下,java线程不安全的i++操作,这个两个redis命令没有事务管理 可以用RPOPLPUSH或者INCR,或者lua脚本,实现多个redis操作合为一个命令,这样就对于线...原创 2020-03-31 10:21:26 · 2208 阅读 · 0 评论 -
为什么重写equals一定要重写hashcode?
大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白,以下是我的一些个人理解。这是Object类关于这两个方法的源码,可以看出,Object类默认的equals比较规则就是比较两个对象的内存地址。而hashcode是本地方法,java的内存是安全的,因此无法根据散...转载 2020-03-26 10:22:19 · 79 阅读 · 0 评论 -
java.lang.UnsupportedOperationException解决方法
今天做项目的时候遇到一个报错java.lang.UnsupportedOperationException,没看控制台报错的时候以为是空指针报错。可是经过debug发现栈中变量都没发现啥问题,其中报错的代码为List<String> supEmailList = Arrays.asList(supEmails);if (StringUtils.isNotBlank(user.g...原创 2019-12-24 13:56:46 · 223 阅读 · 0 评论 -
Spring boot 注解@Async不生效 无效 不起作用
今天在做公司项目时,有一个发邮件的需求。所以写了一个发送邮件的方法后来发现发邮件很慢,导致接口响应也很慢。于是我便想到要使用异步调用去处理这个方法。于是我把注解@Async 加到了自己service类下的一个发邮件的一个方法,后来发现并没有生效。调用处代码:我在以下两个方法上都试过加上@Async注解 可是都并没有生效发送邮件代码:我思考了一下可能应该是因为...原创 2019-12-20 10:31:20 · 25024 阅读 · 7 评论 -
Mac如何替换jar包指定的文件
今天做项目需要把dubbo服务接口更新到公司内中央仓库 但是这个对外提供dubbo服务的的jar跟项目的jar不一样 所以需要把class文件替换之前的jar,上网找了很多方法 ,感觉先解压了再打包jar比较麻烦 而且mac中又不可以像windows那样直接操作打开替换jar文件 上网找了一些资料jar uvf demo.jar demo.class但是这样会直接把demo.class 直...原创 2019-10-23 11:19:47 · 3981 阅读 · 1 评论 -
如何动态调用jar包里的方法以及结合freemarker生成html模板要注意的地方
最近刚刚转正没多久,正好前天部门大佬让我和一个同事做一个自动化的软件测试程序,通过导入一些excel的测试数据表格来生成测试html报告。而我负责的主要是freemarker生成html还有另外一个同事通过jar包调用我的方法.前者的freemarker转静态页面还是比较简单的,后者的话刚刚听到这个需求的时候其实我觉得有点迷惑,为什么不直接做成一个web应用或者打成一个jar包 还要打成几...原创 2018-07-05 16:02:29 · 1755 阅读 · 0 评论 -
Spring依赖注入和实例化(new)的差别
Spring依赖注入和实例化(new)的差别。 Sping为什么使用依赖注入而不使用实例化对象的方式? 首先说明一下概念 依赖注入(Dependency of Injection)和控制反转(Inversion of Control 简称:ioc)是一个概念。 具体含义: 当某个角色(java实例class A,调用者)需要另一个角色(另一个Java实例class B,被调用者)的...转载 2018-09-21 10:32:59 · 3833 阅读 · 3 评论 -
Idea Springboot热部署 页面刷新
最近用Idea做Springboot时发现按照百度的一些文章开启热部署功能依旧不行。今天自己无意中发现了一个小配置把这两个配置改为以下就可以了原创 2018-09-21 18:07:49 · 869 阅读 · 0 评论 -
如何在ehcache.xml中使用本地ehcache.xsd文件
今天用springboot做缓存时发现在idea中<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">会报错,刚开始以为是公司代理墙了或者网速慢即使换为<ehcache xmlns:...原创 2018-10-10 17:12:52 · 6335 阅读 · 3 评论 -
Jconsole本地进程列表灰色connect不了的解决方法
Jconsole是java中自带的一个很有用的查看线程 内存以及检测死锁的一个很有用的工具。使用方法也很简单,就是打开cmd命令行后在cmd中输入jconsole可是今天在公司的电脑使用时发现以下问题:一些本地线程灰色无法点击并连接google一下找到了解决方法,下面我以idea为例:打开并编辑启动配置在VM options中填入-Dcom.sun.mana...原创 2018-10-24 10:56:51 · 1682 阅读 · 0 评论 -
关于AES加解密java.security.InvalidKeyException的错误解决方法
最近springboot做项目时,在window上启动 调用服务没有问题,可是部署在linux后服务之间调用却出现了问题debug看报错信息,刚开始看到的报错的信息报的是javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher...原创 2018-12-24 16:30:30 · 10151 阅读 · 3 评论 -
解决Window运行docker容器无法进行端口映射的问题
在安装了一个Windows下安装了docker,并尝试在其中运行Nginx服务,但映射完毕之后,在主机的浏览器中,打开localhost:port无法访问对应的服务。原因:docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。也就是说,服务中使用的localhost指的是这个Linux...转载 2019-05-07 01:16:21 · 1058 阅读 · 0 评论 -
简单学会配置Nginx反向代理与负载均衡
下面以springboot 项目为例 分别编写了两个简单的配置我项目一个启动9129端口 另外一个启动为9130端口nginx启动命令后台:brew services start nginx(homebrew是用)非后台:nginx停止 刷新命令Nginx -s stopNginx -s quitNginx -s reload下面以spring...原创 2019-09-19 18:20:20 · 161 阅读 · 0 评论 -
redis的事务是否具有原子性?
众所周知,redis可以通过MULTI EXEC DISCARD等来实现“事务”。但是事务应该具有ACID 四大特性,下面我就来探讨一下redis的事务是否具有A——原子性。 首先,我们看第一种情况,语句格式语法错误:127.0.0.1:6379> multiOK127.0.0.1:6379> hset myhash java 10QUEU...原创 2019-09-30 11:07:10 · 1521 阅读 · 1 评论