私はいくつかのマイクロサービスをユーレカで発見しました。それらのほとんどはAPIを提供しています。 そして私は実際にZuulプロキシである "ゲートウェイサービス"と呼ばれる "エッジ"サービスを持っています。 問題は、Webアプリケーションがあることです。それは長い間ゲートウェイサービスによってホストされていたし、それに問題はなかった。 今はゲートウェイの背後にある別のサービスでこのクライアントをホストする必要があります。 これは問題ではありません。私は新しいサービスを作成し、そこにWebアプリケーションを配置しました。しかし、事は、ゲートウェイサービスのZuulが、私はそう、このhttp://app.com/
ようなルートパスからWebアプリケーションにアクセスすることができ、そのユーザの操作を行う必要がありルートパスからZuulルート
zuul:
ignoredServices: '*'
prefix: /api
sensitiveHeaders: Cookie, Set-Cookie
routes:
config-service:
path: /conf/**
serviceId: config-service
security-service:
path: /security/**
serviceId: security-service
stripPrefix: false
request-service:
path: /requests/**
stripPrefix: false
次の構成を有することです。 しかし、今は私はそれが完全に間違っているhttp://app.com/api/
によってのみそれにアクセスすることができます。
私の仕事は、次のとおりです。
- ルートパスから利用できる他のサービスでホストされているWebアプリケーションを作成します。
- 他のすべてのサービスでは
/api
という接頭辞が残っていることも非常に重要です。
私はZuulFilter
を実装しようとしました。しかし、ルートパスでは何もしないように見え、上記のルートと一致する場合にのみ実行されます。
どうすればこの作品を作成できますか?
更新日:ZuulFilter
で少し成功しました。私はそれを仕事にしました。
zuul:
ignoredServices: '*'
sensitiveHeaders: Cookie, Set-Cookie
routes:
api: /api/**
config-service:
path: /conf/**
serviceId: config-service
security-service:
path: /security/**
serviceId: security-service
stripPrefix: false
request-service:
path: /requests/**
stripPrefix: false
frontend-host-service:
path: /**
そしてZuulFilter
自体
@Bean
public ZuulFilter apiPrefixStrip(RouteLocator routeLocator) {
return new ZuulFilter() {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
return context.getRequest().getRequestURI().startsWith("/api");
}
@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
String path = context.getRequest().getRequestURI();
Route route = routeLocator.getMatchingRoute(path.substring(4));
if (route != null) {
context.put("proxy",route.getId());
context.put("requestURI", route.getPath());
context.set("serviceId", route.getLocation());
}
return null;
}
};
}
どのようにこの作品: 実際に何もしないプロパティzuul.routes.api=/api/**
がある。ここZuulの構成があります。一致したすべてのパスをZuulフィルタチェーン(described in documentation)にマップすることができます。ここに記載されている他のルートはすべて/api
のように設定されています。このようなサービスに達することができます:http://app.com/requests
要求サービスのために。 ZuulFilter
は、プロパティに記述されているすべての要求に対してチェックを実行しますが、要求されたURIが/api
で始まり、パスに/api
のようにこの要求を同じ方法でリダイレクトする場合にのみ実行されます。
実際に動作します。しかし、私はまだ/api
プレフィックスなしのエンドポイントがゲートウェイサービスに残っているため、この解決策は嫌です。誰でもそれを改善する方法を知っているかもしれませんか?
ありがとうございました。私が最初に考えていたこの種の解決策。そして、私はこれがうまくいくと確信しています。しかし、私は、各ルートに対して明示的に ''/api''プレフィックスを書くのはちょっと混乱していると思います。ほとんどの場合、私が実際に投稿した設定には50以上のルートが含まれているので、私の状況には十分ではありません:)この細部は私の言葉を忘れていました。しかし、これはいくつかのルートを持つプロキシには十分適しています。 –
あなたは50以上のルートの大部分/すべてを持っているかもしれませんが、正確なルートが各サービスにどのようなものかを明確に示唆しています。また、 '/ api'が前に付いていない他のサービスをサポートするための非常に柔軟なソリューションです。 –