2016-06-29 5 views
3

ビルド中のRESTクライアントでリモートサービスに接続する際にNetflixのHystrixライブラリを使用してサーキットブレーカとして機能します。彼らが提供するライブラリを介してイベントのストリーミングとダッシュボードの監視をセットアップしたいと思います。サンプルアプリケーションhereを見ると、サーブレットフィルタとサーブレットクラスをWebアプリケーションに適用する必要があるようです。Jersey 2のHystrix Javaサーブレットとサーブレットフィルタの使用

私はJersey 2でSpring Bootを使用しており、JerseyConfig.java(web.xmlはありません)のリソースとフィルタを配線しています。私はジャージーフィルターがサーブレットフィルターと同じではないことを知っていますし、2つを統合するのに苦労しています。

Javaサーブレットフィルタを使用してジャーナルフィルタとして機能させるにはどうすればよいですか?また、Javaサーブレットをどのように使用してJerseyリソースとして機能させるのですか?

私の現在のサーブレット戦略は、そういうものを包むことです。それぞれに1つ。

@Path("/hystrix.stream") 
public class HystrixResource extends HystrixUtilizationSseServlet { 

    @Context 
    HttpServletRequest httpRequest; 

    @Context 
    HttpServletResponse httpResponse; 

    //This returns void because it is a text/stream output that must remain open, 
    //so the httpResponse is continually written to until the conenction is closed 
    @GET 
    public void doGet() throws ServletException, IOException { 
     doGet(httpRequest, httpResponse); 
    } 
} 

これは機能している可能性がありますが、データは何らかの理由で基本的に空です。私はその理由はフィルタが機能していないためだと推測しています。

data: {"type":"HystrixUtilization","commands":{},"threadpools":{}} 

彼らはジャージーContainerRequestFilterとは異なる入力と出力を期待するので、サーブレットフィルタをラップする方法を私にそれほど明確ではありません。私のJerseyConfigの次の実装は、ログがフィルタが登録されていることを示すものではなく、これらのファイルの行をデバッグモードで壊すことができないため、何もしないようです。

@Component 
@ApplicationPath("/") 
public class JerseyConfig extends ResourceConfig { 
    private static final Logger LOGGER = Logger.getLogger("JerseyConfig"); 
    public JerseyConfig(){ 
     //filter to provide a bridge between JAX-RS and Spring request attributes 
     register(RequestContextFilter.class); 
     register(SpringComponentProvider.class); 
     //handles custom serialization 
     register(new ObjectMapperContextResolver()); 
     //try to register the filters - which doesn't work because these aren't Jersey Filters 
     register(HystrixRequestContextServletFilter.class); 
     register(HystrixRequestLogViaResponseHeaderServletFilter.class); 
     registerResources(); 

     /* 
     * Enable the logging filter to see the HTTP response for each request. 
     */ 
     register(new LoggingFilter(LOGGER, true)); 
    } 
} 

答えて

0

私がSpring Bootプロジェクトに参加している場合は、代わりにSpringクラウド/ブートスターターを使用することになりました。これにより、他の答えに示されているようにBeanとフィルタを明示的に定義する必要がなくなりました。最終的には基本的には基本的にそのままの状態で動作しました。

<dependency> 
     <groupId>org.springframework.cloud</groupId> 
     <artifactId>spring-cloud-starter-hystrix</artifactId> 
     <exclusions> 
      <!--We're running our Jersey server w/ Jackson 2. This import uses Jackson 1.x and creates a breaking conflict.--> 
      <exclusion> 
       <groupId>javax.ws.rs</groupId> 
       <artifactId>jsr311-api</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.cloud</groupId> 
     <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-actuator</artifactId> 
    </dependency> 

リファレンスCircuit Breakerスタートガイド。私が直面した1つの問題は、ジャクソン1対ジャクソン2の対立であり、ライブラリの除外を追加することができました。私は基本的にはHystrixライブラリのjarファイルを持っていましたが、それを動作させるために何も接続していませんでした。

1

サーブレットとサーブレットのフィルタは、Jerseyのコンフィグレーションに登録しないでください。それらは単に無視されます。代わりに、ServletRegistrationBeanFilterRegistrationBeanのSpring Bootで登録する必要があります。あなたSpring構成で

、あなたはまた、

@Bean 
public ServletRegistrationBean someServlet() { 
    ServletRegistrationBean registration = ServletRegisrationBean(
      new HystrixMetricsStreamServlet(), "/hystrix.stream"); 
    registration.setName("HystrixMetricsStreamServlet"); 
    return registration; 
} 

@Bean 
public FilterRegistrationBean someFilter() { 
    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(new HystrixRequestContextServletFilter()); 
    registration.setUrlPatterns(Arrays.asList("/*")); 
    registration.setName("HystrixRequestContextServletFilter"); 
    // you can also set the order of filters if you need to 
    return registration; 
} 

のような何かを行うことができます:

  • あなたはSpringComponentProviderを登録する必要はありません。これは自動的に登録されます。
  • このように登録されているサーブレットにアクセスしようとすると404が表示された場合は、デフォルトのJerseyマッピング/*を使用しているためです。マッピングを変更したり、Jerseyをフィルタとして検索して、未発見のリクエストを転送することができます。 this post
+0

こんにちは@peeskillet。ご返信ありがとうございます。私は春のウェブを通じてページを提供していないので、あなたの回答のいずれかが適用されますか? – th3morg

+0

サービングページとは何が関係していますか?あなたはSpring Bootをタグ付けしているので、私はあなたにSpring Bootソリューションを提供しています。私はどこに役立つページがどこに問題に適合しているかはわかりません。 –

+0

ありがとうございます@peeskillet。私はあなたの提案に基づいてこれを得ることができました。 hystrix.streamのサーブレットは、HystrixUtilizationSseServletではなく、HystrixMetricsStreamServletである必要があります。私はそれを編集しようとします。第2に、コマンドが実行されるまでデータは存在しない。したがって、アプリケーションを再起動すると、リクエストがHystrixCommandsを通過するまで、データは空になります。ありがとう! – th3morg

関連する問題