SpringBoot笔记 ( 二 ):自定义配置

SpringBoot 笔记 ( 二 ):自定义配置

1. 配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的:

  • application.properties
  • application.yml

   修改SpringBoot自动配置的默认值,因为在所有的自动配置类中他们都会去读取我们的配置文件,如果说有配置这些项目就按照我们配置的,没有则使用自动配置。

Read More

Shiro安全框架:认证

Shiro 安全框架

1. 认证

1. 采用简单的对象登陆认证(SimpleAccountRealm)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class AuthenticationTest {
// 创建一个简单的认证 realm 也就是认证信息存放在对象中的
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();

@Before
public void addUser(){
simpleAccountRealm.addAccount("lwen", "1234");
}
@Test
public void authentication(){
// 创建一个 securityManager 环境
SecurityManager securityManager = new DefaultSecurityManager(simpleAccountRealm);
// 设置环境
SecurityUtils.setSecurityManager(securityManager);
// 获取认证主体
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("lwen", "1234");
subject.login(token);
System.out.println(subject.isAuthenticated());

}
}

Read More

NioEventLoopGroup 源码分析

NioEventLoopGroup 源码分析

1. 在阅读源码时做了一定的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限。为了方便 IDE 查看、跟踪、调试 代码,所以在 github 上提供 netty 的源码、详细的注释及测试用例。欢迎大家 star、fork !

2. 由于个人水平有限,对源码的分析理解可能存在偏差或不透彻的地方还请大家在评论区指出,谢谢!

   从今天开始,就准备进军 ne tty 了,主要的想法是看看 netty4 中一些比较重要的实现,也就是能经常出现在我们面前的东西。主要是: 线程池、通道、管道、编解码器、以及常用的工具类。

   然后现在看源码应该不会像之前的 jdk 那么细致了,主要是看了一个类以后就发现 netty 对代码封装太强了,基本一个功能可能封装了七八个类去实现,很多的抽象类但是这些抽象类中的功能还非常的多。所以说主要看这个流程,以及里面写的比较好的代码或者比较新的思想会仔细的去看看。具体的子字段,每个方法不可能做到那么细致。

Read More

Netty 入门

一 .长连接与短连接:

1.长连接:Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收。长连接在 netty 中是默认开启的,也就是我们创建了一个 Server 以后监听端口,我们的客户端去连接发现只要我们的客户端不主动的断开连接他们之间的连接是一直保持有效的。
2.短连接:Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server。但是在 netty 中默认采用了长连接,我们如何使用短连接呢?其实很简单,在我们的 Server 端需要对客户端进行回写数据的时候我们只需要在回写的后面加上一个监听事件,就是当写完毕,我们就关闭此连接。

1
ctx.channel().writeAndFlush("Hi Client I'm Server !&&").addListener(ChannelFutureListener.CLOSE);

二 .什么时候需要考虑粘包问题?

1:如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题,因为只有一种包结构,类似于http协议。

2:如果发送数据无结构,如文件传输,这样发送方只管发送,接收方只管接收存储就ok,也不用考虑粘包
3:如果双方建立连接,需要在连接后一段时间内发送不同结构数据,则需要考虑粘包问题。

三 .粘包出现原因

TCP 是一个字节流的的传输,也就是在流中传输无固定结构的数据包。但是UDP不会出现粘包,因为它有消息边界。
1 发送端需要等缓冲区满才发送出去,造成粘包
2 接收方不及时接收缓冲区的包,造成多个包接收

具体的在 TCP 中出现这种情况的原因:

  1. 由Nagle算法造成的发送端的粘包:Nagle算法是一种改善网络传输效率的算法.简单的说,当我们提交一段数据给TCP发送时,TCP并不立刻发送此段数据,而是等待一小段时间,看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去.这是对Nagle算法一个简单的解释,详细的请看相关书籍.

  2. 接收端接收不及时造成的接收端粘包:TCP会把接收到的数据存在自己的缓冲区中,然后通知应用层取数据.当应用层由于某些原因不能及时的把TCP的数据取出来,就会造成TCP缓冲区中存放了几段数据.

    四 .解决办法

    为了避免粘包现象,可采取以下几种措施:

  3. 一是对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;

  4. 二是对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;

  5. 三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。

   以上提到的三种措施,都有其不足之处。第一种编程设置方法虽然可以避免发送方引起的粘包,但它关闭了优化算法,降低了网络发送效率,影响应用程序的性能,一般不建议使用。第二种方法只能减少出现粘包的可能性,但并不能完全避免粘包,当发送频率较高时,或由于网络突发可能使某个时间段数据包到达接收方较快,接收方还是有可能来不及接收,从而导致粘包。第三种方法虽然避免了粘包,但应用程序的效率较低,对实时应用的场合不适合。

   最初遇到”粘包”的问题时,我是通过在两次send之间调用sleep来休眠一小段时间来解决.这个解决方法的缺点是显而易见的,使传输效率大大降低,而且也并不可靠.后来就是通过应答的方式来解决,尽管在大多数时候是可行的,但是不能解决象B的那种情况,而且采用应答方式增加了通讯量,加重了网络负荷. 再后来就是对数据包进行封包和拆包的操作.

