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:Netty的Reactor线程,线程池中的每个线程其实都是一个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和处理工作逻辑分开,具体的工作逻辑还是分布到各个工作线程中
Netty的IO线程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
- java 2 linux 服务
- java服务2
- Java Web服务性能优化实践(2)
- Java消息服务基础
- Java消息服务
- Java消息服务基础
- JMS---Java消息服务
- Java后台服务程序设计
- java 邮件服务
- java 邮件服务
- Java Web 服务专题
- Java Web 服务专题
- Java后台服务程序设计
- Java消息服务
- Java打印服务API
- java打印服务
- wrapper 搭建java 服务
- Java 后台服务程序设计
- 51nod 1003 阶乘后面0的数量
- CodeForces
- forkjoin
- HDU1108求最小公倍数
- poj2449
- java服务2
- 初学acmer--读《算法竞赛入门经典》笔记(五)P41-45
- 分拆素数和||HDU2098
- JDBC数据库连接工具类
- 视图、索引、存储过程优缺点
- volatile
- centos 6.5 防火墙端口操作
- Java Poi 在SSM框架中的应用(由Excel 导入到Mysql数据库)
- Spring中${}的使用