V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yoloMiss
V2EX  ›  Java

在 springboot 项目中不同局域网下限制由 @Configuration 或者 @Component 注解装配的类内的定时任务的是否可执行方法

  •  
  •   yoloMiss · 2023-10-08 21:11:55 +08:00 · 1288 次点击
    这是一个创建于 419 天前的主题,其中的信息可能已经有所发展或是发生改变。
    由题所示:
    现在碰到个这么个问题,有三个不同段的局域网,并且项目中有多个定时任务和 kafka 的消费端,三个网段中部署的是同一套代码,但是又不希望某几个定时任务( kafka 消费端)在其中一个或者两个网段中执行。有没有比较简洁或者其他的方式限制一下定时任务( kafka 消费)的执行。
    目前使用的是 ConditionalOnProperty 注解通过配置文件配置环境名区分做限制,但是这样每次部署新包后( k8s )都要手动改一下项目的 yaml 文件,这样不太优雅,希望大佬能给个更优雅省力的方案。
    第 1 条附言  ·  2023-10-09 19:34:54 +08:00
    补充一下:
    1.是三个不同 ip 段下的三个不同的集群,互不相通
    2.是集群中的一个 springboot 服务中的由 @Scheduled 注解管理的定时任务( kafka 消费端),当然定时任务和 kafka 消费端都是由 @Configuration 或者 @Component 注入的。
    12 条回复    2023-10-10 08:54:21 +08:00
    Dlin
        1
    Dlin  
       2023-10-08 22:39:46 +08:00 via Android
    没用过 kafka 。。你说的定时任务是指由 kafka 队列中在某个时间推入一条消息来触发的执行吗?
    guodongbin
        2
    guodongbin  
       2023-10-09 08:12:59 +08:00
    可以试试环境变量,不过判断逻辑需要改下
    litchinn
        3
    litchinn  
       2023-10-09 09:36:39 +08:00
    没有特别看懂你的环境

    你这三个局域网是同一个集群呢还是有三个集群呢
    我理解中你是一个集群,三个服务节点使用同一个 yaml 配置文件,你是如何通过修改 yaml 来指定某个节点读取到对应配置的呢? k8s 可以指定节点部署(虽然我觉得服务设计上不应该关心具体节点),但是读取的不都是同一个 yaml 吗

    我觉得可以 ConditionalOnProperty 中使用 hostname 来判断,havingValue 设置 hostname 的值
    dej2vu
        4
    dej2vu  
       2023-10-09 09:56:32 +08:00
    sl450282169
        5
    sl450282169  
       2023-10-09 11:41:47 +08:00
    可以实现 Import 接口,根据获取到的不同 ip 段(前提是你的三个局域网 ip 段不一样),来分别注入不同的 bean.或者简单点,直接手写一个 @bean,手动根据 ip 来返回不同的 bean
    newaccount
        6
    newaccount  
       2023-10-09 13:07:14 +08:00
    建议不要用,定时任务交给 cron 去调,不然以后负载均衡麻烦的很
    nothingistrue
        7
    nothingistrue  
       2023-10-09 13:18:04 +08:00
    大前提,如果你要区分同一个服务的不同节点实例,那么实例部署的时候当然要用不同的 bootstrap.yaml 。大前提,Spring Boot 和 Cloud 都不管部署(作为云服务的 Spring Cloud Foundry 另说)。

    Spring Cloud 是允许你定义 instanceId 的,代码里面根据 instanceId 做区分即可。但是如何在 bootstrap.yaml 中定义 instanceId ,这个是部署的事,要 k8s 或者脚本去负责。
    yoloMiss
        8
    yoloMiss  
    OP
       2023-10-09 19:13:40 +08:00
    @sl450282169 这个方案我想过,就是想在简单点那种,哈哈哈。最好通过简单配置就可以的。
    yoloMiss
        9
    yoloMiss  
    OP
       2023-10-09 19:15:04 +08:00
    @litchinn 三个不同的集群你说的这个 hostname 是怎么获取的呢,k8s 的知识我了解的很浅薄。
    yoloMiss
        10
    yoloMiss  
    OP
       2023-10-09 19:16:19 +08:00
    @newaccount 这个量级很小,完全为了业务做的妥协,暂时不需要考虑到负载均衡的问题。
    yoloMiss
        11
    yoloMiss  
    OP
       2023-10-09 19:19:23 +08:00
    @nothingistrue 是三个不同的集群,虽然是一套代码但是 yaml 文件也是分别独立的,最外层的 k8s 的 yaml 不允许我动,只能通过服务里的 yaml 做配置
    litchinn
        12
    litchinn  
       2023-10-10 08:54:21 +08:00
    spec.nodeName

    https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#use-pod-fields-as-values-for-environment-variables

    然后在 yaml 里就可以直接使用环境变量了,你可以试下,一个集群才适合这种,你是三个集群那这 3 个 node 的名称可能是一样的。

    3 个集群的话直接 configmap 配置个环境变量不就好了吗,不让改 k8s 里配置的 yaml ,添加一个总没问题吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1421 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:31 · PVG 01:31 · LAX 09:31 · JFK 12:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.