​ 封包:封包就是给一段数据加上包头,这样一来数据包就分为包头和包体两部分内容了(以后讲过滤非法包时封包会加入”包尾”内容).包头其实上是个大小固定的结构体,其中有个结构体成员变量表示包体的长度,这是个很重要的变量,其他的结构体成员可根据需要自己定义.根据包头长度固定以及包头中含有包体长度的变量就能正确的拆分出一个完整的数据包.

五 .在 netty 中解决粘包的方式

  1. 采用了分隔符,类似于链路层的那种使用一个特殊的标记来分割数据,这里主要采用了一个工具类 DelimiterBasedFrameDecoder(arg0,agr1) 其中第一个参数指的是这个分隔符的可占用的空间大小,只能比他大不能小于。第二个参数就是具体的分隔符了,但是不能传递一个字符串而是一个 ByteBuf 对象,也就是我们需要用工具转一下 Unpooled.copiedBuffer("&&".getBytes()) ,代码如下:
1
pipeline.addLast(new DelimiterBasedFrameDecoder(1024, Unpooled.copiedBuffer("&&".getBytes())));
  1. 第二种方式也比较简单,这个就是采用了定长的报文,当我们的报文长度不够的时候必须要采用空格补齐。比如说,我们发送了 “aaaaacc” 而我们的定长指定的是 5 那么,我们只会收到 “aaaaa” 而没有 c 这就是因为他不足 5 个,我们必须采用空格补齐才能收到,或者等待下次数据比较多的时候会跟着过来。
1
.addLast(new FixedLengthFrameDecoder(5));
  1. pojo 方式,也就是自定义数据的头和体部分,其中头中最重要的就是一个长度字段。

你好杭州

​ 这次已经是我第二次来杭州了,虽然上次来了一次杭州但是待的时间很短。但是也还是各种不良反应,对突然在北方生活了三年的人,突然来到南方好像显得有点 “格格不入” 。从机场到酒店被出租车司机各种坑,下载打车的 app 然后各种交费,最后那个车只打了一半的路程我就花了 160 多,然后真的是饿的不行就在一个店里吃了一点饭,那个时候真的觉得很累很累,折腾了一天也终于吃上了一顿饭,当时心里真的是又幸福又心酸。

​ 然后吃完以后真的是折腾不动了就想着要不都花了这么多钱了我就直接打车到酒店好了,估计我九点的时候还能到酒店多休息一会。接着又是一顿晕车(晕车这个毛病真的该治治了,可怎么就是治不好呢?),终于在九点的时候成功抵达公司安排的酒店。想着终于能一个人放松一下了,到了前台小姐姐跟我说这个房间是两个人住的,突然感觉又不好了,唉说的是另外一个人什么时候入住还不一定呢,也就是现在就我一个人,那好了我哈能过几天舒服的时间。

​ 然而….然而….. 令我万万没想到的是我刚洗完澡出来这个小伙就来了。我….. 果然还是不能庆幸太早怎么就这么巧呢。好吧,那就两个人住吧!!!随便说了几句我就想着出去买点生活用品好了,那个时候已经十点多了,想着能不能顺便去阿里踩个点,出门之后我就放弃了。现在是十点多对吧?没有时差对吧?没开玩笑对吧?为啥现在的感觉跟我下午5点多的感觉一模一样。心态有点崩,原来杭州这边的保温效果这么好的啊,冬天完全不用暖气什么的吧。

​ 就在楼下还没有关门的天猫超市(看到这还有点亲切,因为我就是这个部门的。: > ),这里面的东西也是超级贵啊就买点洗衣液药膏牙刷什么的吧,到时候酒店那个不好用还是用自己的。其他的矿泉水,面包(没有牛奶)。

​ 接着就和蠢瑾打电话到快十二点了,又聊了一会天才睡的,哎第一天是真的多灾多难!

​ 第二天早晨七点的阳光晃得我没有了睡意,原来是昨晚没有拉上窗帘,起来洗澡然后各种检查证件。

​ 出发去阿里!路上的感觉还是一样的,七点四五十的时候和中午的感觉一样,热!没有一点风,两路的树特别绿,桥下的水也很绿,太阳洒在树叶上亮油油的,感觉好像那些树很享受一样。接着就是惯例贴条子到大厅等候,我进去的那个门走的是停车场开始感觉有点乱,往后面走发现走了好久才经过了一栋楼这个地方是真大。走了很久才到等候区,一路上又热又赶时间一张照片也没拍,但是也看到了不少拍照的那应该是刚到的实习生吧,第一次来肯定都很新鲜。

