我正在使用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 文件中的配置选择要选择的控制器吗?
答案 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);
}
}