Netty使用

1. 简介
Netty是一个NIO框架,能帮助开发者方便快捷的开发网络应用。先上一个官方的整体框架图感受下(虽然并没啥用):
01
与Java NIO相比(也比较官方):
Java NIO
<1> NIO的类库和API繁杂,使用麻烦;
<2> 需要具备其他的技能做铺垫,如Java多线程编程,NIO编程涉及到Reactor模式,必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序;
<3> 可靠性,如断连重连,网络闪[......]

Read more

Posted in 日常文章 | Tagged | Leave a comment

Redis pub/sub模式

背景

Redis的pub/sub是一个比较尴尬的存在。无论是作为消息中间件抑或是类似zookeeper的通知机制都有明显的缺陷。不然如果应用较小且对可用性、扩展性等要求不高也可以考虑,通过自己“多做一些”的方式来满足自己的要求。
Redis支持两种类型的sub模式,一种是针对具体channel的subscribe;另一种是针对某个pattern的pSubscribe,可同时subscribe匹配的所有channel。

机制

<1> 当客户端[......]

Read more

Posted in 日常文章 | Tagged | Leave a comment

Tomcat 8.5.x版本升级变化

1. 其中一些重要变化(对HTTP2,SSL支持的改动较多)

<1> 不再提供对HTTP BIO,AJP BIO的支持;
<2> 重构HTTP upgrade与AJP实现,减少重复;
<3> 支持HPACK header encoding与decoding;
<4> 增加JSSE的SSL engine,同时支持ALPN;
<5> 支持HTTP/2 server push;
<6> 不再支持Comet;
<[......]

Read more

Posted in 日常文章 | Tagged | Leave a comment

从Tomcat无法正常关闭讲讲Java线程关闭问题

正常情况下,会优先采用catalina.sh stop来停止Tomcat实例,这样可以让服务有机会处理完请求,并做好善后工作。 但如果通过catalina.sh stop命令无法关闭Tomcat实例,则只能kill -9了。

 

为什么在给Tomcat发出stop命令以后,Tomcat实例无法关闭?

 

可能有两种原因:

  • Tomcat的主线程没有结束(也即main函数没有执行结束);
  • Tomcat中启动的webapps有非daemon线程阻[......]

Read more

Posted in 日常文章 | Tagged , | 评论关闭

Junit4:测试方法执行顺序

(注意,我要用官方文档开始刷存在感了…)

在之前的版本中,Junit在设计上并没有指定测试方法的执行顺序,方法的调用就是根据reflection api的返回顺序。鉴于Java平台并没有规定一个特定的顺序,甚至其返回的顺序有一定的随机性,依赖于JVM的顺序非常的不明智。

 

当然,编写良好的测试用例是不应该依赖于测试方法的执行顺序的。但万一存在这样的情况呢?这个时候“确定顺序”带来的可预测的测试失败总是好过随机的测试失败。

 

从4.11版本开始[......]

Read more

Posted in 日常文章 | Tagged | Leave a comment

Junit4:异常测试

(注意,我要用官方文档开始刷存在感了…)

有些时候,单元测试中需要验证抛出的异常是否是期望得到的,抑或验证抛出异常的message等信息。

这如果是在junit3,一般会通过try catch来处理,在catch中判断异常类型,抑或比较message值。

当然,这一点都不优雅,不但要多谢许多代码,测试用例中充斥的try catch也非常不好看。到了junit4,junit提供了新的方式来支持异常测试。

 

<1> 在@Test中通过expe[......]

Read more

Posted in 日常文章 | Tagged | Leave a comment

Dubbo走读——ExtensionLoader(服务发现)

JAVA提供的服务发现

 

Java1.6开始通过ServiceLoader提供了一种服务发现机制,通过它可以自由选择自己的服务实现。其工作原理是,通过扫描/META-INF/services/下以服务名称(类名称)命名的文件找到对应的服务实现,ServiceLoader返回的是Iterator,如果有多个,则需要由使用方做选择。

 

JDK中有一些实现就用了这种服务发现机制,像SelectorProvider在创建provider的过程中,会通过Ser[......]

Read more

Posted in 日常文章 | Tagged | Leave a comment

dubbo-rpc请求处理流程 client端

获取reference对象

假设我们采用Spring配置,那么我们使用的是ReferenceBean,从ReferenceBean继承自FactoryBean我们知道对于这么一个reference配置:

<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />

当引用这个bean时,是通过ReferenceBean[......]

Read more

Posted in 日常文章 | Tagged | Leave a comment

dubbo-负载均衡

1. 一些相关的概念

<1> 服务sticky(服务黏性),类似让客户端的请求总是分发到同一台服务器。

如nginx中可以支持session sticky,通过ip_hash实现客户端的请求总是分发到同一个服务器。 有时候网站或系统经常是与session有关的,需要用sessionid或cookie来识别用户验证用户。

 

2. 实现原理

dubbo官方文档中对负载均衡扩展的说明有:

(1) 扩展说明:

从多个服务提者方中选择一个进行调用。[......]

Read more

Posted in 日常文章 | Tagged | Leave a comment

每日碎碎念——Spring Bean依赖的dubbo服务创建失败导致系统无法启动?

项目中一些地方需要调用dubbo提供的服务,dubbo提供了对spring的完美支持,客户端只需配置一个reference bean即可使用服务。这个时候面临了一个问题:由于我们的业务bean直接通过注入方式使用dubbo接口,系统启动过程中,spring会pre initialize bean,这个时候由于依赖的bean创建失败,spring会直接关闭bean容器,系统启动失败。

可以看看BeanFactory的refresh函数:

try {[......]

Read more

Posted in 日常文章 | Tagged , | Leave a comment