​ 经过上午加下午两个小时的 hr 小姐姐的絮叨之后终于到了工作区,师兄专门下来帮我搬电脑超感动,师兄也各种跟我攀谈,谁让我平时少言寡语总要别人来带起话题。然后给我分配了 “海景房” 。本来以为我会坐在这个师兄旁边,我旁边的师兄应该20来岁的样子,估计是毕业不是很久的研究生吧。接着我就开始折腾电脑,装各种软件,这个真的是我最喜欢干的事了,可以他是 windows 要是 mac 就好了,真羡慕那些拿 macbook pro 的,我也想要啊 : < ,不过师兄说等我转正了也会配置这种的,怎么说还是很期待。我会努力留下来的,加油!

​ 可是,第二天我就生病了,没错!是鼻窦炎,感觉整个人都废了,这样的话别说实习了我啥都干不了了。全身瘫软,然后硬硬的撑了一天晚上去买药,坑爹的是去了那边就没有信号,没办法用支付宝我钱刚好不够,我可是走了三公里过来买的药啊别这么坑我,折腾好好一会那个医生的儿子才给我用手机开的热点,艰辛的买完了药,真的在得了病之后才感觉每次拿药真的就像救命稻草一样,回去就喝了一遍,第二天早上还是有点严重比昨天稍微好了一点,后来才知道那个房间的空调对着我又吹了一晚上不出问题才怪。早上起来又喝了一遍药去了公司十点多的时候师兄带我去认人,我真的头都抬不起来脑子一片空白一个人都没记住反正就师兄好!其他都是师兄再帮我说,那个时候真的没办法管了因为我站起来都费劲,中午吃饭的时候把筷子都掉在地上了,拿不住,真的一点不夸张。当时不仅仅是生病的原因,那个药的副作用太大了,我敲键盘的时候手放在那都在抖。那种感觉真的不想体验第二次了。可是下午感冒就有了很大的改观,鼻子塞的也没有那么严重了,药确实有效但是这个副作用真的太可怕了。

​ 可是这不是最要命的,最要命是我好几天都整夜整夜的失眠至于原因也很明显就是蠢瑾闹的,整天说气我的话,那几天真的让我特别不高兴,可是第二天早上还是要上班啊…. 所以那段时间过的很不开心,给爸妈打了好几个电话。不过最后几天她态度好太多了,我还挺高兴了,工作也慢慢开始上手了….

​ 第二次来杭州,来阿里继续实习我想这次一定一定要斩杀 offer !我是你的骄傲哦,所以我才不会让你失望呢!

你好杭州

​ 这次已经是我第二次来杭州了,虽然上次来了一次杭州但是待的时间很短。但是也还是各种不良反应,对突然在北方生活了三年的人,突然来到南方好像显得有点 “格格不入” 。从机场到酒店被出租车司机各种坑,下载打车的 app 然后各种交费,最后那个车只打了一半的路程我就花了 160 多,然后真的是饿的不行就在一个店里吃了一点饭,那个时候真的觉得很累很累,折腾了一天也终于吃上了一顿饭,当时心里真的是又幸福又心酸。

​ 然后吃完以后真的是折腾不动了就想着要不都花了这么多钱了我就直接打车到酒店好了,估计我九点的时候还能到酒店多休息一会。接着又是一顿晕车(晕车这个毛病真的该治治了,可怎么就是治不好呢?),终于在九点的时候成功抵达公司安排的酒店。想着终于能一个人放松一下了,到了前台小姐姐跟我说这个房间是两个人住的,突然感觉又不好了,唉说的是另外一个人什么时候入住还不一定呢,也就是现在就我一个人,那好了我哈能过几天舒服的时间。

​ 然而….然而….. 令我万万没想到的是我刚洗完澡出来这个小伙就来了。我….. 果然还是不能庆幸太早怎么就这么巧呢。好吧,那就两个人住吧!!!随便说了几句我就想着出去买点生活用品好了,那个时候已经十点多了,想着能不能顺便去阿里踩个点,出门之后我就放弃了。现在是十点多对吧?没有时差对吧?没开玩笑对吧?为啥现在的感觉跟我下午5点多的感觉一模一样。心态有点崩,原来杭州这边的保温效果这么好的啊,冬天完全不用暖气什么的吧。

​ 就在楼下还没有关门的天猫超市(看到这还有点亲切,因为我就是这个部门的。: > ),这里面的东西也是超级贵啊就买点洗衣液药膏牙刷什么的吧,到时候酒店那个不好用还是用自己的。其他的矿泉水,面包(没有牛奶)。

