外观
yidun-cms — 公告与系统消息管理
分层:业务层 | 部署单元:1 个 | 数据库:MySQL(yd_platform / platform) | base image:private-registry.nis.netease.com/library/base-image:jdk17
一、模块定位与架构
本模块是易盾 SaaS 平台的公告与系统消息管理服务:负责公告/消息的创建、编辑、发布(含定时与循环发布)、下线、删除,按账号、客户等级、开通状态等条件做定向投递,并追踪每个账号的已读/未读状态,最终驱动控制台弹窗、消息中心未读红点与邮件通知。业务逻辑全部收敛在 service/business,对外只暴露 Dubbo 门面。
架构分层(协议/逻辑/数据三层映射到子模块):
- 协议层:
facade/dubbo-provider(DubboCmsFacade实现,唯一可构建单元)、console/api与facade/http-api(Spring Boot 骨架,无业务 Controller)。 - 逻辑层:
service/business(CmsServiceImpl内容生命周期与发布状态机)、scheduler(定时任务,无实现)。 - 数据层:
service/base(MyBatis DAO:CmsDao/CmsReadRecordDao,表cms_info/cms_read_record)、domain、common。
关键数据流:
上游 antispam-cms 后台/调度 → Dubbo CmsFacade → CmsServiceImpl.publish/queryList/updateSendResult → 发布时 cmsReadRecordDao 清已读 + cmsDao 置状态 PUBLISH/sendResult=false → 控制台弹窗(PopUpWindow)、消息中心红点与邮件通知消费结果。
核心业务概念:
- 外对契约:Dubbo 门面
CmsFacade(版本化接口,CmsFacadeProvider实现 + 参数断言)。 - 发布状态机:公告/消息状态
草稿(1) / 回收(2) / 发布(3) / 待发布(4),由CmsServiceImpl的 create/edit/publish/offline/draft 方法驱动;回收态不可作为 create/edit 的目标态。 - 定向投递:
MessageCondition按账号、客户等级、开通状态等条件筛选投递对象。 - 发布调度配置:
AnnouncementPublishConfig支持循环发布与定时发布。 - 已读追踪:
CmsReadRecordService/CmsReadRecordDao维护cms_read_record。 - 数据表:
cms_info(公告/消息主体)、cms_read_record(已读记录),映射见CmsMapper.xml/CmsReadRecordMapper.xml。
二、可部署服务清单
| 部署单元目录 | artifactId | 镜像名 | 端口 | 服务类型 | 独立 Dockerfile | 是否进 kubernetes.yml |
|---|---|---|---|---|---|---|
facade/dubbo-provider | yidun-cms-facade-dubbo-provider | yidun-cms-facade-dubbo-provider | 随机(dubbo.protocol.port=-1) | Dubbo Provider | 有 | 无(模块无 kubernetes.yml) |
console/api | yidun-cms-console-api | — | 8080 | 控制台后端(骨架) | 无(不构建) | 否 |
console/web | —(仅 README 空壳,无工程) | — | 无 | 前端骨架 | 无(不构建) | 否 |
facade/http-api | yidun-cms-facade-http | — | 8080 | HTTP 接口骨架 | 无(不构建) | 否 |
scheduler | yidun-cms-scheduler | — | 无 | 定时任务(无实现) | 无(不构建) | 否 |
facade/dubbo-api | yidun-cms-facade-dubbo-api | — | 无 | Dubbo 接口定义(非部署单元) | 无(不构建) | 否 |
三、同模块启动顺序
facade/dubbo-provider— 唯一可构建镜像的单元,注册 DubboCmsFacade,供antispam-cms/netease-antispam等上游解析。- (未构建)
console/api、facade/http-api、scheduler— 仅骨架,无 Dockerfile,暂不纳入常规启动序列。
四、逐服务启动逻辑
4.1 facade/dubbo-provider
- 启动类:
com.netease.is.yidun.cms.facade.dubbo.DubboApplication(facade/dubbo-provider/src/main/java/com/netease/is/yidun/cms/facade/dubbo/DubboApplication.java)。 - exclude:无。
@Enable*/@Import:@EnableAspectJAutoProxy。- 配置类:
configuration/FacadeDubboConfiguration——@ComponentScan({"com.netease.is.yidun.cms.service"})+@MapperScan("com.netease.is.yidun.cms.dao")+@Bean RedisComponent。 - Dubbo:
dubbo.scan.basePackages=com.netease.is.yidun.cms.facade.dubbo.provider;dubbo.protocol.port=-1;dubbo.application.qos-enable=false;dubbo.provider.filter=qos-access;dubbo.protocol.register=false。 - MyBatis:
mybatis.type-aliases-package=com.netease.is.yidun.cms.domain。 main()自定义:无。- 启动钩子:未发现(全模块无
@PostConstruct/InitializingBean/ Runner)。
4.2 console/api(无 Dockerfile,不构建)
- 启动类:
com.netease.is.yidun.cms.console.api.ConsoleApplication;仅@SpringBootApplication。 - 配置类:
ConsoleConfiguration——@ComponentScan({"com.netease.is.yidun.cms.service","com.netease.is.yidun.cms.manager"})+@MapperScan("com.netease.is.yidun.cms.dao");SwaggerConfiguration(@EnableSwagger2)。 - 端口:
server.port=8080,Undertow(io-threads=1、worker-threads=2)。 application-online.properties为127.0.0.1:3306/fatelocalhost 模板。
4.3 facade/http-api(无 Dockerfile,不构建)
- 启动类:
com.netease.is.yidun.cms.facade.http.HttpApplication;仅@SpringBootApplication。 - 配置类:
FacadeHttpConfiguration——@ComponentScan({"com.netease.is.yidun.cms.service","com.netease.is.yidun.cms.manager"})+@MapperScan("com.netease.is.yidun.cms.dao")+@Bean RedisComponent;SwaggerConfiguration。 - 端口:
server.port=8080,Undertow(io-threads=1、worker-threads=2)。 application-online.properties为 localhost 模板。
4.4 scheduler(无 Dockerfile,不构建)
- 启动类:
com.netease.is.yidun.cms.scheduler.SchedulerApplication;@SpringBootApplication+@EnableScheduling。 - 配置类:
SchedulerConfiguration——@ComponentScan+@MapperScan。 - 任务实现:未发现(无
@Scheduled、无*Task类、无 ElasticJob)。 application-online.properties为 localhost 模板。
五、启动前置依赖
| 依赖 | 配置键/地址 | 阻塞 or 弱依赖 | 配置文件 |
|---|---|---|---|
| MySQL | online/jiande:jdbc:mysql://yidun-rds-platform-online-jd-30178.rds.cn-east-p1.internal.:3331/yd_platform(com.mysql.jdbc.Driver,用户 yd_censor);test:yidun-rds-public-test-jd-30108...:3331/platform | 阻塞 | facade/dubbo-provider/application-online.properties |
| ZooKeeper(Dubbo) | online/jiande:nisp-zk5..nisp-zk9:2181;dev/test:yidun-test-commonzk01..03:2181;group /yidun/antispam/online-new/yidun-antispam-dubbo | 阻塞 | application-online.properties / application-dev.properties |
| Redis | 未发现显式配置(代码中 @Bean RedisComponent) | 弱依赖 | — |
| Kafka | 未发现 | — | — |
| Apollo | 未发现 | — | — |
| 外部服务 | 未发现 | — | — |
六、启动参数与 Profile
- Profiles:已有
dev/test/online/jiande-online(无private)。 - Maven profile:
facade/dubbo-provider/build.sh默认BUILD_ENV=private,触发mvn clean install -P private;Dockerfile-Dspring.profiles.active=private。 - JAVA_OPTS:
-Xmx512m -Xms512m -XX:+UseG1GC -Dspring.profiles.active=private。 - base image 与仓库:
private-registry.nis.netease.com/library/base-image:jdk17;镜像仓库private-registry.nis.netease.com/yidun;tagbase-250409;jar 落/app/;build.sh用docker buildx --platform linux/amd64,linux/arm64。 - 启动命令(容器内):
bash docker-entrypoint.sh,实际执行java $JAVA_OPTS -jar /app/yidun-cms-facade-dubbo-provider.jar。 - Profile 文件清单:
facade/dubbo-provider/src/main/resources/下application.properties、application-dev.properties、application-test.properties、application-online.properties、application-jiande-online.properties。
七、启动期踩坑
- 无
application-private.properties却强制-Dspring.profiles.active=private:只会加载application.properties(默认 dev 段),dubbo.registry.address/group与数据源全部缺失 → 容器内启动失败。 facade/http-api、console/api、scheduler的application-online.properties均为 localhost 模板(127.0.0.1:3306/fate),不可直接用于生产。- 数据源为
yd_platform(online/jiande)或platform(test),落在yidun-rds-platform-online-jd-30178RDS 实例,与yidun-account同实例不同库。 - 只有
facade/dubbo-provider可构建:console/api、facade/http-api、scheduler均无 Dockerfile。 scheduler无任务实现(grep@Scheduled/*Task/ ElasticJob 全 0 命中),定时链路依赖上游antispam-cms的调度任务。dubbo.protocol.register=false:Dubbo 服务不注册注册中心,消费方需另配发现方式。- 无 Redis/Kafka/Apollo/外部服务接入:
RedisComponentBean 存在但无对应配置,基础设施面窄。 console/web仅 README 空壳:无前端工程、无 Dockerfile,前端能力不在本模块交付。- 上游调度耦合:本模块的发布与邮件结果回写依赖上游
antispam-cms的调度任务(AnnouncementPublishWorker、MessageSendEmailWorker)周期性触发publish/queryList/updateSendResult,本模块自身无定时实现。 - 表结构依赖:
cms_info/cms_read_record由CmsMapper.xml/CmsReadRecordMapper.xml定义,库表缺失或字段不符会启动即报错。 - 契约消费面广:
antispam-cms、netease-antispam、antispam-cms-web、yidun-supervision-cms均引入yidun-cms-facade-dubbo-api,CmsFacade字段/状态语义变更会波及多方。
八、跨模块前置
- 依赖上游 antispam-cms(后台
integration/cms/CmsService与调度任务AnnouncementPublishWorker/MessageSendEmailWorker)通过 DubboCmsFacade调用本模块。 - 依赖 netease-antispam、antispam-cms-web、yidun-supervision-cms 作为契约消费方(引入
yidun-cms-facade-dubbo-api)。 - 依赖基础设施 platform-common(
Result/Page/BusinessException等)与 MySQL 表cms_info、cms_read_record。 - 中间件前置仅需 MySQL(yd_platform) 与 ZooKeeper,无 Kafka/Redis/Apollo 依赖。
- 启动顺序:先起
facade/dubbo-provider并注册CmsFacade,上游antispam-cms方可解析调用。