Eurekaでいくつかのマイクロサービスが発見されました。それらのほとんどはいくつかのAPIを提供します。そして、実はズールプロキシである「ゲートウェイサービス」という「エッジ」サービスがあります。問題は、Webアプリケーションがあるということです。長い間ゲートウェイサービスでホストされていたので問題ありませんでした。しかし今、私はこのクライアントをゲートウェイの背後にある別のサービスでホストする必要があります。問題じゃない。新しいサービスを作成し、そこに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/
のようなルートパスからWebアプリケーションにアクセスできるようにする必要があります。しかし、今のところ、完全に間違っているhttp://app.com/api/
でしかアクセスできません。
私の仕事は:
/api
プレフィックスを残すことも非常に重要です。ZuulFilter
を実装しようとしました。ただし、ルートパスには何の影響も与えず、上記のルートと一致する場合にのみ実行されるようです。
どうすればこれを機能させることができますか?
[〜#〜] update [〜#〜]:ZuulFilter
で少し成功しました。私はそれを機能させました。 Zuulの構成は次のとおりです。
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フィルターチェーンにマップすることができます( ドキュメントで説明 )。ここで説明する他のすべてのルートは、/api
がまったくないように設定されています。次のようなサービスにアクセスできます:http://app.com/requests
例:リクエストサービス用。 ZuulFilter
は、プロパティに記述されているすべてのリクエストに対してチェックを実行しますが、リクエストされたURIが/api
で始まる場合にのみ実行され、パスに/api
がないのと同じ方法でこのリクエストをリダイレクトします。
それは本当に機能します。しかし、/api
プレフィックスのないエンドポイントがまだゲートウェイサービスに残っているため、このソリューションはまだ好きではありません。誰かがそれを改善する方法を知っているかもしれませんか?
私は次のことをします:
zuul.prefix
プロパティを削除します。to all of your
zuul.routes。*。path`プロパティのプレフィックスを付加します。app:
path: /**
stripPrefix: false
(3)ここでのルートの順序が重要であるため、非常に重要です。これは、着信要求がルートが一致するかどうかを評価する順序です。プロパティファイルでは順序が保持されない可能性があるため、yamlでこれを行うことも重要です( documentation による)。