3 柏油

尚未进行身份认证

不负冬日春晓 不负青春韶华

等级
TA的排名 6k+

由charset编码问题或者编码不一致等问题导致的中文乱码(通过Debug源码探索原因)

环境:POST方法、Content-Type:application/x-www-form-urlencoded;charset=utf-8(key=val&key2=val2形式)调用接口:commons-httpclient-3.1服务接口:springboot-1.4.2.release/spring-web-4.3.4.release场景:通常在对接第三方...

2019-09-24 22:32:39

通过分布式远程调用框架xxl-rpc的源码领会rpc实现思想

目前版本:1.4.2-SNAPSHOT官网概述:XXL-RPC是一个分布式服务框架,提供稳定高性能的RPC远程服务调用功能。拥有"高性能、分布式、注册中心、负载均衡、服务治理"等特性。现已开放源代码,开箱即用。一、rpc框架一般会提供的功能1、服务提供端(Provider)2、服务消费端(Invoker):通过生成代理对象,封装底层通信细节完成类似“本地方法”的调用。3、注...

2019-09-05 07:53:53

通过xxl-registry源码领会分布式注册中心实现思想

官网概述:XXL-REGISTRY是一个轻量级分布式服务注册中心,拥有"轻量级、秒级注册上线、多环境、跨语言、跨机房"等特性。现已开放源代码,开箱即用。基本思路:注册中心的基本的功能一般包括服务注册(registry)、服务发现(discovery)、服务摘除(remove)等;然后就涉及到服务宕机后能否及时摘除、如何高效的服务发现、注册中心数据备份等;这些任务由注册中心的服务端完成(ser...

2019-09-02 23:32:43

一台机器配置两个github账号、ERROR: Permission to user1/repo.git denied to user2问题

背景:网上关于一台机器配置两个github账号的博文已经很多了,所以本片文章不打算详细罗列配置信息;主要讲讲因粗心遇到的问题,帮助遇到相同问题的朋友快速定位并解决。具体配置网上找了链接以供参考:https://blog.csdn.net/formularoom/article/details/725881641、SSH通信方式:为避免每次通信需要输入用户名和密码的操作,使用ssh(非对...

2019-07-07 14:58:49

Java签名验证、request body数据多次读取(request body数据用以签名时注意问题)、Content-Type

问题背景:最近对接第三方接口,出现了签名问题;起初接触的签名一般将url参数、请求头中的参数用以签名,因此当遇到把body数据用以签名时走了一些弯路;起初想法是我这边将数据通过工具将对象转化为json字符串,对方通过框架将数据映射成实体对象,然后将实体对象转化为json,再取出url参数、请求头参数按相同的方法进行签名。这种方式问题很明显,1、当两方使用不同的json转化工具时,转化的字符...

2019-07-06 23:14:26

高并发流量限制(计数器、漏桶、令牌桶)demo

背景:通常在高并发访问的情况下,会通过限流的手段来控制流量问题,以保证服务器处于正常压力下,一般对超过的部分不做处理,即丢弃。限流的手段通常有计数器、漏桶、令牌桶。注意限流和限速(所有请求都会处理)的差别,视业务场景而定1、计数器:在一段时间间隔内(时间窗),处理请求的最大数量固定,超过部分不做处理2、漏桶:漏桶大小固定,处理速度固定,但请求进入速度不固定(在突发情况请求过多时,会丢弃...

2018-11-04 17:43:21

lambda表达式-高级集合类和收集器

lambda表达式提供了很多的集合类和收集器来简化编程,使之更加方便和美观,所以这里介绍一些常用的集合类和收集器来处理繁杂的代码。github的demo地址:  https://github.com/BradenLei/lambda1、方法引用:形如 User::getName,TreeSet::new等价于user.getName(),newTreeSet<>();...

2018-10-28 18:06:17

Spring切面编程-使用AspectJ在逻辑前后做日志处理

1、背景:AspectJ作为AOP一大应用已经广为人知了,具体的应用场景也很多,如:日志处理、执行目标方法前做逻辑判断、事物控制等等;其实质大都是抽取出各类、方法中重复的、与业务逻辑无关的代码,形成一个切面(Aspect,也就是一个类),在切面中定义切点(可以理解为将代码织入到那些我从方法中提取出重复代码的位置处,一个切点可能包含多个连接点)、连接点(也就是切点的一个具体)、通知等,这个一来就...

2018-10-21 17:19:50

反射及利用反射复制对象的demo

反射是java编程的灵魂,在用反射之前有几个类需要了解:Class,Method,Feild,Constructor,在demo中演示这些类中比较常用的方法,然后用反射实现copy对象的封装类来说明反射的微妙。1、常用方法:publicclassReflectDemo{/**Class*/@TestpublicvoidtestClass()...

2018-10-14 17:27:09

java8四大核心函数式接口及reduce方法

1、java8提供的函数式接口基本能满足我们的任务开发packagecom.dw;importorg.junit.Test;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;importjava.util.function.*;importjava.util.stream....

2018-10-07 09:03:54

生产者消费者模型(隐示锁-synchronized关键字)

描述:共享变量池大小为5,生产者从池中放入一个物品,消费者从池中拿去一个物品。一:定义共享资源:publicclassPublicResources{privateintcount=0;//max=5publicvoidreduce(){//消费者消费 synchronized(this){ w...

2018-06-29 23:00:06

线程间的协同(生成者/消费者模型)

线程间除了同步互斥使用共享代码块或者共享资源外,有时需要线程间的通信来控制共享信息。生产者/消费者模型就是很好的例子;提供一个资源池,生产者向里面生产资源、消费者负责消费;资源池满,生产者线程等待,消费者消费资源后调用特定方法唤醒生产者线程;反之,资源池为空,消费者线程等待,生产者向资源池生产资源后,调用特定方法唤醒消费者线程。这里实现使用java中显示锁 Lock锁定共享变量,生产者write...

2018-06-20 18:42:33

模拟HashSet底层实现

GitHub源码地址(https://github.com/BradenLei/MyHashSet)1、基本概念:1)HashSet和HashMap唯一的不同之处在于,HashMap以键值对作为一个条目存储在散列表中,而HashSet则以元素的形式存储在散列表中;HashSet相当于HashMap的简化版。2)MySet继承自java.lang.Iterable,实现了其方法,故MyHashSet...

2018-06-18 21:58:00

模拟HashMap底层实现

1、概念:1)散列:使用一个散列函数,将一个键映射到一个索引上。2)散列函数:将键映射到散列表中的索引上的函数称为散列函数。3)冲突:当两个键映射到散列表中的同一个索引上,冲突发生a:使用开发地址法解决处理冲突(线性探测、二次探测法、再哈希法)b:使用链地址法处理冲突:将具有同样的散列索引的条目都放在一个位置,每个位置使用一个桶来放置多个条目;通常使用LinkedList来实现一个桶。4)装填因子...

2018-06-18 09:15:58

模拟平衡二叉查找树底层实现(AVL)

1、基本概念及操作:1)平衡二叉查找树:在二叉查找树的基础上满足平衡因子为-1,0,1的树结构2)平衡因子:右子树的高度减去左子树的高度;-1表示左偏重,+1表示右偏重3)重新平衡数:从AVL树中插入或者删除一个元素后,如果树变得不平衡了,执行一次旋转操作来重新平衡该树,有四种方式:LL旋转、RR旋转、LR旋转、RL旋转以LL说明:两个L表示两次左偏重4)AVL树的设计:由于AVL树是二叉查找树...

