原有项目架构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服务,登录管理界面,服务都已经注册上了
进入sentinel流控页面
经过了几天的测试,一切正常,然后就正式上生产了
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;
}