构建Context(消费者客户端)特定的spring应用程序

时间:2017-10-18 12:05:06

标签: spring grails spring-boot design-patterns

我正在使用grails 3.3.0和spring-boot 1.5.6构建spring-boot + grails应用程序.RELEASE

我有控制器为消费者客户端应用程序提供JSON数据。

ExampleController.groovy

class ExampleCotnroller {

    def endpointServerJosn(){
    }
}

最近引入了另外一个消费者,它期望类似的JSON数据,但来自不同的来源。

所以我在 application.yml another.client = true中添加了一个标志,并将我的控制器修改为:

更新了 ExampleController.groovy

class ExampleCotnroller {

    def endpointServerJosn(){
        if(another.client){
            //server data from this client's source
        }else{
            //server data from other client's source
        }
    }
}

但我期待更多的客户端,这会让我的控制器陷入困境,因为我没有发现我的解决方案可以通过设计进行扩展。这里每个客户端都有自己的从属API控制器来获取数据。

  

客户端1发送请求 - > master(我的控制器)拦截,调用一个   与客户端相关的更多从属API,获取数据并聚合它   并发回数据

     

类似地,客户端2发送请求 - >主人(我的控制者)   拦截,调用与客户端2相关的一个或多个从属API

我在考虑拥有一个抽象的控制器,如:

class AbstractApplicationController{

        def endpointServerJson();
}

class FirstCilentController extends AbstractApplicationController {
}

class SecondClientController extends AbstractApplicationController {
}

是否有可能通过上述设计实现可扩展的解决方案?应用程序可以根据外部yml application.yml 文件中的配置选择要选择的控制器吗?

1 个答案:

答案 0 :(得分:0)

在我看来,你正在描述Multitenancy的问题。来自维基百科:

  

术语“软件多租户”指的是一种软件架构,其中单个软件实例在服务器上运行,服务多个 [ ...] 用户,他们共享具有软件实例特定权限的公共访问权限。

来源:https://en.wikipedia.org/wiki/Multitenancy

我建议你在实施更多代码之前,开始详细研究多租户的概念。有很多资源,但这个链接是一个很好的介绍:

https://fizzylogic.nl/2016/01/24/make-your-spring-boot-application-multi-tenant-aware-in-2-steps/

最后,如果你确实受到了可怕的时间限制。在我看来,您应该在控制器下创建一个客户机无关的数据访问层或服务集,它们提供检索数据的方法并接受客户机标识符作为参数。例如:

class ExampleCotnroller {

    def endpointServerJosn() {
        return clientDataService.getData(clientID);
    }

}