​ 接着就和蠢瑾打电话到快十二点了,又聊了一会天才睡的,哎第一天是真的多灾多难!

​ 第二天早晨七点的阳光晃得我没有了睡意,原来是昨晚没有拉上窗帘,起来洗澡然后各种检查证件。

​ 出发去阿里!路上的感觉还是一样的,七点四五十的时候和中午的感觉一样,热!没有一点风,两路的树特别绿,桥下的水也很绿,太阳洒在树叶上亮油油的,感觉好像那些树很享受一样。接着就是惯例贴条子到大厅等候,我进去的那个门走的是停车场开始感觉有点乱,往后面走发现走了好久才经过了一栋楼这个地方是真大。走了很久才到等候区,一路上又热又赶时间一张照片也没拍,但是也看到了不少拍照的那应该是刚到的实习生吧,第一次来肯定都很新鲜。

​ 经过上午加下午两个小时的 hr 小姐姐的絮叨之后终于到了工作区,师兄专门下来帮我搬电脑超感动,师兄也各种跟我攀谈,谁让我平时少言寡语总要别人来带起话题。然后给我分配了 “海景房” 。本来以为我会坐在这个师兄旁边,我旁边的师兄应该20来岁的样子,估计是毕业不是很久的研究生吧。接着我就开始折腾电脑,装各种软件,这个真的是我最喜欢干的事了,可以他是 windows 要是 mac 就好了,真羡慕那些拿 macbook pro 的,我也想要啊 : < ,不过师兄说等我转正了也会配置这种的,怎么说还是很期待。我会努力留下来的,加油!

​ 可是,第二天我就生病了,没错!是鼻窦炎,感觉整个人都废了,这样的话别说实习了我啥都干不了了。全身瘫软,然后硬硬的撑了一天晚上去买药,坑爹的是去了那边就没有信号,没办法用支付宝我钱刚好不够,我可是走了三公里过来买的药啊别这么坑我,折腾好好一会那个医生的儿子才给我用手机开的热点,艰辛的买完了药,真的在得了病之后才感觉每次拿药真的就像救命稻草一样,回去就喝了一遍,第二天早上还是有点严重比昨天稍微好了一点,后来才知道那个房间的空调对着我又吹了一晚上不出问题才怪。早上起来又喝了一遍药去了公司十点多的时候师兄带我去认人,我真的头都抬不起来脑子一片空白一个人都没记住反正就师兄好!其他都是师兄再帮我说,那个时候真的没办法管了因为我站起来都费劲,中午吃饭的时候把筷子都掉在地上了,拿不住,真的一点不夸张。当时不仅仅是生病的原因,那个药的副作用太大了,我敲键盘的时候手放在那都在抖。那种感觉真的不想体验第二次了。可是下午感冒就有了很大的改观,鼻子塞的也没有那么严重了,药确实有效但是这个副作用真的太可怕了。

​ 可是这不是最要命的,最要命是我好几天都整夜整夜的失眠至于原因也很明显就是蠢瑾闹的,整天说气我的话,那几天真的让我特别不高兴,可是第二天早上还是要上班啊…. 所以那段时间过的很不开心,给爸妈打了好几个电话。不过最后几天她态度好太多了,我还挺高兴了,工作也慢慢开始上手了….

​ 第二次来杭州,来阿里继续实习我想这次一定一定要斩杀 offer !我是你的骄傲哦,所以我才不会让你失望呢!

Exectors框架 源码分析

Exectors框架 源码分析

1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方便,所以在 github 上提供JDK1.8 的源码、详细的注释及测试用例。欢迎大家 star、fork !

2. 由于个人水平有限,对源码的分析理解可能存在偏差或不透彻的地方还请大家在评论区指出,谢谢!

1. 基本结构

   由于 Exector 这个家族还是比较大的,所以先导出一下类图,对这个家族有一个大概的认识。

Read More

CountDownLatch 源码分析

CountDownLatch 源码分析

1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方便,所以在 github 上提供JDK1.8 的源码、详细的注释及测试用例。欢迎大家 star、fork !

2. 由于个人水平有限,对源码的分析理解可能存在偏差或不透彻的地方还请大家在评论区指出,谢谢!

1. 基本介绍

   Latch 这个单词的意思就是 “闭锁” ,这也是 jdk1.5 引入的一个并发组件,名字听上去并没有让我们对他的功能并没有什么直观的感受。先粗略解释一下他的功能:我们定义了一个带有数值 n 的 Condition 对象,然后我们调用这个对象上的 await 方法,如果说我们要这个线程继续执行,我们不是调用 signal 而是调用 n 次 countDown 方法。这样等待在这个 Condition 上的所有线程都将被唤醒。

Read More