外观
antispam-business-audio — 点播语音内容安全
分层:业务层 | 部署单元:7 个(k8s 实部署 6 个) | 数据库:PostgreSQL(库
antispam) | base image:private-registry.nis.netease.com/library/base-image:jdk17(tagbase-250409)
一、模块定位与架构
模块是易盾「点播语音」内容安全产品的服务端:客户提交语音 URL/base64 后,它完成涉黄、涉政、涉暴、广告、语种、声纹等异步或同步反垃圾检测,输出结论回调、主动查询、存档归档与计量计费,承载点播语音反垃圾从提交到计费的权威判定与数据留存。
架构分层
- 协议层:
facade/http-check-api(异步提交/vX/audio/submit、同步检测/v1/audio/sync、检测回调/v1/audio/check)、facade/http-api(结果回调/查询/反馈/片段播放)、facade/dubbo-provider+facade/dubbo-check-provider(Dubbo 服务) - 逻辑层:
storage(消费 Kafka、执行检测与结果组装)、facade/dubbo-check-provider/checker、service/business - 数据层:
service/base(MyBatis DAO + Manager + 动态数据源)、service/business(ES/Redis/Kafka 封装)、scheduler(Elastic-Job) - 公共:
common、domain、facade/{dubbo-api,dubbo-check-api}、console/api、file
关键数据流(异步检测)
AudioSubmitController.submit→AbstractController.submitPool(Redis 限流/去重 + 缓冲池)- Kafka
Yidun_Antispam_NewAudioEvidence→AudioSubmitHandler.insertDb(入库,状态置TO_BE_CHECK) - Kafka
Yidun_Antispam_PreAudioSubmit→AudioEvidenceCheckService.audioCheck(调用 Dubbo 检测) AudioCallbackHandler组装结果并主动回调客户;同步计量/操作记录/ES 同步- 状态机:
AudioStatus(7 待检测 → 3 成功 / 4 失败)+AudioFrontStatusEnum(0 待检测 → 1 检测中 → 2 成功 → 3 失败)
二、可部署服务清单
| 部署单元目录 | artifactId | 镜像名 | 端口 | 服务类型 | 独立 Dockerfile | 是否进 kubernetes.yml |
|---|---|---|---|---|---|---|
facade/dubbo-provider | antispam-business-audio-facade-dubbo-provider | antispam-business-audio-dubbo-provider | 无 HTTP(Dubbo) | Dubbo Provider(查询/更新) | 有 | 是 |
facade/dubbo-check-provider | antispam-business-audio-facade-dubbo-check-provider | antispam-business-audio-dubbo-check-provider | 无 HTTP(Dubbo) | Dubbo Provider(checker 链) | 有 | 是 |
facade/http-check-api | antispam-business-audio-facade-http-check(无 -api 后缀) | antispam-business-audio-http-check-api | 8080(private) | HTTP 提交/同步检测 | 有 | 是 |
facade/http-api | antispam-business-audio-facade-http(无 -api 后缀) | antispam-business-audio-http-api | 8080(private) | HTTP 回调/查询/反馈 | 有 | 是 |
storage | antispam-business-audio-storage | antispam-business-audio-storage | 无 HTTP(Kafka 消费) | Kafka 消费落库 | 有 | 是 |
scheduler | antispam-business-audio-scheduler | antispam-business-audio-scheduler | 无 HTTP(定时任务) | Elastic-Job | 有 | 是 |
console/api | antispam-business-audio-console-api | — | — | 控制台后端骨架 | 无(不构建) | 否 |
common、domain、service/base、service/business、service、facade/dubbo-api、facade/dubbo-check-api、facade、file为非部署库模块。本项目无 async 单元、无 cdc 模块、无 console/web。
三、同模块启动顺序
facade/dubbo-check-provider— checker 检测链注册 ZK,是检测能力前置facade/dubbo-provider— 数据查询/更新 Dubbo 服务,内部持有 master/mirror 双数据源facade/http-check-api— 提交/同步检测入口,submitPool依赖 Redis 缓冲池facade/http-api— 回调/查询/反馈入口,依赖同库 DAO 与 Dubbo 提供方storage— 消费Yidun_Antispam_NewAudioEvidence/Yidun_Antispam_PreAudioSubmit,需 Kafka/Redis/DB 就绪scheduler— Elastic-Job 定时任务;依赖 ZK、DB、OSS;晚于 storage 更安全
理由:Dubbo 提供方必须先于消费方;storage 消费 http-check-api 写入的 topic,Redis 缓冲池 key(antispam-business-text-deal-* 之外的本模块 key)与 OSS 桶须先可用。
四、逐服务启动逻辑
facade/http-check-api
- 启动类:
com.netease.is.antispam.audio.facade.http.HttpCheckApplication(facade/http-check-api/.../HttpCheckApplication.java) - exclude:
DataSourceAutoConfiguration @Enable*:@EnableBusinessClient、@EnableRateLimiter、@EnableRecoverComponent、@EnableI18nComponent、@EnableApolloConfig- 配置类:
configuration/FacadeHttpConfiguration(同包 sub 包,被@SpringBootApplication默认扫描),@Configuration + @ComponentScan({"com.netease.is.antispam.audio.facade.http.controller","...audio.redis","...audio.kafka","...audio.facade.http.zookeeper","...audio.recover","...audio.component","...audio.integration","...audio.helper"}) main():无自定义- 钩子:
AudioModelCacheService @PostConstruct、RedisCommonService @PostConstruct、TEXT/Audio限流组件(@PostConstruct) - Apollo:
app.id=antispam-audio_http-check,namespaces=application,antispam-audiovideo_common,apollo.cache-dir=./apollo/cache,apollo.meta=http://yd-apollo-config.nistest.netease.com
facade/http-api
- 启动类:
com.netease.is.antispam.audio.facade.http.HttpApplication(facade/http-api/.../HttpApplication.java) @SpringBootApplication(无 exclude);@EnableOssClient、@EnableCdcDataSubscribe、@EnableBusinessClient、@EnableRateLimiter、@EnableDistributeId、@EnableRecoverComponent、@EnableI18nComponent、@PropertySources({@PropertySource("classpath:audio-oss.properties")})- 配置类:
configuration/FacadeHttpConfiguration(@ComponentScan同 http-check-api 的 controller/redis/kafka/…)+@MapperScan("com.netease.is.antispam.audio.dao") main():无自定义;Apollo:app.id=antispam-audio_http
facade/dubbo-provider
- 启动类:
com.netease.is.antispam.business.audio.facade.dubbo.DubboApplication - exclude:
DataSourceAutoConfiguration @EnableAspectJAutoProxy、@EnableFacadeAutoConfiguration(→FacadeConfiguration:@ComponentScan({"…audio.service","…audio.manager",…})+@MapperScan)、@EnableCdcDataSubscribe、@EnableOssClient、@PropertySources({audio-oss.properties})、@EnableBusinessClient、@EnableDistributeId、@EnableRecoverComponent- 数据源:
spring.datasource.master.*/spring.datasource.mirror.*(动态数据源) main():无自定义;Apollo:app.id=antispam-audio_dubbo
facade/dubbo-check-provider
- 启动类:
com.netease.is.antispam.business.audio.facade.check.dubbo.DubboCheckApplication - exclude:
DataSourceAutoConfiguration;@EnableAspectJAutoProxy、@EnableFacadeAutoConfiguration(→FacadeConfiguration:@ComponentScan({"…facade.check.dubbo.checker.service","…facade.check.dubbo.provider","…facade.check.dubbo.zookeeper","…audio.component","…audio.kafka","…audio.redis","…audio.recover"}))、@EnableConfigurationProperties({CheckerConfig.class})、@EnableBusinessClient、@EnableRecoverComponent、@EnableApolloConfig main():无自定义;钩子:YidunKafkaNoDelayProducer @PostConstruct- Apollo:
app.id=antispam-audio_dubbo-check
storage
- 启动类:
com.netease.is.antispam.audio.storage.StorageApplication @SpringBootApplication;@EnableStorageAutoConfiguration(→StorageConfiguration:@ComponentScan({"…audio.storage.consumer","…audio.manager","…audio.component","…audio.storage.zookeeper","…audio.kafka","…audio.service","…audio.recover","…components.callback","…audio.redis","…audio.storage.recover","…audio.integration","…audio.es"})+@MapperScan("…audio.dao"))、@EnableCdcDataSubscribe、@EnableBusinessClient、@EnableRateLimiter、@EnableDistributeId、@EnableRecoverComponent、@EnableOssClient、@PropertySources({audio-oss.properties})、@EnableApolloConfig- Kafka:平台自研
@KafkaConsumer;topic 常量见common/.../constant/AudioKafkaTopic.java main():无自定义;钩子:YidunQosApplication(doOffline()pause Kafka 容器并 sleep)、AudioEvidenceCheckService @PostConstruct- Apollo:
app.id=antispam-audio_storage
scheduler
- 启动类:
com.netease.is.antispam.audio.scheduler.SchedulerApplication @SpringBootApplication;@EnableScheduling、@EnableCdcDataSubscribe、@EnableSchedulerAutoConfiguration(→SchedulerConfiguration:@ComponentScan({"…audio.manager","…audio.component","…audio.scheduler.zookeeper","…audio.service","…audio.redis","…audio.scheduler.tasks","…audio.recover","…audio.scheduler.service","…audio.es","…audio.kafka","…components.callback"})+@MapperScan("…audio.dao"))、@EnableElasticJob、@EnableDistributeId、@EnableOssClient、@EnableBusinessClient、@EnableRecoverComponent、@EnableApolloConfigmain():无自定义;钩子:YidunQosApplication、AudioReviseTask/CustomModelVerifyTaskWorker/DealingCountReviseWorker @PostConstruct;任务类用@ElasticJobConf- Apollo:
app.id=antispam-audio_scheduler
console/api
- 启动类:
com.netease.is.antispam.audio.console.api.ConsoleApplication(ConsoleConfiguration/SwaggerConfiguration) - 无 Dockerfile、不在 kubernetes.yml
共通:全部启动类
main()无业务自定义逻辑,仅SpringApplication.run。
五、启动前置依赖
| 依赖 | 配置键/地址 | 阻塞 or 弱依赖 | 配置文件 |
|---|---|---|---|
| ZooKeeper | zookeeper://zk-0.zookeeper.yidun-infra:2181,group /yidun/antispam/online-new/yidun-antispam-dubbo;zookeeper.config.root.path=/netease-antispam/online/config | 阻塞 | application-private.properties |
| PostgreSQL | jdbc:postgresql://10.104.68.141:5432/antispam(org.postgresql.Driver,user postgres);dubbo-provider 另配 master/mirror | 阻塞(http-api/dubbo-provider/storage/scheduler) | application-private.properties |
| Kafka | kafka-yidun-{0,1,2}.kafka-yidun-headless.yidun-infra:9092 | 阻塞(http-check-api/storage/dubbo-check) | application-private.properties |
| Redis Sentinel | redis0-redis-ha.yidun-infra.svc:26379,master master01 | 阻塞(限流/缓冲池) | application-private.properties |
| OSS | audio-oss.properties(@PropertySource 显式引用) | 弱依赖(归档/片段) | classpath:audio-oss.properties |
| Elasticsearch | elasticsearch.multiple.*(多实例) | 弱依赖 | application-private.properties |
| Apollo | app.id=antispam-audio_*,apollo.cache-dir=./apollo/cache | 阻塞 | application.properties |
| mplatform-event | @EnableEventClient(部分单元) | 弱依赖 | — |
六、启动参数与 Profile
-Dspring.profiles.active:默认dev;Dockerfile 与 k8s 覆盖为private;仍有test/online/ 各区域 profile 文件(frankfurt/tokyo/virginia/guizhou/tianjin/beijing/jiande/xjp 等)- Maven profile:
buildAll.sh以mvn clean install -P private后遍历各build.sh -c false -p false -e private;模块build.sh -e <env> - JAVA_OPTS(Dockerfile):
-Xmx1024m -Xms1024m -XX:+UseG1GC -Dspring.profiles.active=private - JAVA_OPTS(k8s 覆写):
-Xmx1024m -Xms1024m -XX:+UseG1GC -Dspring.profiles.active=private(所有 6 个 Deployment,注意双空格) - base image:
private-registry.nis.netease.com/library/base-image:jdk17;DockerfileENV APP_NAME=antispam-business-audio-facade-<unit>;build.sh 推private-registry.nis.netease.com/yidun/antispam-business-audio-<unit>;k8s 拉private-registry.yidun.internal/yidun/antispam-business-audio-<unit>:1.0.0.private - build.sh 关键参数:
-e/-r/-t(默认base-250409)/-c/-p;docker buildx build --platform linux/amd64,linux/arm64 --push - k8s 通用:namespace
yidun,replicas=2,env 注入ENABLE_SKYWALKING=true、SW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-skywalking-oap.yidun-infra.svc:11800
七、启动期踩坑
- artifactId 无
-api后缀:http-api =antispam-business-audio-facade-http、http-check-api =antispam-business-audio-facade-http-check;用-am构建时若按-api猜模块名会找不到。 DubboApplication/DubboCheckApplication/HttpCheckApplication均exclude=DataSourceAutoConfiguration,数据源靠master/mirror动态数据源装配;http-check-api 甚至不引数据源,误配 DB 反而更糟。- 实际 private 环境数据库是 PostgreSQL(
org.postgresql.Driver,POC10.104.68.141:5432),与 CLAUDE.md/概览里写的 MySQL 不一致;分页/方言写 SQL 时以 properties 为准。 - 证据处理链大量
@PostConstruct(AudioEvidenceCheckService、AudioModelCacheService、YidunKafkaNoDelayProducer等),Redis/Kafka 未就绪会在启动期直接抛错。 storage/scheduler的YidunQosApplication.doOffline()会 pause Kafka 容器并 sleep,k8sterminationGracePeriodSeconds必须大于该值。@EnableApolloConfig单元(http-check/dubbo-check/storage/scheduler)在 Apollo 不可用时启动受阻;apollo.meta在基础application.properties中硬编码为yd-apollo-config.nistest.netease.com,私有化部署需覆写。http-check-api的FacadeHttpConfiguration与http-api同名、dubbo-provider与dubbo-check-provider的FacadeConfiguration同名,排查 bean 冲突时注意区分包路径。@EnableDistributeId依赖 ZKdistribute.id.zookeeperHost与 namespaceantispam-business-audio;ZK 抖动会导致自增 ID 获取失败。
八、跨模块前置
antispam-business:ProductCache/TargetCache/SecretInfoCache/TargetConfigCache/LabelInfoCache全部来自 business client(@EnableBusinessClient)——硬前置antispam-bill:REQUEST_STAT、Antispam_Bill_CensorStat计量消息(运行期)antispam-list:IP 区域解析IpRegionDetail、名单检测antispam-keyword/antispam-rule:Dubbo 检测链 checker- 共享组件
components:KafkaSender、YidunLogger、YidunQosApplication、@KafkaConsumer等 - 基础设施:ZooKeeper、Kafka、Redis Sentinel、PostgreSQL、Elasticsearch、Apollo、OSS