Java
文章平均质量分 69
damokelisijian866
这个作者很懒,什么都没留下…
展开
-
java项目启动停止脚本
sheel脚本 jar启动脚本 服务启动脚本 start.sh stop.sh原创 2022-08-08 20:26:17 · 618 阅读 · 1 评论 -
数据仓库分层概念介绍
数据层次介绍1、ODS:原始数据层,在结构上其与源系统的增量或者全量数据大体保持一致。2、DWD:明细数据层,过滤、转换等加工操作。3、DWS:汇总数据层,整合构建面向分析和统计的宽表。4、ADS:应用数据层,面向业务指标统计。5、DIM:公共维度层,基于维度建模理念思想,建立整个企业的一致性维度。6、TEMP:中间表、临时表特殊说明:具体仓库的分层情况需要结合业务场景、数据场景、系统场景进行综合考虑。...原创 2021-08-17 20:25:10 · 329 阅读 · 0 评论 -
RPC框架介绍以及手动实现RPC
前言:首先提出一个问题:为什么需要使用RPC,而不是简单的http接口?下面就说一下原因http接口在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段,优点就是简单、直接、开发方便。但是如果是一个大型的系统,内部子系统较多、接口非常多的情况下,RPC框架的好处就显现出来了。如下:首先是长链接。不必每次通信都要像http一样去进行3次握手和4次挥手,减少了网络开销。其次就是RPC框架一般都有注册中心,有丰富的监控管理。发布、下线接口、动态扩展等,对调用方来说是无感知原创 2020-11-23 00:41:42 · 899 阅读 · 10 评论 -
线上故障排查技巧大全
简介:有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从服务器、Java应用、数据库、Redis、网络和业务六个层面分享线上故障排查的思路和技巧。较长,同学们可收藏后再看。前言线上定位问题时,主要靠监控和日志。一旦超出监控的范围,则排查思路很重要,按照流程化的思路来定位问题,能够让我们在定位问题时从容、淡定,快速的定位到线上的问题。线上问题定位思维导图一 服务器层面1.1 磁盘1.1.1 问题现象当磁盘容量不足的时候,应用时常会抛出如下的异常信息:java.io.I.转载 2020-11-17 10:44:16 · 1408 阅读 · 2 评论 -
关于多线程中的ThreadLocal
ThreadLocal介绍概念:官方描述:该类提供了线程局部(thread-local)变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其get或set方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal实例通常是类中的private static字段,它们希望将状态与某一个线程(例如,用户ID或事务ID)相关联。自己简单理解:ThreadLocal是每个线程自己维护的一个存储对象的数据结构,线程间互不影响实现线程封闭。一般我们通过ThreadLocal对原创 2020-11-11 15:56:33 · 545 阅读 · 6 评论 -
基于grpc协议的微服务架构grpc-nebula
前言最近开发了一个基于grpc协议的微服务框架grpc-nebula的一个项目,此微服务框架已经开源但是比较小众,今天就简单分享下这个微服务架构。grpc-nebula分为java版本和c++版本,本次就只分享java版本的。虽然自己在工作中用不到,但是多了解些并且和自己所用框架进行对比,能够加深自己对微服务框架的理解程度以及拓宽知识的宽度。微服务框架介绍grpc简介grpc是一个多语言、高性能、开源的通用远程过程调用(RPC)框架。来自于Google的开源项目,2016年8月19日发布了成熟的原创 2020-11-10 00:17:39 · 5558 阅读 · 25 评论 -
关于分布式事务之2PC(两阶段提交)
概念:2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commitphase),2是指两个阶段,P是指准备阶段,C是指提交阶段。运行过程准备阶段:事务协调者询问参与者事务是否执行成功,参与者返回事务执行结果,此时事务并未提交。提交阶段:若所有参与者事务都执行成功,则事务协调者通知参与者事务提交事务;否则,事务协调者通知参与者回滚事务。XA接口规范协议XA接口规范协议是一个分布式事务协议,它的基础是两阶段提交协议(2PC)。X原创 2020-11-09 11:33:57 · 1114 阅读 · 6 评论 -
关于Java的自动拆装箱以及会带来的问题
首先介绍下几个基本的概念基本数据类型基本数据类型,是Java中不同类(Class)的特殊类型。它是我们编程中使用最频繁的类型。JJava是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化。Java基本烈性总共是8种,可以分为3类,如下:字符类型 char布尔类型 boolean数值类型 byte、short、int、long、float、double数值类型又可以分为整数类型byte、short、int、long和浮点类型float和double。Jav原创 2020-11-06 01:47:46 · 688 阅读 · 4 评论 -
幂等性的实现方案
我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果的。举几个例子:1、当我们付款时,如果发生网络问题导致重发或者系统bug重发,也是应该只扣一次钱;2、同样的信息发给哦那个胡,应该也只是发送一次3、在创建业务订单时一次业务请求只能创建一个概念:幂等(Idempotent)是一个数学与计算机学的概念,常见于抽象代数中。f(n) = 1^n // 无论n等于多少,f(n)永远值等于1在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函原创 2020-11-04 19:17:48 · 436 阅读 · 6 评论 -
MySQL表必须有主键吗?
前言:一般情况下,我们所使用的储存引擎是innodb,那今天我就基于存储引擎是innodb的情况来讨论下表是否必须有主键聚簇索引提到innodb就先介绍下聚簇索引的概念,聚集索引定义了表中数据的物理存储顺序。如何理解聚集索引呢,好比一个电话本,比如一个电话本是按照姓氏排序,并且电话号码紧跟着后面。因为聚集索引决定了表中数据的物理存储顺序,那么一个表则有且只有一个聚集索引。一个聚集索引可以包含多个列。好比一个电话本是基于名字,姓氏同时排序。Innodb选择一个聚集索引的过程对于Innodb,主键毫原创 2020-11-04 19:06:27 · 6753 阅读 · 8 评论 -
WebMvcConfigurer的介绍以及两种配置方式
前言公司的“僵尸项目”(好几年没维护和升级),昨天突然诈尸,出现了一个问题,需要解决,打开代码时,发现项目中用到的WebMvcConfigurerAdapter过期,需要用WebMvcConfigurer来做替换,今天就趁着说一下关于WebMvcConfigurer的两种配置方式。WebMvcConfigurer介绍WebMvcConfigurer是一个接口,提供很多自定义的拦截器,例如跨域设置、类型转化器等等。可以说此接口为开发者提前想到了很多拦截层面的需求,方便开发者自由选择使用。由于Spring原创 2020-08-12 22:35:46 · 3348 阅读 · 37 评论 -
关于异常以及如何统一处理异常
前言:最近公司新来的实习生,在写代码时,代码中出现代码中就会出现大量的try {…} catch {…} finally {…} 代码块,这种情况会产生大量的冗余代码,而且还影响代码的可读性。所以就异常处理这一块说收统一处理。一 .首先谈谈异常1.异常定义:阻止当前方法或作用域继续执行的问题。虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常。绝对一点说异常就是某种意义上的错误,就是问题,它可能会导致程序失败。之所以java要提出异常处理机制,就是要告诉开发人员,你的程原创 2020-08-06 00:41:57 · 1697 阅读 · 22 评论 -
关于内存泄漏和内存溢出
前言最近负责维护的一个项目出现了内存溢出的现象,今天就顺便说下内存泄漏和内存溢出简单释义:一、内存溢出和内存泄露一种通俗的说法。1、内存溢出:打个比喻,比如你申请了100个字节的空间,但是你在这个空间写入101或以上字节的数据,这时候就会出现溢出。2、内存泄漏:你用新建一个对象,申请了一块内存,后来这个对象长时间都不再使用了(按理应该释放),但是因为一直被某个或某些实例所持有导致 GC 不能回收,也就是该被释放的对象没有释放。下面具体介绍。1.1 内存溢出java.lang.OutOfMe原创 2020-07-20 18:23:48 · 552 阅读 · 27 评论 -
spring中scope的prorotype与singleton的区别
在配置文件中的单例中经常有scope的配置项的选择,如下:<bean id="writeSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryMaster" /> </bean> <bean id="readS原创 2020-06-23 20:58:10 · 716 阅读 · 13 评论 -
关于left join、right join和join等join的区别
前言:这两天,有个项目需要对SQL进行优化,公司的实习生对一些SQL的连接不太懂,今天和实习生讲解后就趁热打铁说一下各种join的区别。各种join的区别首先放两张关系图:下面就讲解下关系:多表查询分为 内、外连接外连接分为左连接(left join 或left outer join)、右连接(right join 或者 right outer join)、和完整外部连接 (full join 或者 full outer join)左连接(left join 或 left outer joi原创 2020-06-12 00:32:57 · 534 阅读 · 12 评论 -
java线程池的大小如何设置?
概念,IO密集型和CPU密集型CPU密集型(计算密集型):cpu密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力 计算机密集型任务主要消耗CPU资源,因此,代码运行效率至关重要,Python这样的脚本代码运行效率很低,完全不适合计算机密集型任务。对于计算密集型任务,最好用C语言编写。IO密集型IO密集型涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低原创 2020-06-10 21:39:26 · 1348 阅读 · 6 评论 -
Synchronized关键字的使用区别
Synchronized关键字的使用区别常用APImethod注释run()run()方法是我们创建线程时必须要实现的方法,但是实际上该方法只是一个普通方法,直接调用并没有开启线程的作用。start()start()方法作用为使该线程开始执行;Java虚拟机调用该线程的 run 方法。 但是该方法只能调用一次,如果线程已经启动将会抛出IllegalThreadStateException异常。yield()yield()方法让出CPU并且不会释放锁,让当前线程变为可原创 2020-06-10 01:34:47 · 475 阅读 · 10 评论 -
常用nginx转发匹配规则
一、正则表达式匹配:1、~ 为区分大小写匹配2、~* 为不区分大小写匹配3、!~ 和 !~* 分别为区分大小写不匹配及不区分大小写不匹配二、文件及目录匹配-f 和 !-f 用来判断是否存在文件-d 和 !-d 用来判断是否存在目录-e 和 !-e 用来判断是否存在文件或目录-x 和 !-x 用来判断文件是否可执行三.rewrite指令的最后一项参数为flag标记,flag标记有...原创 2020-03-23 22:44:17 · 874 阅读 · 12 评论 -
关于Java堆内存是线程共享的吗?
首先,在JVM的内存结构中,比较常见的两个区域是堆内存和栈内存关于这两个概念的介绍一般如下: 1、堆是线程共享的内存区域,栈是线程独享的内存区域。 2、堆中主要存放对象实例,栈中主要存放各种基本数据类型、对象的引用。但是其实以上两个结论并不是完全正确的。在解释原因之前首先抛出个问题:Java对象的内存分配过程是如何保证线程安全的?Java对象的内存分配过程是如何保证线程安全的?J...原创 2020-03-12 00:22:47 · 743 阅读 · 2 评论 -
HashMap的负载因子初始值为什么是0.75?
注:本片文章基于JDK1.8,特在此说明。一、首先介绍下负载因子的作用对于HashMap的研究,我之前一直停留在烤炉源码的实现,其实现在看来,系统默认的各种参数才是HashMap的精华所在。负载因子是和扩容机制有关的,意思时如果当前容器的容量达到了我们设定的最大值,就要开始执行扩容操作。举例说明下比如说当前的容器容量是16,负载因子是0.75,16*0.75=12,也就是说,当容量达到了1......原创 2020-03-09 23:13:58 · 3465 阅读 · 15 评论 -
为什么Java中静态方法不能调用非静态方法和变量?
这个问题在学习jvm的时候会遇到过首先看个例子一 例子我们先看效果效果:我们在静态方法main中调用非静态变量或者是方法都会报错。我们反过来看看反过来没有问题,这是什么原因呢?二、原因解释我们需要首先知道的是静态方法和静态变量是属于某一个类,而不是属于类的对象。先从jvm说起:这是一张类加载的生命周期图1、加载:加载是“类加机制”的第一个过程,在加载阶段,虚拟机主要完成...原创 2020-03-09 22:32:42 · 747 阅读 · 7 评论 -
The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in u
启动springboot项目时报错,报错内容:The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured.显示是8080端口被占用解决方法:cmd打开命令提示符,输入如下...原创 2020-01-17 21:50:55 · 388 阅读 · 0 评论 -
springcloud中zuul和feign的应用场景和区别?
1、zuul作为整个应用的流量入口,接收所有的请求,如app、网页等,并且将不同的请求转发至不同的微服务模块,其作用可视为nginx。2、feign则会将当前微服务的部分服务接口暴露出来,并且主要用于各个微服务之间的服务调用。两者的应用层次以及原理均不相同。3、zuul也含有hysstrix和ribbon,基于http通讯的,可以直接代理服务就行。在它和服务间增加feign只会增加通讯消耗,没...原创 2020-01-16 23:47:23 · 810 阅读 · 2 评论 -
HashMap默认容量为16的原因
集合是Java开发日常中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于我们来说并不陌生。在日常开发中我们会经常以如下方式创建一个HashMap:Map<String, String> map = new HashMap<String, String>();但是上面的代码有个问题,我们并没有指定容量,这个新创建的HashMap有一个默认容量。...原创 2019-12-10 00:42:42 · 896 阅读 · 12 评论 -
关于Java8 Stream
Java8 Stream的总结一、Stream的特性Stream是Java 8新增的接口,Stream可以认为是一个高级版本的Iterator。它代表着数据流,流中的数据元素的数量可以是有限的,也可以是无限的。Stream和Iterator的差别:无储存:Stream是基于数据源的对象,它本身不储存数据元素,而是通过管道将数据源的元素传递给操作。函数式编程:对stream的任何修改都不...原创 2019-12-09 00:09:18 · 381 阅读 · 7 评论 -
关于Java的深拷贝、浅拷贝
前言:在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值、浅拷贝、深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,下面就对后面两种方式做一些介绍前置知识值类型:Java的基本数据类型,例如int 、float引用类型:自定义类和Java包装类(String、Integer)直接赋值直接赋值是我们最常用的方式,...原创 2019-12-04 23:28:10 · 254 阅读 · 2 评论 -
用Optional处理空指针
前言:对于空指针NullPointException大家不陌生,在工作中也经常会去处理空指针。为了方便大家更好的处理NPE,Java8中引入了一个新类java.util.Optional。其实 ,Optional 类的的使用只是提示你这里可能存在空值,需要特殊处理,并提供了一些特殊处理的方法。如果你把 Optional 类当作空指针的救命稻草而不加思考的使用,那么依旧会碰到错误。因为 Op...原创 2019-11-14 23:38:07 · 1280 阅读 · 2 评论 -
如何应对缓存穿透和缓存雪崩问题?如何解决Redis的并发竞争key问题?
1、如何解决缓存穿透和缓存雪崩问题?问题分析:这两个问题一般在中小型传统软件企业很难碰到这个问题。如果有大并发的项目,流量有几百万左右。这两个问题一定要深刻考虑。**回答:**缓存穿透,即当黑客故意去请求缓存中不存在的数据,导致所有的请求都到数据库上了,从而数据库连接异常解决方案:1、利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。2、采用...原创 2019-11-11 22:23:17 · 319 阅读 · 4 评论 -
防止表单重复提交的4种方法
一、背景和介绍:平时开发的项目中可能会出现下面这些情况:由于用户误操作,多次点击表单提交按钮。由于网速等原因造成页面卡顿,用户重复刷新提交页面黑客或恶意用户使用postman等工具重复恶意提交表单(攻击网站)。这些情况都会导致表单重复提交,造成数据重复,增加服务器负载,严重甚至会造成服务器宕机。因此有效防止表单提交有一定的必要性。二、解决方案1、通过js代码,当用户点击提交按钮后...原创 2019-11-10 22:22:28 · 453 阅读 · 2 评论 -
为什么要重写hashcode和equals方法?
1.通过Hash算法来了解HashMap对象的高效性我们首先了解下数据结构中的一个知识点:在一个长度为n(假设是10000)的 线性表(假设是ArrayList)里,存放着无序的数字;如果我们要找一个指定的数字,就不得不通过从头到尾一次便利来查找,这样的平均查找次数是除以2(这里是5000)。对于Hash表(这里的Hash表纯粹是数据结构上的概念,和Java无关)。它的平均查找次数接近于1,代...原创 2019-11-09 16:27:29 · 294 阅读 · 0 评论 -
关于SpringSecurity
前言:通过本篇文章你将了解到:SpringSecurity 中的一些核心类使用SpringSecurity基于角色的权限校验SpringSecurity的不足SpringSecurity核心类登录校验流程:UsernamePasswordAuthenticationFilter => 用户登陆验证,但这个类里并不会正真去进行登陆校验,而是通过ProviderManager...原创 2019-11-09 02:55:57 · 312 阅读 · 0 评论 -
为什么一般不建议使用Executors创建线程池?
前言:阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,通过源码分析禁用的原因通过阅读本篇文章,你将会了解到:线程池的定义Executors创建线程池的几种方式ThreadPoolExecutor对象线程池执行任务逻辑和线程池参数的关系Executors创建返回ThreadPoolExecutor对象...原创 2019-11-09 02:36:20 · 2345 阅读 · 4 评论 -
Dubbo常见一些概念解析
dubbo的定义dubbo是一款高性能、轻量级的开源RPC框架,提供服务自动注册、自动发现等高效服务治理方案,可以和Spring框架无缝集成。使用场景:透明化的远程方法调用:就行调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。软负载均衡及容错机制:可在内网代替F5等硬件负载均衡器,降低成本,减少单点。服务自动注册与发现:不再需要写死服务提供方地址,注册中心基于接口名查询...原创 2019-10-31 23:28:29 · 273 阅读 · 0 评论 -
HTTPS解析
一、首先说下HTTP存在的问题1.1 可能被窃听HTTP 本身不具备加密的功能,HTTP 报文使用明文方式发送由于互联网是由联通世界各个地方的网络设施组成,所有发送和接收经过某些设备的数据都可能被截获或窥视。(例如大家都熟悉的抓包工具:Wireshark)1.2 认证问题1.无法确认你发送到的服务器就是真正的目标服务器(可能服务器是伪装的)2.无法确认你发送到的服务器就是真正的目标...原创 2019-10-31 00:35:11 · 582 阅读 · 2 评论 -
HTTP解析
首先说下计算机通信原理互联网的关键技术就是TCP/IP协议。两台计算机之间的通信是通过TCP/IP协议在因特网上进行的。实际上这个是两个协议:TCP:Transmission Control Protocol传输控制协议IP:Internet Protocol网际协议引自维基百科TCP/IP协议族是一个网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构。该协议家族的两个核...原创 2019-10-31 00:13:10 · 554 阅读 · 2 评论 -
HTTPS客户端和服务端建立安全连接的握手过程
握手过程:1.客户端给出协议的版本号、一个客户端生成的随机数和客户端支持的加密算法;2.服务端在客户端给出的加密算法列表中选出一种,并给出数字证书和就一个服务端生成的随机数3.客户端确认数字证书的有效性,然后生成一个新的随机数,并使用数字证书中的公钥加密这个随机数;4.服务端使用私钥解密,获取客户端发来的随机数;5.客户端和服务端根据约定的加密方法,使用之前的三个随机数,生成对话秘钥,这...原创 2019-10-30 22:49:07 · 381 阅读 · 4 评论 -
Dubbo的SPI的分析
首先定义:SPI:即Service Provider Interface,释义为服务提供接口JDK SPI:Java的spi机制,是去扫描/META-INF/service/的接口名文件,并获取文件中的值。以mysql的驱动类来做为案例。打开对应文件:ServiceLoader<Command> serviceLoader=ServiceLoader.load(Command....原创 2019-10-30 00:09:46 · 259 阅读 · 0 评论 -
spring Bean的完整生命周期
spring容器中的bean的完整生命周期一共分为是11步1、bean对象的实例化2、封装属性,也就是设置properties中的属性值3、如果bean实现了BeanNameAware,则执行setBeanName方法,也就是bean中的id值4、如果实现了BeanFactoryAware或者ApplicationContextAware,需要设置setBeanFactory或者上下文对象...原创 2019-10-29 23:35:52 · 284 阅读 · 3 评论 -
kafka原理解析
前言:kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模中的网站中的所有动作流数据,具有高性能、持久化、多副本备份、横向扩展能力等等。基础架构及术语话不多说,先看图,通过这张图我们来捋一捋相关的概念及之间的关系:名词解释Producer:即生产者,消息的产生者,是消息的入口。Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我...原创 2019-10-29 00:13:14 · 821 阅读 · 5 评论 -
多个单列索引和联合索引的区别
背景:为了提高数据库效率,建索引是家常便饭;那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。一、联合索引测试注:Mysql版本为 5.7.20创建测试表(表记录数为63188):CREATE TABLE `t_mobilesms_11` ( `id` bigint(20) NOT NULL AU...转载 2019-10-28 01:05:44 · 321 阅读 · 0 评论