マルチテナントサポートを追加しようとしている Eureka、Zuul、および FeignClient を使用して Spring Cloud プロジェクト (Spring Boot 1.3.1 を使用した Brixton.M4) を構築しています (テナントはサブドメイン: tenant1.myservice.com で識別されます)。そうするために、Feignを介してサービスから他のサービスに転送されるリクエストに沿って元のサブドメインをどうにかして渡したいのですが、それを行う正しい方法を見つけることができないようです.
私が持っているのは、@ FeignClient を呼び出してバックエンドと通信する @RestController を公開するクライアントです。バックエンドは、独自の @RestController を介してサーバー操作をクライアントに公開します。
サーバー上の @RestController と同じインターフェースを使用する @FeignClient :
@FeignClient(name = "product")
public interface ProductService extends IProductService {
}
私が現在やろうとしているのは、 RequestInterceptor にヘッダーを設定することです:
@Component
public class MultiTenancyRequestInterceptor implements RequestInterceptor {
private CurrentTenantProvider currentTenantProvider;
@Autowired
public MultiTenancyRequestInterceptor(CurrentTenantProvider currentTenantProvider) {
this.currentTenantProvider = currentTenantProvider;
}
@Override
public void apply(RequestTemplate template) {
try {
template.header("TENANT", currentTenantProvider.getTenant());
} catch (Exception e) {
// "oops"
}
}
}
私のプロバイダー クラスは、リクエスト/セッション スコープ Bean を注入しようとしている単純なコンポーネントです。
@Component
public class CurrentTenantProvider {
@Autowired
private CurrentTenant currentTenant;
//...
}
Bean(セッションとリクエストスコープの両方を試しました):
@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public CurrentTenant currentTenant() {
return new CurrentTenant();
}
サーバーでは、ヘッダー値をキャッチすることになっている Hibernate マルチテナント プロバイダーを使用し、それを使用して接続する DB を定義します。
@Autowired
private HttpServletRequest httpRequest;
@Override
public String resolveCurrentTenantIdentifier() {
return httpRequest.getHeader("TENANT");
}
サーバーへの Feign 呼び出しが別のスレッドで着信要求の範囲外で行われているように見えるため、その値を渡す方法がわかりません。
RequestInterceptor でテナント値をハードコードすると、すべて正常に機能するので、残りが適切に機能していることがわかります。
Zuulの「X-Forwaded-For」ヘッダーに関する他の多くの投稿も見ましたが、サーバーで受信したリクエストでそれを見つけることができません。ホスト名を次のリクエストに渡すためにZuulFilterを追加しようとしましたが、クライアントへの元のリクエストがZuulFilterによって取得され、追加できますが、偽のリクエストがバックエンドサービスに送信された場合でも追加できませんそれを zuul にマップします (それが意図されていると思いますか?)。
次のステップが何であるかはよくわかりませんが、いくつかの提案をいただければ幸いです。