外观
yidun-website — 易盾官网/控制台/管理后台后端聚合工程
分层:业务层(官网 + 控制台 + 管理后台 + OpenAPI)| 部署单元:1 个可构建(历史 9+ 个模块有启动类但被注释/不构建)| 数据库:MySQL(
yidun-website-upload排除 DataSource,本身不需要)| base image:private-registry.nis.netease.com/library/base-image:jdk17(tagbase-250409)
一、模块定位与架构
面向客户与内部运营的“官网 + 控制台 + 管理后台”后端聚合工程:解决客户如何开通/购买/试用产品、销售与运营如何管理客户与产品、外部系统如何接入这一整套获客与运营问题。它本身不做检测,而是编排账号、产品、订单、计费、名单、关键词等能力形成业务闭环;本仓库当前只保留 yidun-website-common 与 yidun-website-upload 两个 module 被激活,其余模块源码仍在但被注释掉。
架构分层
- 接入层:
yidun-website-api(ISV OpenAPI)、yidun-website-outerapp(NOS 回调/云信/图片检测转发)、yidun-website-upload(图片 base64/url 转存 NOS) - 控制层:
yidun-website-web(官网/用户中心)、yidun-website-management(运营/销售后台,承载前端静态资源) - 领域层:
yidun-website-base(Account/Order/Product 等领域 Service + DAO)、yidun-website-common(常量/公共组件) - 数据/消息层:
yidun-website-ndc/-datasync/-async/crm-message - 前端:
yidun-website-front(Vue2 + Vite,产物写进 management)
关键数据流
- 用户登录 →
UrsCloudAuthenticationProvider.authenticate→ 落guanwang_account表 - 下单 →
OrderController→CreateOrderStrategyFactory.get(ServiceType)路由到 10 类创建策略 → 调云支付/各子服务 - 图片上传 → Kafka
yidun_nos_upload→UploadMessageConsumer→ImageBase64Handler/ImageUrlHandler→ NOS/阿里云/腾讯 COS 多桶 - OSS 删除 → Kafka
YIDUN_COMMON_OSS_DELETE_TOPIC→OssDeleteConsumer - 对外 → 经 Dubbo 消费
antispam-business/antispam-bill/antispam-keyword/antispam-list/yidun-account/yidun-export - 前端
yidun-website-front构建产物 →yidun-website-management/target/classes/static→ 随 management 一起发布
二、可部署服务清单
| 部署单元目录 | artifactId | 镜像名 | 端口 | 服务类型 | 独立 Dockerfile | 是否进 kubernetes.yml |
|---|---|---|---|---|---|---|
yidun-website-upload | yidun-website-upload | private-registry.nis.netease.com/yidun/yidun-website-upload:base-250409 | 无 Web(仅 starter) | Kafka Consumer(图片转存) | 有 | 否(无 kubernetes.yml) |
yidun-website-web | yidun-website-web | 无(不构建) | 8008(online/pre 8088,test 8888) | 官网/用户中心后端 | 无 | 否 |
yidun-website-api | yidun-website-api | 无(不构建) | 8004(pre 8014) | OpenAPI / ISV | 无 | 否 |
yidun-website-management | yidun-website-management | 无(不构建) | 8882(pre 8883) | 运营/销售后台(含前端静态资源) | 无 | 否 |
yidun-website-async | yidun-website-async | 无(不构建) | 无 Web | ElasticJob(30+ Worker) | 无 | 否 |
yidun-website-ndc | yidun-website-ndc | 无(不构建) | 无 Web | 数据统计消费(Qos) | 无 | 否 |
yidun-website-datasync | yidun-website-datasync | 无(不构建) | 无 Web | 跨系统数据同步 | 无 | 否 |
yidun-website-crm/yidun-website-crm-message | yidun-website-crm-message | 无(不构建) | 无 Web(连 RabbitMQ 5672) | RabbitMQ/Kafka 消息消费 | 无 | 否 |
yidun-website-crm/yidun-website-crm-base | yidun-website-crm-base | — 类库,不部署 | — | CRM 公共基座 | 无 | 否 |
yidun-website-outerapp/yidun-outerapp-api | yidun-outerapp-api | 无(不构建) | 外部容器(packaging=war,finalName yidun-outerapp-api) | 外部应用接入 | 无 | 否 |
yidun-website-outerapp/yidun-outerapp-check | yidun-outerapp-check | 无(不构建) | 无 Web | 图片检测转发 | 无 | 否 |
yidun-website-base | yidun-website-base | — 类库,不部署 | — | 领域 Service + DAO | 无 | 否 |
yidun-website-common | yidun-website-common | — 类库,不部署 | — | 公共常量/组件 | 无 | 否 |
yidun-website-front | yidun-website-front | — 前端,不独立部署(产物进 management) | 8886(vite dev) | 管理后台前端 | 无 | 否 |
本仓库无
kubernetes.yml;buildAll.sh用find . -name build.sh只会发现yidun-website-upload/build.sh(唯一有 Dockerfile 的单元);根pom.xml的<modules>只激活yidun-website-common与yidun-website-upload,其余 module 均被注释。
三、同模块启动顺序
yidun-website-upload—— 唯一可构建的可部署服务,负责图片转存,独立于其他模块,先起无害。yidun-website-api—— 对 ISV/外部的 OpenAPI,其接口会经 Dubbo 调下层检测/计费,须在下层antispam-*可用后再起。yidun-website-web—— 官网/用户中心后端(登录、下单、支付、关键词、名单),依赖yidun-website-base与账号中心。yidun-website-management—— 承载前端静态资源(yidun-website-front产物写入其target/classes/static),因此必须最后构建/发布,否则静态页不进 jar。yidun-website-async/-datasync/crm-message/-ndc—— 定时任务与消息消费,最后起,避免下游数据尚未就绪时任务空跑/报错。
理由:management 承前端、async 等为后台任务,二者都在业务读取侧之后;upload 与其余模块无时序耦合。
四、逐服务启动逻辑
yidun-website-upload(唯一可构建)
- 启动类:
com.netease.is.yidun.upload.YidunUploadApplication(yidun-website-upload/src/main/java/com/netease/is/yidun/upload/YidunUploadApplication.java) @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})——显式排除数据源自动装配(本服务不需要 MySQL)@Enable*:@EnableOssClient、@EnableRecoverComponent(com.netease.is.antispam.components.recover.spring)、@EnableConfigurationProperties({YidunUploadProperties.class, ImageNosBucketConfig.class})- 配置类:
YidunUploadProperties(@ConfigurationProperties(prefix="yidun.upload"),含bucket-Map/regionId)、ImageNosBucketConfig(@ConfigurationProperties(prefix="image.upload"),含buckets[]) main():仅SpringApplication.run(...)- 启动钩子:
ImageBase64Recover.@PostConstruct、ImageUrlRecover.@PostConstruct(失败重放/恢复)OssBucketHelper.@PostConstruct(按image.upload.buckets[]建桶映射)YidunQosApplication(@QosRegister implements QosApplication):doOnline()遍历kafkaListenerEndpointRegistry.getAllListenerContainers()逐个start()/resume();doOffline()逐个pause()后sleep 3000ms
- Kafka 消费(
@com.netease.is.antispam.components.kafka.consume.KafkaConsumer):UploadMessageConsumer.handle:topicsyidun_nos_upload(kafka.comsume.upload.topic),clusterIdsantispam,security,groupIdkafka.consume.group.idOssDeleteConsumer.handle:topicsYIDUN_COMMON_OSS_DELETE_TOPIC(kafka.comsume.oss.delete.topic),clusterIdantispam,groupIdkafka.consume.oss.delete.group.id
历史模块(源码在,但根 pom 注释、无 Dockerfile)
com.netease.is.yidun.web.YidunWebApplication:@SpringBootApplication(scanBasePackageClasses={ComponentScanMarker.class, YidunWebApplication.class})+@ImportResource({application-context-web.xml, application-context-base-dubbo.xml, antispam-image-dubbo-consumer.xml})+@MapperScan("com.netease.is.yidun.customercenter.dao")+@EnableWebSecurity+@EnableOssClient;端口 8008(online/pre 8088,test 8888)com.netease.is.yidun.api.YidunApiApplication:+ @ImportResource({application-context-base-dubbo.xml, antispam-cms-dubbo-consumer.xml})+@EnableScheduling+@EnableOssClient;BillStatController/CloudPayController有@PostConstruct;CrossDeployEnvPayNotifyWorker用@Scheduled(cron="${yidunApi.taskCrons.crossDeployEnvPayNotifyWorker}");端口 8004(pre 8014)com.netease.is.yidun.admin.YidunAdminApplication:@EnableDubbo+@Bean("springSessionDefaultRedisSerializer") JdkSerializationRedisSerializer(自定义PackageMoveDeserializerConverter);端口 8882(pre 8883)com.netease.is.yidun.async.YidunAsyncApplication:@EnableScheduling+@EnableElasticJob+@QosRegister+@EnableOssClient;30+@ElasticJobConfWorker(计费/账单/统计/套餐/发票/话术工单等),其中PayFlowFetchWorker/MembershipGradeWorker/NssMonitorNoticeWorker有@PostConstructcom.netease.is.yidun.ndc.YidunNdcApplication:@QosRegister;AbstractStatConsumer implements InitializingBeancom.netease.is.yidun.datasync.YidunDatasyncApplication:@QosRegister+@EnableOssClient;HttpSynchronizer/RegisteredSynchronizer/SubscribedTable均@PostConstructcom.netease.is.yidun.crm.message.YidunCrmMessageApplication:@QosRegister+@EnableRecoverComponent;KafkaConfig/NewKafkaConfig带@EnableKafka;RabbitMqConsumer有@PostConstruct;连mq-port: 5672
yidun-website-front(前端,产物进 management)
- scripts:
dev=vite、build:test=vite build --mode test、build:online=vite build --mode production -- --usecdn、preview-vite=vite preview vite.config.js:outputDir='../yidun-website-management/target/classes/static'、base=usecdn ? https://yidunfe.nosdn.127.net/yidun-website-front/ : '/'、server.port=8886、host='yidun-admin-dev.nistest.netease.com'、proxy^/modules、^/api→http://yidun-admin.nistest.netease.com- Node 14.19.0(
volta.node+frontend-maven-plugin);旧.build.xml(ant)为历史遗留
五、启动前置依赖
以唯一的可构建服务 yidun-website-upload 为准:
| 依赖 | 配置键 / 地址 | 阻塞 or 弱依赖 | 配置文件 |
|---|---|---|---|
| Kafka(多集群) | kafka.bootstrap.servers(online yidun-jd-nrkafka01..05.service.163.org:9092);消费 topic yidun_nos_upload、YIDUN_COMMON_OSS_DELETE_TOPIC | 阻塞 | application-online/dev.properties |
| Redis Cluster | spring.redis.cluster.nodes(online 10.196.180.49:6107,...,spring.redis.password=188cf6da6f46) | 阻塞 | application-online.properties |
| OSS / NOS / 阿里云 / 腾讯 COS(多桶) | oss.client.instance-map.*(yidun-antispam、yidun-antispam-sg/virginia/frankfurt、authentication、antispam-{sg,eu,us}-archive-1314975822 等) | 阻塞 | application.properties |
| ZooKeeper(client + Sentinel 规则源) | zookeeper.server.url(online yidun11.dg.163.org:2181,...);Sentinel dk.path=/sentinel_rule_config/yidun-upload/degradeRules | 弱 | application-online/dev.properties |
| Sentinel Dashboard | spring.cloud.sentinel.transport.dashboard=yidun-sentinel.nistest.service.163.org:80 | 弱 | application-dev.properties |
| 本地磁盘(recover) | recover.config.recoverFileDir=/home/appops/approot/data/file-recover,recover.config.appName=yidun-upload | 阻塞(需 PVC 可写) | application.properties |
| MySQL | 不需要——启动类 exclude = {DataSourceAutoConfiguration.class} | — | — |
| Apollo | 未发现 Apollo 配置 | — | — |
历史模块(web/api/management)依赖 MySQL(
yidun-website-baseDAO)+ Dubbo ZK,但当前根 pom 不构建它们。
六、启动参数与 Profile
yidun-website-upload的spring.profiles.active:application.properties默认dev;仓库含dev/test/online/gz-test及业务变体antispam-base64/antispam-url/antispam-gz-base64/antispam-gz-url/antispam-virginia-url-tx/antispam-xjp-url-tx(无private)- Dockerfile:
ENV JAVA_OPTS=-Xmx1024m -Xms1024m -XX:+UseG1GC -Dspring.profiles.active=private;构建时写入/app/version.txt - base image 与仓库:
private-registry.nis.netease.com/library/base-image:jdk17;DOCKER_REPOSITORY=private-registry.nis.netease.com/yidun,tagbase-250409 build.sh:MODEL_NAME=yidun-website/yidun-website-upload、cd ../..→mvn ... --pl yidun-website/yidun-website-upload→cd /home/yidun/antispam/antispam-private/yidun-website/yidun-website-upload(绝对路径) →docker buildx build --platform linux/amd64,linux/arm64 --push→source ~/.zsh_private && bash $k8s_script_path/podupdate.sh <image> <tag>- 后端历史模块 profile:
dev/test/online/pre(yml 配置);前端 Node 14.19.0 - 根 pom maven profile:
default/test/online(只改console-api.frontend.env,对 upload 无影响)
七、启动期踩坑
- 根 pom 只激活
common+upload:改yidun-website-web/-api/-management/-async等模块的代码,mvn install与buildAll.sh都不会编译它们。 - upload 指定
profile=private但无application-private.properties→ 落到application.properties(spring.profiles.active=dev,Kafka/Redis 指向 test 环境)。 netease.kafka.consumer.autoStartup默认 false:application.properties为false,application-dev.properties覆盖为true,但application-online.properties未覆盖 → online 消费者可能不自动启动,是“消息不消费”的高发点。@EnableRecoverComponent要求recoverFileDir可写:/home/appops/approot/data/file-recover必须挂 PVC,否则恢复组件写入失败。- upload 排除 DataSource 但仍依赖 Redis/ZK:
DataSourceAutoConfiguration被 exclude,别误以为“无 DB 依赖就不需要中间件”。 build.sh用绝对路径:cd /home/yidun/antispam/antispam-private/yidun-website/yidun-website-upload,构建机目录不一致时会cd到不存在的目录。- 前端产物依赖 management 打包:
yidun-website-front输出到../yidun-website-management/target/classes/static,只 build 前端不 build management,静态资源不会进 jar。 - upload 无 Web 端口:仅
spring-boot-starter(非 web),按 HTTP 探针探测会一直失败。
八、跨模块前置
- 上游触发方:
yidun-website-front(官网/管理后台前端 UI);外部系统回调与消息(NOS 对象存储回调、云信yunxin、Kafka CDCdts-sdk、云支付)。 - 下游被依赖方(本模块以 Dubbo/HTTP 消费):
antispam-business(产品/业务/目标配置)、antispam-bill(账单/计费/套餐/合同)、antispam-keyword、antispam-list、yidun-account、yidun-export(导出中心客户端);antispam-cms/yidun-message在 pom 有 facade 依赖但实际链路待复核。 - 基础设施前置(阻塞):
upload的 Kafka(多集群)、Redis Cluster、OSS/NOS 多桶、本地 recover 目录;历史模块另有 MySQL 与 Dubbo ZK。 - 构建期前置:
yidun-website-front需 Node 14.19.0;buildAll.sh在mvn install之后只对find . -name build.sh命中的目录打镜像(当前仅 upload)。