- 博客(154)
- 收藏
- 关注
原创 微服务架构之API网关:Spring Cloud Gateway
API 网关是微服务架构重要组件之一,是服务唯一入口。API 网关封装内部系统架构,横向抽离通用功能,如:身份验证、监控、限流、熔断、负载均衡等。核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。反向代理 VS 网关在 web 1.0,2.0 时代,主要由web网站形式呈现。大多数都采用前置反向代理,主要作用是反向路由和负载均衡。典型的产品有 Nginx 和 HAproxy。一般采用静态配置方式,由运维团队配置。如今来到了 web 3.0 微.
2020-10-26 14:40:18 2210 1
原创 MyBatis 枚举的TypeHandler(非常优雅)
时间匆忙,简单记录一下导入mybatis-plus包配置文件mybatis-plus: # 支持统配符 * 或者 ; 分割 typeEnumsPackage: com.example.mp.entity.enu_m枚举类,在需要进行枚举处理的字段打上@EnumValue注解@AllArgsConstructor@Getter@ToStringpublic enum SEX { MAN(0,"男人"),WOMAN(1,"女人"); @Enu..
2020-08-15 17:07:51 1424 1
转载 spring @validated校验,分组校验,自定义校验
借助了spring的力量之后,原先臃肿的if -else没有了,代码瞬间变的简洁了起来。但是这样子也是有一些问题的,比如我们现在要在Controller中新增添一个修改user的接口,既然是修改接口,我们可以选择只修改user的name或者只修改user的enname。那么就会出现一个问题,新增接口的校验和修改接口的校验冲突了。新增接口要求:name和enname都不能为空,修改接口要求:name和enname可以为空,这个时候用一个user对象就有点尴尬。@validated分组校验@D...
2020-06-04 09:06:19 1743
转载 Spring Boot 2.0.X 多数据源及连接池配置
一、单数据源我们在使用Spring Boot配置单数据源的时候很简单,只要在配置文件中加上基本的数据库连接信息和连接池配置信息就可以,通常情况下不需要指定driver-class-name,Spring Boot可以从大多数数据库的url中推断出驱动类型# 连接配置spring.datasource.url=jdbc:mysql://localhost:part/test?charac...
2020-04-02 11:10:59 871
转载 @Validated和@Valid的区别?校验级联属性(内部类)
每篇一句NBA里有两大笑话:一是科比没天赋,二是詹姆斯没技术相关阅读【小家Java】深入了解数据校验:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Spring】让Controller支持对平铺参数执行数据校验(默认Spring MVC使用@Valid只能对JavaBean进...
2020-03-27 17:20:44 1394
转载 Spring 校验器(Validator)
Spring校验器,参数校验从此简单。image.png应用在执行业务逻辑之前,必须通过校验保证接受到的输入数据是合法正确的,但很多时候同样的校验出现了多次,在不同的层,不同的方法上,导致代码冗余,浪费时间,违反DRY原则。每一个控制器都要校验 过多的校验参数会导致代码太长 代码的复用率太差,同样的代码如果出现多次,在业务越来越复杂的情况下,维护成本呈指数上升。可以考虑...
2020-03-27 16:15:27 857
原创 Jackson多态类型数据绑定
Jackson数据绑定可以很方便的将java的对象类型和json数据格式之间进行转换。对于有多个子类型的多态集成结构的对象,Jackson在序列化的时候加入一些类型信息,可以在反序列化的时候准确的还原某个类型的子类。想要把JSON数据准确的反序列化为正确的子类型,简单的方法就是在数据中存储数据的类型。但是Jackson序列化时默认不会将对象的类型信息保存到Json数据中。有两种方式开始使J...
2020-03-27 13:15:42 1081
原创 jackson 枚举 序列化和反序列
网上这类资料很少,自己总结一下: @Data @AllArgsConstructor public static enum Event { FORGOT_PASSWORD("forgot password",200), GET_PASSWORD("get password",2001); private final...
2020-03-19 16:36:09 1996
转载 SpringBoot -- 03 -- 启动加载类ApplicationRunner的使用
在使用 SpringBoot 的过程中,我们有时候会需要在容器启动后做一些初始化的工作,这时候 ApplicationRunner 就派上用场了一、示例我们需要定义一个类来实现 ApplicationRunner 接口,并覆盖其 run() 方法,同时将其注册为 bean 对象application.ymlserver: port: 999912MyApplicationR...
2020-03-18 09:10:00 154
转载 VM Centos共享文件夹
前提条件:Centos 7VMware 12Win 10在百度的过程中,搜索了很多资料,总算共享文件夹成功步骤如下:1、centos 7虚拟机主机共享文件和Tools工具安装https://blog.csdn.net/lly374685868/article/details/791079212、设置共享文件夹https://blog.csdn.net/jasonh...
2020-02-22 20:45:33 205
转载 Java性能分析神器-JProfiler详解(转)
前段时间在给公司项目做性能分析,从简单的分析Log(GC log, postgrep log,hibernatestatitistic),到通过AOP搜集软件运行数据,再到PET测试,感觉时间花了不少,性能也有一定的提升,但总感觉像是工作在原始时代,无法简单顺畅,又无比清晰的获得想要的结果。遂花费了一定的时间,从新梳理学习了一下之前用过的关于jvm调优和内存分析的各种工具,包括JDK自带的jp...
2020-02-15 20:00:45 1227
转载 一致性哈希(hash)算法
一致性哈希(hash)算法一、算法背景一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。二、应用场景现在一致性hash算法在分布式系统中也得到了广泛应用,分布式...
2020-01-17 10:28:31 200
原创 一次锁超时解决方法 (Lock wait timeout exceeded; try restarting transaction)
锁超时的原因:某些SQL语句运行时间过长,长时间占用锁,导致新提交的SQL不能获取锁。 某些事务占用时间过长,没提交或者回滚,导致锁未释放。如果是第一种情况,可以开启SQL的慢查询日志排查哪些SQL执行效率过低,使用Explain查看SQL是否走索引等,这种情况比较好定位。我这次碰到的是第二种问题,不知道哪位同事写了一个很大的事务,阻塞了很久导致锁占用时间太长。首先我找到相关的事务,...
2020-01-10 10:55:17 3632 1
转载 Redis分布式锁
一、介绍这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁。会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁。本篇文章会将分布式锁的实现分为两部分,一个是单机环境,另一个是集群环境下的Redis锁实现。在介绍分布式锁的实现之前,先来了解下分布式锁的一些信息。二、分布式锁2.1 什么是分布式锁?分布式锁是控制分布式系统或不同系统之间共同访问共享资源...
2019-12-20 15:07:11 156
转载 高并发编程-ExecutorCompletionService深入解析
要点解说假设现在有一大批需要进行计算的任务,为了提高整批任务的执行效率,你可能会使用线程池,向线程池中不断submit异步计算任务,同时你需要保留与每个任务关联的Future,最后遍历这些Future,通过调用Future接口实现类的get方法获取整批计算任务的各个结果。虽然使用了线程池提高了整体的执行效率,但遍历这些Future,调用Future接口实现类的get方法是阻塞的,也就是和当...
2019-11-26 17:08:04 614
原创 Spring 解决循环引用
实际上Spring是允许循环引用的存在的。但是如果2个循环引用的对象 都是代理对象,就会出错。比如2个对象都有@Async 或者@Transcationl注解,那么他们都会被代理增强,相互引用则会跑循环引用异常:org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean ...
2019-11-08 15:22:59 595
转载 dockerfile详解
什么是dockerfile?Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。例:docker build -f /p...
2019-10-31 09:19:51 105
转载 索引失效的大坑 -- 子查询导致索引失效
遇到大坑版本3SELECT *FROM `orders`WHERE `id` IN (SELECT max(id) FROM `orders` WHERE `user_id` = 1 GROUP BY product_id);楼上这条SQL终于解决了版本兼容问题,我将SQL替换以后,写上单元测试集,对新旧两个SQL结果比对确认没问题之后准备上线.上线前扔到从库试查一下,发现sq...
2019-10-22 11:42:22 3867
原创 MySQL优化 EXPLAIN显示using filesort
如图这样一条SQL,索引是联合索引(neIdentity, parameterName, instanceNum),但是为什么会走using filesort。后来经过分析才得知,原来在多列索引在建立的时候是以B-树结构建立的,因此建立索引的时候是先建立neIdentity的按顺序排的索引,在相同neIdentity的情况下建立parameterName按 顺序排的索引,最后在par...
2019-10-21 18:22:25 303
转载 Mysql优化 EXPLAIN
explainexplain模拟优化器执行SQL语句,在5.6以及以后的版本中,除过select,其他比如insert,update和delete均可以使用explain查看执行计划,从而知道mysql是如何处理sql语句,分析查询语句或者表结构的性能瓶颈。作用1、表的读取顺序2、数据读取操作的操作类型3、哪些索引可以使用4、哪些索引被实际使用5、表之间的引用6、每张表有多...
2019-10-21 17:07:32 106
转载 ApplicationListener的使用之一 Spring容器初始化完成后调用
最近在发现了一种更好的方法,来补充一下。通过实现ApplicationContextAware的setApplicationContext方法,可以更加有针对地在某个类中,添加Spring容器初始化后执行的方法。 @Override public void setApplicationContext(ApplicationContext ac) th...
2019-10-12 09:39:19 1253
原创 单例模式几种比较常见的写法
1.饿汉式这个就不用说了,直接类加载的时候实例化static ,这种方法缺点很明显,没用到该实例就去实例化,占用内存空间。2.饿汉式2.1 双重检测模式/** * @Description: * @Author: lizijian * @Date: 2019/10/11 09:22 */public final class SingleInstanc...
2019-10-11 10:36:22 90
原创 自定义注解——AOP中 将注解中的el表达式 自动替换为同名方法参数值
@AemsRedisCache(key = "'spatialId_'+#spatialId+'_neId_+'#neId'") public SfSpatial findBySpatialId(String spatialId,String neId) throws Exception{ String sql = SpatialDB.Find_Spatial_By_Spa...
2019-09-25 17:58:17 2057
原创 我的git配置文件
所在目录 global(~/.gitconfig),用户级别我的配置缩写,以备新环境需要[user] name = lizijian email = lizijian@casachina.com.cn[alias] sts = status cb = checkout -b c = checkout...
2019-09-12 17:51:24 124
转载 java8处理日期和时间
自省:java8用了好久了,虽然一直知道有新的时间API,但是一直用java.util.Date用习惯了,也没有特意的去了解java8的时间类java.time,虽然效果同样达到了,但不是当前最适当的方式,以后要吸取教训。在java8中,java.time包下主要包含下面几个主要的类:Instant:时间戳,相当于java.util的DateLocalDate:只包含日期,比如:201...
2019-09-06 17:42:33 523
原创 Spring事务和Async注解失效(同一个类中调用)
在一个类内部有2个方法a和b,a方法内调用带有事务注解的b方法,B方法的事务是不会生效的。例如解决方法1:配置@EnableAspectJAutoProxy(exposeProxy = true) 必须spring4.3.1以上版本才有再用AopContext.currentProxy()获取当前代理对象去调用事务方法解决方法2:从Spring容器中拿到本类对象,去调用例如...
2019-08-29 10:13:59 1441
转载 Spring AOP 中 @Aspect 的高级用法
1 切点复合运算支持在切点定义中加入以下运算符进行复合运算:运算符 说明 && 与运算。 ! 非运算。 \|\| 或运算。 2 切点命名一般情况下,切点是直接声明在需要增强方法处,这种切点的声明方式称为匿名切点,匿名切点只能在声明处被使用 。 如果希望在其它地方可以重用这个切点,我们可以通过 @Pointcut 注解及切面类方法来...
2019-08-27 17:46:20 360
原创 Spring AOP出现NullPointerException
今天在开发中发现了一个奇怪的问题,使用AOP切入一个方法后,该方法出现了空指针异常。我们知道AOP是通过动态代理实现了,因为出现问题的这个类没有实现接口,使用的是cglib代理,而代码中直接获取该类对象的属性,debug发现是空的。可以发现代理对象的属性全是空的,经过一顿操作发现 真实的target在这样就比较显然了,cglib代理是通过继承的实现,是不会继承类属性的,所以...
2019-08-20 11:50:42 1602
转载 nginx快速入门之配置篇
nginx快速入门之配置篇nginx.conf 配置结构... #全局块events { #events块...}http #http块{ ... #http全局块 server #server块 { ... #server全局块 location [PATTERN] #location块 { ...
2019-08-03 18:44:55 221
转载 谈谈Java中的ThreadLocal
ThreadLocal介绍&跳出误区看看源码线程独享变量?ThreadLocal介绍&跳出误区 ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的可见范围限制在同一个线程内。跳出误区 需要重点强调的的是,不要拿ThreadLocal和s...
2019-07-31 11:39:17 76
转载 Java并发编程:Callable、Future和FutureTask
转自 http://www.cnblogs.com/dolphin0520/p/3949310.htmlJava并发编程:Callable、Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就...
2019-07-26 11:13:09 83
转载 BlockingQueue深入解析-BlockingQueue看这一篇就够了
BlockingQueue深入解析-BlockingQueue看这一篇就够了本篇将详细介绍BlockingQueue,以下是涉及的主要内容:BlockingQueue的核心方法 阻塞队列的成员的概要介绍 详细介绍DelayQueue、ArrayBlockingQueue、LinkedBlockingQueue的原理 线程池与BlockingQueue1、初识阻塞队列 在新...
2019-07-25 20:06:05 141
转载 Java中线程的状态分为6种
Java中线程的状态分为6种。1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态...
2019-07-24 18:02:52 153
转载 Java 反射内部类
Java 反射内部类2018.05.09 23:39字数 248阅读 36评论 0喜欢 0问:如下代码段,已获取外部类实例情况下,如何反射实例化内部类及调用内部类方法?class OuterClass { public void func(){ System.out.println("Outer class."); } class I...
2019-07-22 16:11:37 1097
转载 Java8特性详解 lambda表达式 Stream
转自https://www.cnblogs.com/aoeiuv/p/5911692.htmlJava8特性详解 lambda表达式 Stream1.lambda表达式Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正在将自己变的更高(Sha)级(Gua),更人...
2019-05-22 19:27:18 93
转载 Lambda表达式
一、Lambda表达式是什么?Lambda表达式有两个特点:一是匿名函数,二是可传递。匿名函数的应用场景是:通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用Lambda表达式。lambda表达式所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新定义一个函数了,使用lambda就有点过于执拗了。可传递使用场景是:就是将Lambda表达式传递给其他的函数,它当...
2019-05-22 19:26:12 178
原创 JAVA枚举类Enum 使用示例
public enum NeAdminRventLogTypeEnum { ONE(1,"one"), TWO(2,"two"), THREE(3,"three"), FOUR(4,"four") , ; private int code; private String text; private NeAdmi...
2019-04-29 14:41:36 506
转载 mysql insert锁机制(insert死锁)
一、前言上周遇到一个因insert而引发的死锁问题,其成因比较令人费解。于是想要了解一下insert加锁机制,但是发现网上介绍的文章比较少且零散,挖掘过程比较忙乱。本以为只需要系统学习一个较完全的逻辑,但是实际牵扯很多innodb锁相关知识及加锁方式。我好像并没有那么大的能耐,把各种场景的加锁过程一一列举并加之分析;亦没有太多的精力验证网上的言论的准确性。只好根据现在了解的内容,参考...
2019-04-16 09:51:57 2320
转载 MySQL- InnoDB锁机制
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题。下面我们先介绍一点背景知识,然后详细讨论InnoDB的锁问题。背景知识事务(Transaction)及其ACID属性事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。...
2019-04-15 20:36:31 72
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人