java服务2

来源:互联网 发布:excel数据透视表题目 编辑:程序博客网 时间:2024/06/14 09:49

1.  并发 并行 性能调优

并行:两个或者多个事件在同一时刻发生,不同实体上的多个事件

并发:两个或多个事件在同一时间间隔发生,同一实体上的多个事件

性能调优:比如同时创建1W线程 4个cpu来处理,线程之间是通过时间片来切换,线程切换导致系统开销比较大,这时就需要性能调优

2.  公司使用的技术架构:Dubbo协议长连接 + hessian2 + netty3 + zookeeper

3.  线程模型-netty线程模型

服务端创建

a)  打开ServerSocketChannel,用于监听客户端的连接

b)  绑定监听端口,设置客户端连接方式为非阻塞模式

c)  创建Reactor线程,打开多路复用器并启动服务端监听线程,

d)  将ServerSocketChannel注册到Reactor线程的多路复用器Selector上,监听ACCEPT状态位

e)  多路复用器在线程run方法的无限循环体内轮询准备就绪的Key,

f)  多路复用器监听到有新的客户端接入,处理新的接入请求,完成TCP三次握手后,与客户端建立物理链路

g)  设置客户端链路的TCP参数

h)  将新接入的客户端连接注册到Reactor线程的多路复用器上,监听读操作位,用来读取客户端发送的网络消息

i)  异步读取客户端请求消息到服务端缓冲区

j)  对ByteBuffer进行解码,如果有半包消息指针Reset,继续读取后续的报文,将解码成功的消息封装成Task,投递到业务线程池中,进行业务逻辑编排

k)  将POJO对象encode成ByteBuffer,调用SocketChannel的异步write接口,将消息异步发送给客户端

 

相关概念:

ŸServerBootstrap初始化netty服务并且初始化channel

ŸNioEventLoop:NettyReactor线程线程池中的每个线程其实都是一个NioEventLoop,主要有两种类型boss线程和work线程

boss线程池(Acceptor)用于接收TCP连接,监听fd(句柄),一个连接对应一个boss线程

work线程池(I/O Thread)用于处理I/O操作,并且分配task,一般为cpu数量+1个线程

boss线程与work线程之间数据共享使用的是blockingqueue

Ÿ Selector:多路复用选择器,一个单独的线程通过selector可以管理多个channel

Ÿ Channel:netty中通讯的载体,而ChannelHandler负责Channel中的逻辑处理

Ÿ Task:系统Task和定时Task

系统Task:创建它们的主要原因是,当IO线程和用户线程都在操作同一个资源时,为了防止并发操作时锁的竞争问题,将用户线程封装为一个Task,在IO线程负责执行,实现局部无锁化

定时Task:主要用于监控和检查等定时动作

 

 


客户端创建

客户端线程模型

a)由用户线程负责初始化客户端资源,发起连接操作

b)如果连接成功,将SocketChannel注册到IO线程组的NioEventLoop线程中,监听读操作位

c)如果没有立即连接成功,将SocketChannel注册到IO线程组的NioEventLoop线程中,监听连接操作位

d)连接成功之后,修改监听位为READ,但是不需要切换线程。

4.Dubbo通信层(Netty)的实现过程

Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。

 

dubbo中使用netty的优点:

以前的逻辑中,建立工作连接后,收发数据时,整段通讯时间内都需要保持连接而netty在NioEventLoop整合了编码解码的过程,将建立连接,I/O通信,分配task和处理工作逻辑分开,具体的工作逻辑还是分布到各个工作线程中

NettyIO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起

Netty采用了异步通信模式,一个IO线程可以并发处理N个客户端连接和读写操作,这从根本上解决了传统同步阻塞IO一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升

 

5.Dubbo配置

connections:对每个提供者的最大连接数,dubbo长连接协表示建立的长连接个数

cluster

1)AvailableCluster:获取可用的调用。遍历所有Invokers判断Invoker.isAvalible,只要一个有为true直接调用返回,不管成不成功

2)BroadcastCluster:广播调用。遍历所有Invokers,逐个调用每个调用catch住异常不影响其他invoker调用

3)FailbackCluster:失败自动恢复, 对于invoker调用失败,后台记录失败请求,任务定时重发, 通常用于通知

4)FailfastCluster:快速失败,只发起一次调用,失败立即保错,通常用于非幂等性操作

5)FailoverCluster: 失败转移,当出现失败,重试其它服务器,通常用于读操作,但重试会带来更长延迟

集群配置说明详细参见:http://fjohnny.iteye.com/blog/2309965

loadbalance

Dubbo提供了4种均衡策略,如:Random LoadBalance(随机均衡算法)、RoundRobin LoadBalance(权重轮循均衡算法)

详细策略算法参见 http://blog.csdn.net/qq_26562641/article/details/50392142

stub&mock

filter&listener

dubbo提供了Filter扩展  详见:http://blog.csdn.net/quhongwei_zhanqiu/article/details/41651659

init:如果需要饥饿加载,即没有人引用也立即生成动态代理,可以配置:init=true

threadpool:CachedThreadPool, FixedThreadPool,LimitedThreadPool

heartbeat:

心跳检测配置中心和每个Server/Client之间会作一个实时的心跳检测因为它们都是建立的Socket长连接

 

6.Dubbo重点源码解读

Proxy

Invoker

Handler

详细参见: http://blog.csdn.net/qq418517226/article/details/51818769

原创粉丝点击