java - Spring boot Multi-Tenancy 代码,具有隔离的客户端特定隔离

标签 java maven spring-boot

我正在构建一个应支持多个客户端的 Spring Boot 应用程序。目前,我在父项目中定义了通用逻辑,并在子项目中进行了自定义。在某些情况下,客户可能会要求额外的功能,或者可能需要对使用 @Primary 在此子项中定义的现有功能进行额外的自定义。注解。 这里的想法是将核心逻辑和自定义分开。

目前,我们正在子项目中为不同的客户创建不同的分支,并且在那些不是最佳解决方案的项目中进行自定义。随着客户数量的增加,分支机构的数量也会增加。

我想要一个代码,我将在其中定义所有客户端的所有自定义,并且每个客户端可用的功能应该是可控的。

我知道这可以通过使用配置文件来实现。但即使在这种情况下,我仍然必须为所有组件注释定义配置文件,这很麻烦。

所以最近我想到了使用 @Componentscan 的想法使用属性来控制具有以下目录结构的客户端逻辑。

父级:

.
└── src
    └── main
        └── java
            ├── com.test.parent.controller
            ├── com.test.parent.dao
            └── com.test.parent.service

子级:

.
└── src
    └── main
        └── java
            ├── com.test.child.client1.controller
            ├── com.test.child.client1.dao
            ├── com.test.child.client1.service
            ├── com.test.child.client2.controller
            ├── com.test.child.client2.dao
            ├── com.test.child.client2.service
            ├── com.test.child.client3.controller
            ├── com.test.child.client3.dao
            └── com.test.child.client3.service

Mainclass.java

package com.test.child;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = { "com.test.parent.*","com.test.child.${clientname:default}.*" })
public class MainClass {

    public static void main(String[] args) {
        SpringApplication.run(MainClass.class, args);
    }

}

但即使如此,在这种情况下,我也通过使用属性 clientname 来控制客户端自定义。并且通过传递其他客户的名称存在暴露其他客户的定制的风险。

  • 是否可以控制包裹或 mvn package期间要包含或排除的业务逻辑或mvn install本身前提是代码保持单一? 即在构建时而不是运行时隔离逻辑。
  • 似乎 maven-compiler-plugin插件通过指定 includes 提供此类功能以及pattern 。但如何在 spring-boot-maven-plugin 中做同样的事情?这样构建就可以在mvn package期间通过传递属性来控制。或mvn install

所以基本上我正在寻找类似过滤器的东西,它支持在 mvn 构建生命周期期间包含/排除包/代码的模式。

不确定<resources><resource>..<\resources><\resource>可用于过滤除资源之外的代码。

最佳答案

The Spring Boot auto-configuration mechanism能够在运行时自动检测类路径上的自动配置类并将它们导入到上下文中(有时使用条件来决定是否这样做)。

就您而言,听起来一个可靠的方法是将您的常规 Spring Boot 应用程序编写并打包为单个共享 jar。然后每个客户端的特定代码将存在于声明 Client1AutoConfiguration 的“插件”jar 中。 ;启动应用程序时,tell Boot to also load the plugin jar .

如果您的主 jar 中有默认值需要在插件中覆盖,请使用 @ConditionalOnMissingBean (请参阅 DataSourceAutoConfiguration 作为一个很好的示例)并使用 @AutoConfigureBefore(MainAutoConfiguration.class) 注释您的插件自动配置类.

关于java - Spring boot Multi-Tenancy 代码,具有隔离的客户端特定隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56456328/

相关文章:

java - 可以传递一个 json 对象来获取我正在尝试的请求,但我错过了以下错误

java - 每次要使用字符串时都必须将其解析为 double 吗?

java - 进程显然从未在 C :\Users\<user>\. jenkins\workspace\<jenkin_project>@tmp\durable-d3479d32 脚本返回退出代码 -2 中启动

在 header 中找不到 Spring Boot 安全性 x-auth-token

java - 在 mysql 上使用 docker-compose 时遇到问题

java - libgdx的gradlew在Fedora中不起作用

java - enableHiveSupport 在 java spark 代码中抛出错误

java - 如何使用 Maven Cargo 在 Glassfish 中设置配置(JDBC 领域或 Java 邮件 session )?

java - Spring STS : How to automatically create a webpage for all API methods, 就像 .Net 一样

java - 如何从 xml 文档中提取整个 xml 元素