Java里线程的隔离方式_线程隔离浅析

本文探讨了在微服务架构下线程隔离的重要性,介绍了Netty、Dubbo和Tomcat的线程模型。通过示例展示了线程隔离如何避免服务因单个微服务故障而崩溃,提出了线程池隔离和信号量隔离两种策略,其中Hystrix作为线程池隔离的典型实现,并提及了轻量级的信号量隔离方案。线程隔离旨在限制问题影响范围,确保系统的稳定性和高可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

随着微服务的流行,单体应用被拆分成一个个独立的微进程,可能一个简单的请求,需要多个微服务共同处理,这样其实是增加了出错的概率,所以如何保证在单个微服务出现问题的时候,对整个系统的负面影响降到最低,这就需要用到我们今天要介绍的线程隔离。

线程模型

在介绍线程隔离之前,我们先了解一下主流容器,框架的线程模型,因为微服务是一个个独立的进程,之间的调用其实就是走网络io,网络io的处理容器如tomcat,通信框架如netty,微服务框架如dubbo,都很好的帮我们处理了底层的网络io流,让我们可以更加的关注于业务处理;

Netty

Netty是基于java nio的高性能通信框架,使用了主从多线程模型,借鉴Netty系列之 Netty线程模型的一张图片如下所示:

121b4d5be831a07f916bc62b64971362.png

主线程负责认证,连接,成功之后交由从线程负责连接的读写操作,大致如下代码:

EventLoopGroup bossGroup = new NioEventLoopGroup(1);

EventLoopGroup workerGroup = new NioEventLoopGroup();

ServerBootstrap b = new ServerBootstrap();

b.group(bossGroup, workerGroup);

主线程是一个单线程,从线程是一个默认为cpu*2个数的线程池,可以在我们的业务handler中做一个简单测试:

public void channelRead(ChannelHandlerContext ctx, Object msg) {

System.out.println("thread name=" + Thread.currentThread().getName() + " server receive msg=" + msg);

}

服务端在读取数据的时候打印一下当前的线程:

threadname=nioEventLoopGroup-3-1server receive msg="..."

可以发现这里使用的线程其实和处理io线程是同一个;

Dubbo

Dubbo的底层通信框架其实使用的就是Netty,但是Dubbo并没有直接使用Netty的io线程来处理业务,可以简单在生产者端输出当前线程名称:

threadname=DubboServerHandler-192.168.1.115:20880-thread-2,...

可以发现业务逻辑使用并不是nioEventLoopGroup线程,这是因为Dubbo有自己的线程模型,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值