2018-06-17 16:44:15

模拟二叉查找树底层实现

二叉查找树:当前结点的左子树所有结点值小于当前结点值,而右子树所有结点值都大于当前结点实现方法:search()、insert()、delete()、前中后序遍历等。其中delete过程稍稍复杂。接口:packagebinary;publicinterfaceTree<E>extendsIterable<E>{/**查找某个元素是否存在*/ pub...

2018-06-16 16:44:29

堆、队列、优先队列底层实现

1、通过ArrayList实现大根堆:堆:有大根堆和小根堆,对于大根堆来说,其左右子元素比根元素小1)添加操作:首先将它添加到堆的末尾,然后按以下方式建树:将最后一个结点作为当前结点while(当前结点大于它的父节点){将当前结点和它的父结点交换;现在当前结点往上进一个层次;}2)删除操作:删除之后将最后一个结点成为当前根结点,然后维护该数,其余操作和添加操作类似packageshixian;...

2018-06-15 23:55:00

模拟栈的底层实现(用数组线性表实现)

由于栈只允许在栈顶进行插入与删除操作,所以用数组线性表来实现栈比用链表来实现效率更高:接口:packageshixian;publicinterfaceMyStack<E>{/**返回栈的大小*/ publicintsize(); /**出栈操作*/ publicEpop(); /**进栈操作*/ publicvoidpush(Ee); ...

2018-06-11 13:46:19

模拟ArrayList、LinkedList底层实现

1、MyList接口:packageshixian;publicinterfaceMyList<E>extendsIterable<E>{/**添加一个新元素在list末尾*/ publicvoidadd(Ee); /**添加一个新元素在指定的索引处*/ publicvoidadd(intindex,Ee); /**clear...

2018-06-09 17:58:34

泛型-通配泛型、消除泛型

一:通配泛型有三类:<?>非受限通配、<?extendsT>受限通配、<?superT>下限通配案例一:packagefanxin;publicclassWildCardNeedDemo{ publicstaticvoidmain(String[]args){GenericStack<Integer&gt...

2018-05-27 08:36:44

查看更多

勋章 我的勋章
  • 勤写标兵Lv1
    勤写标兵Lv1
    授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。