一个应用,需要有两种形态,一种单机,一种分布式? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gzk329
V2EX    Java

一个应用,需要有两种形态,一种单机,一种分布式?

  •  1
     
  •   gzk329 2023-05-26 09:41:35 +08:00 3102 次点击
    这是一个创建于 868 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有什么案例可以参考吗?目前已经有一个版本了,想好好设计一下。
    这个应用基于 Springboot 开发,想做一个类似 SPI 注解,有两个 Scope ,一个 single ,一个 distribute ,我看 dubbo 就有这种设计?刚看。一年不到经验,刚入手这个项目。

    10 条回复    2023-05-31 17:06:52 +08:00
    Dmumuxi
        1
    Dmumuxi  
       2023-05-26 10:04:49 +08:00
    从打包方式和部署形态入手?单机就都打成一个 jar ,分布式就分模模块打 jar
    bugmakerxs
        2
    bugmakerxs  
       2023-05-26 10:17:30 +08:00
    我们目前也有类似需求。我的想法是每个服务都需要将 controller 、service 、api 分成不同 module ,代码分为 AController/AService/AApi BController/BService/BApi ,其中 AApi 和 BApi 根据配置判断是走反射调用本地方法还是 http 调用远程方法;
    如果要作为分布式应用,A 服务打包形式为 AController+AService+BApi ; B 服务打包形式为 BController+BService+AApi ,走远程调用;
    如果要作为单机应用,打包形式为 AController+AService+BService+AApi+BApi ,api 模块通过反射调用 AService 或者 BService 中的方法。
    pangdundun996
        3
    pangdundun996  
       2023-05-26 10:22:06 +08:00
    没懂,单机 /分布式只是部署方式,跟代码有什么关系?
    pangdundun996
        4
    pangdundun996  
       2023-05-26 10:24:42 +08:00
    @bugmakerxs 如果是这种要求的话直接分 module 打包就行,dubbo 是支持本地 jvm 调用的
    goinghugh
        5
    goinghugh  
       2023-05-26 11:59:12 +08:00
    你想要的应该是模块化以及合并部署的能力,蚂蚁的 sofa 有类似的能力; dubbo 能解决调用的问题,模块化估计要自己实现
    IvanLi127
        6
    IvanLi127  
       2023-05-26 13:44:03 +08:00 via Android
    分布式的项目部署在同一个机子上不就是单机了?还是说单体?
    nothingistrue
        8
    nothingistrue  
       2023-05-26 14:51:42 +08:00
    如果是单纯的多节点负载均衡,那单机跟分布式没多大区别,事实上这里压根也就不是分布式。

    如果是一个服务,既能单独提供完整单机服务,又能作为服务节点插入到另一个微服务集群中。那么用 Spring Cloud (原生那个,不要用混乱的 Spring Cloud Alibaba )就够了。只要你不搞配置中心,那么,如果禁用了服务注册,或者说连接不上注册中心,那每个服务都是独立的完整服务。如果启用了服务注册,同时又在防火墙上禁用了单个服务的直接访问,那么就没有独立服务,只有微服务集群了。

    不要看 Dubbo ,这货本质上是 Java 远程调用框架,不是分布式协作框架。
    xiang0818
        9
    xiang0818  
       2023-05-26 17:47:04 +08:00
    1 年经验,你先理解下什么是分布式吧。
    Gonlandooo
        10
    Gonlandooo  
       2023-05-31 17:06:52 +08:00
    这个很简单,假设你的项目 Project 有 A 、B 两个模块、你需要他们既可以单机部署,也可以微服务部署
    1 、你需要在 Project 项目下分三个包,分别是 A 、B 、Single ,

    2 、A 、B 是你的微服务包每个包需要包含 core 、starter 两个包,这两个包的依赖关系是 starter 依赖 core 包
    Single 包是你的单体包,只包含一个 starter ,依赖 A 和 B 的 core 包

    正常情况下 starter 包里只有一一个启动类,所有业务逻辑在 core 包里正常写。

    当你需要 A 服务调用 B 服务时,你就新增一个 service ,这个 service 有两个实现:
    单体实现写在 Single 包的 starter 里面,直接注入 B 的 core 包里的对应类进行调用
    微服务实现写在 A 的 starter 包里面,调用 B 的 feign
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3688 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 52ms UTC 10:20 PVG 18:20 LAX 03:20 JFK 06:20
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86