2016-08-11 4 views
0

Spring Cloud Netflixを運用環境に移行しようとしています。今のところ、ビジネスロジックのエラー処理に関する問題が発生しています。Spring Cloud Netflix:Feignによるリモートサービスのエラー処理

私たちはHTTP RESTクライアントとしてFeignを使用しています。マイクロサービスAは、異なるJVM(または物理サーバ)に配備されたマイクロサービスBを呼び出す必要があります。マイクロサービスBは、ビジネスに属するエラーメッセージを返すことがあります。例えば、AはBからの注文情報を照会する必要があるが、注文IDは存在しないので、Bはこの注文が存在しないことを示すエラーメッセージを返さなければならない。 Aはerorrsがある場合、コードは次のコードのようになります決定するためにリターン・メッセージからif-else判断を行う必要があります。

//remoteServiceA is an interface annotated with @FeignClient 
resultA = remoteServiceA.foo(); 
if (resultA.hasError) { 

} else { 

} 

resultB = remoteServiceB.foo(); 
if (resultB.hasError) { 

} else { 

} 

// ... ... 

それは十分に優雅ではありませんようにif-elseそう多くはあります。私たちが望むのは、remoteServieA.foo()は、OrderNotExistExceptionのような自己定義の実行時例外を投げることができるということです。この目標を達成するためのあらゆるアイデア?

+0

真実のREST APIでは、返されるHTTPエラーコードは自明である必要があります。したがって、注文(リソース)を照会して404を取得した場合、「リソースが見つかりません」という意味で「注文が見つかりません」という意味です。 – cherit

答えて

0

私はこの問題を解決しました。 FeignのErrorDecoderコンポーネントをカスタマイズしました。このコンポーネントでは、HTTP独自の応答に従って自分自身の例外をスローすることができます。

0

Hystrixを有効にしている場合は、tryブロックでserviceA.foo()をラップして、リモートサービスに例外をスローする必要があります。

try { 
    serviceA.foo(); 
} catch(HystrixRuntimeException ex) { 
    throw new OrderNotExistException("Error message"); 
} 

あなたはまだあなたのリモートサービスが応答しない場合、またはその他のエラーが発生した場合は、例外のようなものをキャッチすることができ、アカウントに取る必要があります。たぶんあなたは何が起こったかに関する情報を見つけ出し、あなたの例外を投げるべきかどうかを決めることができます。

私の頭に浮かぶが、自分のプロジェクトで働く最初のこと。

+0

これは、再度、OPが話しているというif-else判定をもたらす。 – cherit

関連する問題