- 博客(29)
- 收藏
- 关注
原创 容灾多活解决方案
容灾多活解决方案同城双活两个中心机房各有一组服务,两组服务层各接收50%的流量;资源层(数据库等等)分主备,分别部署在两个中心机房中,默认只使用主资源层,数据同步到备用资源层;当某一中心机房不可用的时候,在DNS域名解析环节把故障机房地址映射信息摘除,这样全部流量就到了正常的机房中。DNS一般部署在两个机房外的第三方或者云上,防止出现因为某个中心数据故障而无法进行数据切换。只使用一个资源层的原因:资源层的数据双活难度大,数据一致性很难100%保证。缺点:没有异地容灾能力,当整个城市出现问题
2022-03-20 22:57:19
5628
原创 数据一致性解决方案
数据一致性解决方案CAP理论C:一致性、A:可用性、P:分区容错性CAP只能满足两个CA:两阶段提交的严格选举协议CP弱A:RAFT协议等多数派选举协议AP:GOSSIP等冲突解决协议数据一致性时间一致性:所有相关数据副本任意时刻数据一致事务一致性:事务之行前后数据一致应用一致性:分布式事务一致BASE理论基本可用:允许偶尔失败软状态:数据状态要求任意时刻一致最终一致性:弱一致性数据一致性解决方案多副本数据一致性:一般用于容灾和高可用:副本之间通过同步复制或者异步复制的方式
2022-03-12 21:26:10
6050
原创 幂等问题解决方案
幂等问题解决方案幂等问题是现在开发中很常见的一些问题,在没有做幂等校验的时候会带来一些很严重的问题:重复提交表单由于网络波动或者其他原因没有及时响应,用户以为没有提交成功反复点击提交,可能造成重复执行、重复消费,给公司的利益带来损失;如果恶意用户利用这个漏洞,很可能会给公司带来巨大的损失。那么幂等校验该如何做呢?幂等校验方式数据库唯一主键原理:利用数据库的唯一主键特性,添加数据到数据库,如果唯一主键有重复,添加失败并且报错。适合场景:这种方式会直接把数据传到数据库进行执行,占用数据库资源
2022-03-06 10:42:43
614
原创 关于代码质量的思考
关于代码质量的思考写了几年的代码,每次开发完成之后都在总结怎么才能做的更好,中间也读过几本提升代码质量的书,比如《代码整洁之道》《重构 改善既有代码的设计》等等,书中有些观点让我醍醐灌顶,有些观点我还是不太理解,有可能是不同的开发模式带来的差异,也有可能是我没有达到那种高度。但是这几年还是有不少收获。单元测试和代码review单元测试:关于单元测试,争议有很多,很多人说他们没有单元测试,代码也跑得好好的,觉得单元测试没有必要,浪费时间和精力。其实现在很多大厂对于单元测试还是很重视的,也有不少相关的
2022-02-28 22:08:01
209
原创 关于代码规范的思考 -- mybatis篇
关于代码规范的思考 – mybatis篇最近在进行项目的重构,遇到了很多代码质量相关的问题,简单聊一下我对代码质量的一些思考。一个统一的良好的规范在现在项目开发中特别重要。下面是我在工作中遇到的几个感觉不合理的地方:一个mapper里面出现了多张表相关的sql,并且没有规律。带来问题:写时一时爽,维护气断肠。如果需要修改某个表的某个字段,修改的时候就会发现好多mapper都需要修改。解决思路:将相同表的sql放在同一个mapper里面,如果需要修改,只用改一个mapper就行;直接使用m
2022-02-20 21:36:19
445
原创 浅谈服务发布方式(蓝绿部署、金丝雀发布、滚动升级)
浅谈服务发布方式(蓝绿部署、金丝雀发布、滚动升级)最近由于其他依赖服务升级的问题导致我们的项目大面积不可用,造成了较大的损失,因此仔细梳理了一下服务升级的方式。这几种方式各有优点,可以根据自己当前项目的现状,选择合适的部署方式,以最小的代价完成服务的升级。蛮力发布传统发布升级,手动将要升级的服务替换。适合场景:服务单节点部署。服务数量少。服务中断对于业务没多少影响。新旧版本的代码可以不兼容,改动可以很大。注意事项:手动升级在服务多的时候会非常繁琐。升级时候会有服务中断。原始版本
2022-02-17 23:13:59
765
原创 SPRING全局返回值处理报错:CommonResult cannot be cast to class java.lang.String
SPRING全局返回值处理报错:CommonResult cannot be cast to class java.lang.String问题描述解决方案问题分析解决方案分析问题描述项目统一做了全局返回值处理之后,controller层的方法返回值是String类型,报错CommonResult cannot be cast to class java.lang.String解决方案最终的处理方法是,String类型的不做包装,直接返回成String类型的。AbstractJackson2Htt
2022-01-14 12:33:07
2817
1
原创 JVM垃圾收集器
JVM垃圾收集器1、Serial系列:Serial+Serial old(搭配使用)Serial:年轻代的单线程垃圾回收器,采用的是复制算法,cpu的使用效率较低,GC时停顿时间较长。Serial ld:老年代的单线程垃圾回收器,采用的是标记整理算法,cpu的使用效率较低,GC时停顿时间较长。2、Parrallel系列:Parallel Scavenge+Parallel old(搭配使用)Parallel Scavenge:年轻代的多线程垃圾回收器,采用的是复制算法,吞吐量优先,
2021-07-18 15:35:21
51
原创 jvm垃圾回收机制
JVM垃圾回收机制标记垃圾引用计数法:如果对象有引用,则对象的引用数+1,引用结束,引用数-1,引用数为0的就是垃圾。缺点:会存在循环引用的问题。用途:分布式垃圾回收会使用引用计数可达性分析:从根节点不可以到达的对象都是垃圾垃圾回收算法标记清除算法:将标记成垃圾的对象直接清除缺点:会导致内存空间不连续,使用率低复制算法将内存区域分成等分的两部分,每次使用一部分,当发生垃圾回收的时候,将存活的对象复制到内存的另一半,然后清空之前使用的,使用另一半内存。缺点:内存每次只能使用一半,使
2021-07-15 21:58:18
63
原创 JVM学习
JVM学习JVM的构成类加载器、运行时数据区、执行引擎、本地方法接口。类加载的流程:首先, 类加载器 会根据类的全限定名将类加载到 运行时数据区 的方法区内,我们常写的java代码是不能够被执行的,需要先编译成字节码,字节码是jvm可以识别的语言,不能被机器所执行,所以需要使用 执行引擎 将字节码编译成机器所能识别的语言,在执行的过程中再调用 本地方法接口 ,执行方法。运行时数据区的构成线程私有:程序计数器(唯一一个没有OOM的区域)、虚拟机内存栈(也可以理解为线程栈)、本地方法
2021-07-13 19:15:21
72
原创 Java类的加载
Java类的加载类的加载过程加载 -> 验证 -> 准备 -> 解析 -> 初始化加载:根据类的全限定名称找到类的字节码文件,只有类在使用的时候才会加载。验证:验证字节码文件的正确性。准备:为静态变量分配内存,赋默认值。解析:将字符引用转换成直接引用。初始化:为静态变量赋值,执行静态代码块。类加载器引导类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如 rt.jar、charsets.jar等。扩展类加载器:负责加载支撑JVM运行的位
2021-07-12 23:17:17
64
原创 docker-compose搭建svn服务器
1、版本Centos7.5+elleflorio/svn-server(docker镜像,想要用其他的可以自己在docker hub里面自己搜索)2、前提条件已经安装docker和docker compose3、创建 docker-compose.yml 文件内容svn: image: elleflorio/svn-server container_na...
2020-02-04 22:40:25
1423
原创 centos7安装docker
centos7安装docker(步骤)1、安装gcc2、安装gcc-c++3、查看gcc版本4、安装需要软件包5、设置镜像仓库6、更新yum软件包索引7、安装DOCKER CE8、查看DOCKER版本9、启动DOCKER服务1、安装gccyum -y install gcc2、安装gcc-c++yum -y install gcc-c++3、查看gcc版本gcc -v4、安装需...
2020-01-06 09:57:56
81
原创 centos7安装docker和用docker安装mysql
centos7安装docker和用docker安装mysqlcentos7安装dockerdocker安装mysqlcentos7安装docker具体安装也可以参照docker官方文档yum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo htt...
2019-12-27 14:54:24
81
原创 Unexpected AOP exception; nested exception is java.lang.IllegalStateException:
Unexpected AOP exception; nested exception is java.lang.IllegalStateException: 解决原因解决办法原因spring-aop版本与导入的其他spring包版本冲突解决办法我的maven项目的spring-aop版本是5.1.9,其他的spring版本是5.2.1,将spring-aop的版本改成5.2.1,运行正常...
2019-11-28 11:34:45
10021
原创 Java模拟抽奖
需求String s1 = “1,2,3,4,5,6,7,8.9,10,11,12,13,14,15”;//代表全部参与抽奖的人员编号String s2 =”2,5,6”;//代表已经中奖的人员编号int number = 3;写一个函数,从s1中随机筛选出number个数字,且此数字不在s2中。返回一个字符串。代码public class Main { public static ...
2019-09-18 20:21:28
1447
1
原创 Java遍历D盘
Java遍历D盘打印文件路径和大小public class Main { public static void main(String args[]) { String filePath = "D:\\"; Main m1 = new Main(); File file = new File(filePath); m1.test(file); } private ...
2019-09-18 20:18:47
590
原创 linux启动tomcat找不到jdk的解决办法
原因:需要手动声明环境变量操作步骤在tomcat目录下的bin文件夹里面找setclasspath.sh,里面添加环境变量;先进入目录vim setclasspath.sh添加 export JAVA_HOME= jdk目录,保存并退出启动tomcat...
2019-09-08 18:59:59
1818
原创 linux下的java开发环境搭建
下载jdk创建jdk存放目录:mkdir /usr/local/jdk将jdk压缩包移动到此目录下解压jdk压缩包:tar zxvf jdk.tar.gz删除压缩包:rm -f jdk.tar.gz环境变量设置编辑/etc/profile文件:vi /etc/profile在unset i的前面输入:export JAVA_HOME= jdk路径export CLA...
2019-09-08 15:07:38
81
原创 Java实现堆排序
步骤:构建大根堆,父节点大于右孩子大于左孩子首尾交换然后排序代码void heap(int[] arr) { int n = arr.length; int t; // 将数组转变成堆 for (int i = n / 2 - 1; i >= 0; i--) { // 如果第i个节点有右孩子,那么n为 单数,n/2向下取整后,再反向计算,肯定是小于n的; ...
2019-09-05 16:20:55
61
原创 快速排序算法
快速排序算法和冒泡排序算法类似,都是基于交换排序的思想;具体步骤:设定一个分解值,通过该分界值将数组分成左右两个部分;大于该分界值的在右边,小于分界值的在左边,等于分界值的不变;左边和右边独立的排序;重复上述过程;实现思路选取分界值,选数组中间的那一个作为分界值;左右两个指针运行,当左边的指针内的数大于分界值停止,当右边的指针小于分界值停止,交换左右两指针的数据;指针继续运...
2019-08-31 10:01:49
168
原创 Java编程之孤岛问题
问题描述11000010010010000010求上面的孤岛的个数(0代表水,1代表陆地,当1上下左右全为0时,1成为孤岛,如果几个1连在一起,四周全是0,也是孤岛上面的数字的边界默认为0)解题思路创建一个二维数组,先遍历,从[0][0]开始;若为1,则将1改成2,然后执行 4 流程;若为0或2则继续遍历,继续 2 流程;如果旁边有1,则向旁边移动,直到碰到0时候停止;将所...
2019-08-30 21:45:50
1048
原创 Java编程输出符合要求的字符串
题目要求输入一个字符串,例如:123e;fafsf ,字符串不能为空,不能大于500;输入一个索引用“;”将字符串分成若干字符串,根据输入的索引输出分割后的字符串;若索引超出,则输出为空Java代码实现import java.util.Scanner;public class Main { public static void main(String args[]) { Main ...
2019-08-30 18:19:15
407
原创 Boolean占的大小
Boolean占 4个字节,在数组中占1个字节我们的思考的逻辑1 位(bit):Boolean只有false和true,对应的0和1,在内存中只需要一位。1 字节:计算机处理数据的最小单位是一字节实际规定4字节:根据《Java虚拟机规范》中描述,虽然定义了Boolean数据类型,但是对它的支持有限,所以在编译时候使用int数据类型来代替,所以占4 个字节;但是Boolean数组在编译...
2019-08-26 21:55:15
1306
原创 TCP的三次握手与四次挥手的理解
TCP的三次握手tcp的三次握手旨在建立连接:模拟一个向陌生人问路的场景第一次握手:你说:“你好,打扰一下。”(你在试探对方有没有听见你说话,想不想理你)第二次握手:陌生人说:“有事吗?”(对方听懂你说话了,并给出了回应,同时也在试探是不是你在问他)第三次握手:你说:“我想问路”(对方回话了,你也能听懂)然后双方的通信就建立起来了,可以交流了。了解握手前需要了解的ACK : TCP...
2019-08-21 11:08:02
120
原创 JavaIO总结
bit、byte、charbit:最小二进制单位,是计算机的操作部分,取0或者1byte:计算机操作数据的最小单位,由8bit组成char:用户可读写的最小单位,在Java里面由16bit组成流的种类字节流(InputStream、OutputStream)、字符流(Reader、Writer)BufferedWriter和BufferedReader属于处理流中的缓冲流,Buffe...
2019-08-20 23:01:46
68
原创 Java集合总结
几种常见的集合简介:继承collection接口的有Set和List集合:Set(无序不可重复)、List(有序可重复)Map是存储键值,键唯一,值不唯一常用遍历(1)Iterator:迭代输出,使用最多(2)foreach:JDK1.5后新增,可用于集合和数组。(3)for循环ArraryList和LinkListArraryList:根据索引的可变数组,允许保存所有元素,包括n...
2019-08-20 21:26:32
68
原创 “==”、equals和hashcode区别
“==”、equals()和hashcode()区别==成立的equals也必然成立,equals成立的hashcode也必然成立,反之则不一定。“==”和equals()实际在Object类中,equals()方法里面用的就是"==",之所以不一样是因为重写了equals(),用String举例,可以看String里面的代码 public boolean equals(Object...
2019-08-20 15:32:56
79
原创 Hibernate5使用
Hibernate5使用1.使用环境:JDK8,mysql8.0.16(此版本mysql的需要的hibernate.cfg.xml配置与之前版本有点区别);2.具体步骤:导包(数据驱动包和Hibernate开发所必须的jar包)---->建表(有表可以跳过)---->创建Hibernate核心配置文件 ----> 创建映射关系 ----> 创建执行类3.核心配置文件h...
2019-06-19 20:02:27
907
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人