记一次dubbo本地调用导致线程数持续增长问题

 

公司项目重构

    原有项目架构springMVC+mybatis+mysql主从+nginx集群+redis集群,因为业务发展需要重构,以较低的改造成本,完成项目重构。

新架构采用

 springMVC+dubbo远程调用框架+nacos注册中心+sentinel流控

接入方式

引入pom文件

        
        
            org.apache.dubbo
            dubbo-configcenter-nacos
        
        
            org.apache.dubbo
            dubbo-registry-nacos
        
        
        
        
            com.alibaba.csp
            sentinel-apache-dubbo-adapter
        
        
            com.alibaba.csp
            sentinel-transport-simple-http
        

新建两个web工程

1、dubbo-web:

将原有项目的controller迁移到该工程下,maven引入API增加dubbo.xml配置

    
    
    
    
    
    

service声明使用阿里巴巴的dubbo注解

    @Reference(version = CDubboVersionInfo.VERSION_1,group = CDubboVersionInfo.NAME,check = false)
    private AppFeedbackService appFeedbackService;

2、dubbo-service

将原有项目的API+service实现+dao层代码用maven引入

增加dubbo配置

    
    
    
    
    
    
    
    
    

 service实现类声明

@Slf4j
//@Service("dailyAudioService") 删除原有的spring注解,
//更换为 import org.apache.dubbo.config.annotation.Service;
@Service(version = CDubboVersionInfo.VERSION_1,group = CDubboVersionInfo.NAME)
public class xxxServiceImpl implements xxxService {
    @Reference(version = CDubboVersionInfo.VERSION_1,group = CDubboVersionInfo.NAME,check = false)
    private SystemConfigureService systemConfigureService;
}

在dubbo-service启动配置中加入参数

-Dmode=develop 
-Djava.net.preferIPv4Stack=true 
-Dcsp.sentinel.api.port=8721 
-Dcsp.sentinel.dashboard.server=127.0.0.1:8080 
-Dproject.name=xxx-dubbo-service

启动nacos服务,登录管理界面,服务都已经注册上了

记一次dubbo本地调用导致线程数持续增长问题_第1张图片

进入sentinel流控页面

记一次dubbo本地调用导致线程数持续增长问题_第2张图片

上线采坑

    经过了几天的测试,一切正常,然后就正式上生产了

dubbo-web端部署6节点

dubbo-service部署8个节点

上线后服务运转也是一切正常,单台机器服务调用qps维持在200左右

高峰时期1000~2000,秒杀业务瞬时4000都能支持

但是经过一段时间的运行发现sentinel的蔟点链路监控中,线程数一直在增长,增量几乎是调用次数的总和

 分析服务器的线程数量,虽然没有这么夸张,但是也都达到80左右了,内存占用也上升的很快,fullgc次数非常频繁

摸索解决

经过各种折腾,终于发现了问题

dubbo服务与服务之间的调用使用@Reference注解声明时根据官方文档显示会走本地调用,而调用链路也会计入sentinel统计。

然而这个本地调用并没有正常生效,这个线程数增长的一个现象很明显是服务之间的嵌套调用导致无法释放的问题。

最终服务之间的调用使用spring的自动装配注解 @Autowired,线程数增长的问题立即得到了解决。

web调service处保持不变

代码如下

@Slf4j
//@Service("dailyAudioService") 删除原有的spring注解,
//更换为 import org.apache.dubbo.config.annotation.Service;
@Service(version = CDubboVersionInfo.VERSION_1,group = CDubboVersionInfo.NAME)
public class xxxServiceImpl implements xxxService {
    @Autowired(required = false)
    private SystemConfigureService systemConfigureService;
}

 

你可能感兴趣的:(技术,java,spring,后端)