我正在Spring Spring中編寫服務,從Spring雲中獲取它們的配置。這些服務是多租戶,租戶基於主機名。根據主機名加載Bean
什麼我現在已經是
public class MyController {
@Autowired
public MyController(MyServiceFactory factory) {
...
}
@RequestMapping("some/path/{id}")
ResponseEntity<SomeEntity> getSomeEntity(@RequestHeader header, @PathVariable id) {
return factory.getMyService(header).handle(id);
}
}
其中MyServiceFactory看起來像......
public class MyServiceFactory {
private final HashMap<String, MyService> serviceRegistry = new HashMap<>();
public MyService getMyService(String key) {
return serviceRegistry.get(key);
}
MyServiceFactory withService(String key, MyService service) {
this.serviceRegistry.put(key, service);
return this;
}
}
然後在配置文件中
@Configuration
public ServiceFactoryConfiguration {
@Bean
public MyServiceFactory getMyServiceFactory() {
return new MyServiceFactory()
.withService("client1", new MyService1())
.withService("client2", new MyService2());
}
}
雖然現在我有什麼工作,我不喜歡我需要爲我的控制器可能具有的每個依賴項創建一個工廠。我想有我的代碼是這個樣子......
public class MyController {
@Autowired
public MyController(MyService service) {
...
}
@RequestMapping("some/path/{id}")
ResponseEntity<SomeEntity> getSomeEntity(@PathVariable id) {
return service.handle(id);
}
}
與像
@Configuration
public class MyServiceConfiguration() {
@Bean
@Qualifier("Client1")
public MyService getMyService1() {
return new MyService1();
}
@Bean
@Qualifier("Client2")
public MyService getMyService2() {
return new MyService2();
}
}
我可以得到我想,如果我在使用配置文件寫代碼的配置文件應用程序啓動。但我希望有很多不同的DNS記錄指向同一個(池)實例,並且有一個實例能夠處理針對不同客戶端的請求。我希望能夠根據每個請求換出配置文件。
這可能嗎?
不要......創建一個代理'MyService'並根據租戶使用正確的。我們使用這種方法即時切換數據源。我在這裏發佈了博客(https://mdeinum.wordpress.com/2007/01/05/one-application-per-client-database/),代碼是[here](https://github.com)/mdeinum /彈簧utils的)。 (我正在努力將其發展到自己的項目中)。它提供的是在運行時切換任何bean的能力,您可以使用您需要的或者默認的bean。 –
爲什麼不使用彈簧配置文件,每個主機一個彈出配置文件,然後在啓動時將主機名作爲配置文件名稱傳遞。 – cjstehno