java
文章平均质量分 67
装睡的小5郎
爱生活,爱编程!
展开
-
注册中心ZK、nameServer、eureka、Nacos介绍与对比
微服务架构是存在着很多跨服务调用,每个服务都存在着多个节点,如果有多个提供者和消费者,当提供者增加/减少或者消费者增加/减少,双方都需要感知发现。所以诞生了注册中心这个中间件。市面上有很多注册中心,如 Zookeeper、NameServer、Eureka、Nacos,下面我来讲一下它们的特点、应用和区别。原创 2023-11-01 17:34:34 · 1111 阅读 · 0 评论 -
从位运算理解位图,位掩码
位图是一种较难理解的数据结构,想了解位图,我需要先温习一下基础,复习下一些二进制的知识。原创 2022-10-26 19:57:36 · 572 阅读 · 0 评论 -
ThreadLocal原理与实战
threadLocal实战,原理,踩坑合集原创 2022-06-08 17:06:07 · 263 阅读 · 0 评论 -
用Java给女友自动提交工作内容的自动化脚本
女朋友每天早上都需要登录某工作网站提交一项内容,其实在程序员看来,这些都是可以用代码自动化解决的,于是我开始加班加点搞了起来。整理需求首先我们需要整理一下需求,首先她需要早上登录某网站,然后进入某一目录,点击提交。这就是整理的需求技术选型&& 功能设计首先需要挑选框架,我这边用的是springboot,因为这个搭建和部署都比较方便然后发起登录请求网站获得cookie,然后再发起提交请求。我这边用的是httpclient的工具来做的,因为这个我比较熟悉其次,需要用定时任务框架来每天原创 2022-02-06 13:21:53 · 413 阅读 · 0 评论 -
单元测试--Mockito+JUnit
最近领导开始要求写代码需要写单元测试了。于是花了点时间研究下单元测试。一、目的单元测试适合一些项目复杂,启动一次项目要花很大成本的项目,这样我们可以通过单元测试去很快的测试它,而不需要启动项目来调试。二、测试范围单元测试最适合测试一些util方法,以及一些判断逻辑。如果碰到一些比较难写单测的方法,可能需要我们把方法进一步拆解后再进行测试。三、怎么写单元测试方法里每个if逻辑的正反两面都可以测试,以及一些边界值。同一个测试方法,可以通过传入参数的不同,测试不同的逻辑。最后通过assert或者Ver原创 2021-12-21 00:00:26 · 673 阅读 · 0 评论 -
捞取大量数据慢查询优化
场景双11期间这家客户积压了5w笔订单没有发货,所以客户反映每次计算都很慢,需要几十秒的时间。波次计算的代码需要把系统中审核的订单捞出来后进行计算分组划分到不同的批次中。排查过程首先我们通过链路和althas排查,发现查询子订单的sql需要in 5w个id。导致这个sql异常的慢,需要17s。方案于是我们商量了方案,首先这个sql就是一个简单的单表查询,in的字段也加了索引,所以不需要额外加索引,主要问题还是in的数量太多,查询很慢。采取多线程分批并行查sql这个方案,2000一批。查完后再聚合数原创 2021-11-07 16:56:59 · 300 阅读 · 2 评论 -
公司open api对接遇到的问题解决
之前在写开放平台的接口的时候,碰到了一些问题,记录一下api接口速度优化由于工期很赶,所以还没来得及自己测试,接口匆匆忙忙上线,当客户在用时,发现查询接口使用特别慢。然后分析原因,发现有慢sql引起的。首先,接口调用的是我们系统的一个现成接口,主表的数据量很大,又冗余了一些不需要的关联表,于是我决定用自己的sql来执行,其次我们接口给出的时间参数发现没有加索引,导致全表扫描。所以加了索引后接口从5s降低到1s,其次,我使用althas发现接口的时间一半多的时间都在请求count,而调用方只需要第原创 2021-10-31 12:11:21 · 740 阅读 · 0 评论 -
通过数据库唯一索引实现分布式锁
伪代码// 需要加事务@Transactional@Overridepublic <T> T lock(XxxLock lock, ILockCallback<T> callback) { // 数据库加锁 lock(lock); // 加锁逻辑 T result = callback.callback(); //释放锁 try { lockDao.batchDelete(locks); } catch原创 2021-05-27 11:06:14 · 709 阅读 · 0 评论 -
如何设计一个安全的对外开放接口
前言最近有个项目需要对外提供一个接口,提供公网域名进行访问,而且接口和交易订单有关,所以安全性很重要;这里整理了一下常用的一些安全措施以及具体如何去实现。安全措施个人觉得安全措施大体来看主要在两个方面,一方面就是如何保证数据在传输过程中的安全性,另一个方面是数据已经到达服务器端,服务器端如何识别数据,如何不被攻击;下面具体看看都有哪些安全措施。1.数据加密我们知道数据在传输过程中是很容易被抓包的,如果直接传输比如通过http协议,那么用户传输的数据可以被任何人获取;所以必须对数据加密,常见的做法对转载 2021-01-15 15:50:20 · 1669 阅读 · 1 评论 -
匿名内部类使用
在我们开发中,匿名内部类用的还是比较多的,笔者有点忘了一些细节,所以今天带大家复习一下匿名内部类匿名内部类既没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口场景一: 不使用匿名内部类/** * 场景一:不使用匿名内部类 * @Auther: zntzhang * @Date: 2020/8/4 12:47 * @Description: */public class Demo1 {原创 2020-08-04 16:48:41 · 316 阅读 · 0 评论 -
JVM相关知识点总结
1. 内存结构每个线程都有:程序计数器:记录了上下文切换的位置虚拟机栈:由栈帧组成,入栈出栈本地方法栈:Native方法每个线程共享:堆:对象方法区(jdk8后改名元空间):类信息、常量、静态变量2. 对象创建的过程new 一个对象经历了哪些步骤?类加载检查:使用双亲委派模式,从子类往父类询问是否已经加载到内存?如果都没有加载过。那么再从父类到子类依次尝试加载,把类加载到内存分配内存:从堆中划一片区域。根据堆内存是否碎片化,划分成两种方法a. 指针碰撞:堆原创 2020-08-03 17:13:35 · 200 阅读 · 0 评论 -
SpringBoot之Starter
SpringBoot之所以流行,是因为Spring Starter模式的提出。Spring Starter的出现,可以让模块开发更加独立化,相互间依赖更加松散以及可以更加方便地集成。什么是Starter?SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置,发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对原创 2020-07-27 09:57:14 · 291 阅读 · 0 评论 -
总结自己常用的JDK8写法(stream,function,optional)
1. 判空特别要注意的是list集合,我们sql查询返回的list或者stream处理完的list都不可能是null,所以不需要判断是否为null遍历列表处理Optional.ofNullable(list) .orElseGet(Lists.newArrayList()) .forEach(...);获取对象属性String value = Optional.ofNullable(data) .map(da原创 2020-07-27 09:56:44 · 946 阅读 · 0 评论 -
高可用方案和一致性hash
其实大部分中间件都逃不过这两种模式中心化模式这种模式的特点是有一Master多slave,一般采用读写分离的方式,只从master中写,然后同步给slave(主从同步)。读是通过负载均衡从所有的slave中读。一般能保证CP,既强一致性缺点:master挂了就很烦常见场景:redis主从、哨兵,mysql,zk去中心化模式既所有机子都是通过负载均衡来承担读写。一台机子写入后同步给其他机子(P2P同步)。这样的好处是可拓展性强,如果机子内存不足,就再买一台就ok了。缺点:数据的一致性一原创 2020-07-27 09:56:16 · 526 阅读 · 0 评论 -
SPI机制应用
为什么要使用SPI?我的理解它其实是一种设计模式的体现。比如一个好的框架,我作为框架的使用者,在添加一个新功能时,不需要去修改框架的源码,在自己的工程中添加代码即可。系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。SPI机制其实就是我们的框架会通过ClassLo原创 2020-07-27 09:55:42 · 314 阅读 · 0 评论 -
拦截器、过滤器、AOP的区别
拦截器spring中独有的在SpringMVC的配置文件中配置可对请求和响应处理<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.scorpios.atcrowdfunding.web.LoginInterceptor"></bean> </mvc:interceptor原创 2020-07-22 17:41:58 · 227 阅读 · 0 评论 -
简单介绍AQS、ReetrantLock、CountDownLatch、CyclicBarrier、Semaphore
AQS,既AbstractQueuedSynchronizer, 是JUC包实现同步的基础工具,是一个抽象类。在AQS中,定义了一个volatile int state变量作为共享资源,并且内置自旋锁实现的同步队列,封装入队和出队的操作,提供独占、共享、中断等特性的方法。如果线程获取资源失败,则进入同步FIFO(先进先出)队列中等待(入队);如果成功获取资源就执行临界区代码。执行完释放资源时,通知队列中的等待线程来获取资源,然后出队。AQS的子类可以定义不停的资源实现不同性质的方法Reetran原创 2020-07-04 15:29:16 · 259 阅读 · 0 评论 -
项目集成swagger启动报错 Error creating bean with name webMvcRequestHandlerProvider
最近项目集成了swagger以后启动一直报错org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webMvcRequestHandlerProvider' defined in URL [jar:file:/Users/jasonfeng/.m2/repo...原创 2020-04-09 22:34:11 · 18271 阅读 · 2 评论 -
Java并发编程(原子性、可见性、有序性、synchronized、CAS、volatile、ThreadLocal)笔记
自己网上总结了一些多线程并发的一些文章,如有错误请指教!多线程的三大特性一、原子性原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。线程切换带来的原子性问题Java中的一条语句,在翻译为机器码之后,可能对应的是多个指令。比如:**i++**这个操作至少需要3条指令;把 i 的值从内存=加载到...原创 2019-07-14 18:02:13 · 447 阅读 · 0 评论 -
从零开始搭建SSM
下面是我搭建框架时参考的文章以及自己的觉得重要的笔记,如果大家只是搭建框架,前三步就足够了.原创 2017-12-16 10:23:52 · 434 阅读 · 1 评论 -
git使用笔记
1.git整合idea2.在IDEA中实战Git原创 2018-02-07 13:44:48 · 194 阅读 · 0 评论 -
Integer比较 ==与equals
class Test { public static void main(String[] args) { Integer i1 = new Integer(5); Integer i2 = new Integer(5); System.out.println(i1 == i2); //false (情况,即new的id,而不是=的i...原创 2018-04-20 11:30:18 · 870 阅读 · 5 评论 -
spring中service调用service如何保持事务一致
在使用SPRING的事务控制时,事务一般都是加在SERVICE层的,这个时候如果一个SERVICE调用另一个SERVICE时如何保持事务一致?比如第二个SERVICE抛出了异常,第一个SERVICE回滚。这就要先介绍spring的7种类型的事务传播行为 其中我们要用到第一种,&lt;tx:method name="add*" propagation="REQUIRED"/&gt; ...原创 2018-05-31 20:21:51 · 5256 阅读 · 0 评论 -
nginx的配置、虚拟主机、负载均衡和反向代理
nginx在前面,我写过好几篇,相似的介绍它在各个平台上的安装配置以及和php-fpm的连接等。今天,这一篇,着重讲解它的配置,其中包括它比较擅长的负载均衡和反向代理,还有虚拟主机功能。nginx启动和关闭按照惯例,先说下各个平台的配置情况:centos平台,源码安装的:/usr/local/nginx/nginx # 启动/usr/local/nginx/nginx -...转载 2018-08-20 15:09:24 · 220 阅读 · 0 评论 -
Java常量池理解与总结
原文地址一. 相关概念1. 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。2. Class文件中的常量池在Class文件结构中,最头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版...转载 2018-10-11 17:48:59 · 213 阅读 · 0 评论 -
git中reset操作的三种模式(总结)
首先,git 本地提交,会经过三个步骤。这三个步骤的流程不多做解释工作区 --> 暂存区 -->版本库然后git reset –soft 可以把版本库上的提交回退到暂存区,修改记录保留git reset –mixed 可以把版本库上的提交回退到工作区,修改记录保留git reset –hard 可以把版本库上的提交彻底回退,修改的记录全部revert。...原创 2018-09-21 17:14:56 · 2885 阅读 · 0 评论 -
java基本数据类型传递与引用传递区别详解
原文地址 https://blog.csdn.net/javazejian/article/details/51192130java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题,首先我们必须认识到这个问题一般是相对函数而言的,也就是java中的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法(或函数)的两个专业术语:按值调用(call by...转载 2018-10-13 22:17:46 · 150 阅读 · 0 评论 -
JSESSIONID的简单说明
1)第一次访问服务器的时候,会在响应头里面看到Set-Cookie信息(只有在首次访问服务器的时候才会在响应头中出现该信息)上面的图 JSESSIONID=ghco9xdnaco31gmafukxchph;Path=/acr,浏览器会根据响应头的set-cookie信息设置浏览器的cookie并保存之注意此cookie由于没有设置cookie有效日期,所以在关闭浏览器的情况下会丢失掉这个c...转载 2018-12-22 21:14:08 · 752 阅读 · 0 评论 -
Maven仓库snapshot快照版本与release正式版本的区别
在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次。我们知道,maven的依赖管理是基于版本管理的,对于发布状态的artifact,如果版本号相同,即使我们内部的镜像服务器上的组件比本地新,maven也不会主动下载的。如果我们在开发阶段都是基于正式发布版本来做依赖管理,那么遇到这个问题,就需要升级组...转载 2019-01-22 17:48:58 · 2316 阅读 · 0 评论 -
单点登录(SSO)看这一篇就够了
摘要: 背景 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于运营人员来说,很不方便。背景在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。...转载 2019-05-24 16:52:58 · 395 阅读 · 0 评论 -
同一个类的不同方法,A方法没有@Transactional,B方法有@Transactional,A调用B方法,事务不起作用
问题:同一个类的不同方法,A方法没有@Transactional,B方法有@Transactional,A调用B方法,事务不起作用原理解析:spring 在扫描bean的时候会扫描方法上是否包含@Transactional注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类,proxy),代理类是继承原来那个bean的。此时,当这个有注解的方法被调用的时候,实际上是由代...原创 2019-05-21 16:09:36 · 10491 阅读 · 3 评论 -
PageHelper中遇到的ThreadLocal小坑
ThreadLocal笔记最近写代码刚好碰到ThreadLocal的小坑,顺便学习了一波ThreadLocal,拿出来分享一下ThreadLocal什么时候会出现线程不安全的情况呢?我总结了两种情况1.记录在 ThreadLocal 中的是一个线程共享的外部对象https://www.cnblogs.com/qilong853/p/5982878.html这边文章讲的很好,我就不复制黏...原创 2019-06-27 22:43:11 · 874 阅读 · 0 评论 -
Spring AOP控制事务
一. spring事务管理的两种方式 编程式事务自己写事务处理的类,然后调用(较少使用)声明式事务2.1 使用基于注解的AOP事务管理 @Transactional注解: @Transactional注解的属性: - propagation:指定事务定义中使用的传播 - isolation:设定事务的隔离级别 - timeout:指定事务的超市(秒)原创 2017-12-23 09:25:11 · 1687 阅读 · 0 评论