Solon

分布式还是单体?同时可有

</> markdown

引言:在网上经常会看到一个项目,分单体版、微服务版。

对于具体的开发来讲,管你是分布式?还是单体?都只是对一些接口的调用。当接口为纯本地实现时,则可为单体;当接口实现有分布式中间件调用时,则为分布式。

Solon Cloud (点此处学习)是在 Solon 的基础上构建的微服务开发套件(微服务,即一组分布式开发的架构模式)。以标准与规范为核心,构建丰富的开放生态。为微服务开发提供了一个通用防腐层(即不用改代码,切换配置即可更换组件)。

它有很多的实现,其中就有纯本地的实现。比如:

  • local-solon-cloud-plugin,是实现 solon cloud 绝大数接口的纯本地实现方案(用于实现单体)
  • water-solon-cloud-plugin,是实现 solon cloud 绝大数接口的分布式实现方案(用于实现分布式)

也可以自己实现,对接公司已有平台。

1、同时支持分布式或单体的设计

  • 方案一:pom.xml 引入所有的包,通过环境参数动态切换。参考示例:

https://gitee.com/noear/solon-examples/tree/dev/9.Solon-Cloud/demo9901-cloud_or_single1

  • 方案二:通过 maven 的 profile 定义多套配置,打包时选一个。参考示例:

https://gitee.com/noear/solon-examples/tree/dev/9.Solon-Cloud/demo9902-cloud_or_single2

2、方案二 pom.xml 关键内容预览

    <dependencies>
       <!-- 使用 solon cloud 接口开发各种能力 -->
        <dependency>
            <groupId>org.noear</groupId>
            <artifactId>solon.cloud</artifactId>
        </dependency>
    </dependencies>
    
    <profiles>
        <profile>
            <id>single</id>
            <dependencies>
                <!-- solon cloud 接口的本地实现(特性参考:https://solon.noear.org/article/354) -->
                <dependency>
                    <groupId>org.noear</groupId>
                    <artifactId>local-solon-cloud-plugin</artifactId>
                </dependency>
                <!-- 增加本地日志 -->
                <dependency>
                    <groupId>org.noear</groupId>
                    <artifactId>logback-solon-plugin</artifactId>
                </dependency>
            </dependencies>
            <properties>
                <project.env>single</project.env>
            </properties>
        </profile>
        <profile>
            <id>cloud</id>
            <dependencies>
                <!-- solon cloud 接口的分布式实现,或者引入别的 cloud 插件(特性参考:https://solon.noear.org/article/family-water-solon-plugin) -->
                <!-- 它带了云端日志 -->
                <dependency>
                    <groupId>org.noear</groupId>
                    <artifactId>water-solon-cloud-plugin</artifactId>
                </dependency>
            </dependencies>
            <properties>
                <project.env>cloud</project.env>
            </properties>
        </profile>
    </profiles>

    <build>
        <finalName>${project.artifactId}</finalName>

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>