Spring Cloud プロジェクトを開始する - ステップ 6 Hystrix を使用した宣言型インターフェイス呼び出しとサーキット ブレーカーの実装を装う

ふりをする

  • ふりとは何ですか

Feign リボンと同様に、Feign も Netflix によって提供されています。Feign は宣言型のモジュール型 Web サービス クライアントです。これにより、開発者が Web サービス クライアントを作成する操作が簡素化されます。開発者は、シンプルなインターフェイスとアノテーションを介して HTTP を呼び出すことができます。API である Spring Cloud Feign は、リボンと Hystrix に加え、プラガブル、アノテーション ベース、ロード バランシング、サービス ブレーカーなどの一連の便利な機能を備えています。

Feign は、Ribbon + RestTemplate メソッドと比較して、コード開発を大幅に簡素化します。Feign は、Feign アノテーション、JAX-RS アノテーション、Spring MVC アノテーションなど、さまざまなアノテーションをサポートしています。Spring Cloud は、Feign を最適化し、Ribbon と Eureka を統合して、Feign を作成しましたより使いやすくなります。

  • リボンとフェーンの違い

    1. Fiegn は宣言型 Web サービス クライアントです。
    2. Feign アノテーション、Spring MVC アノテーション、JAX-RS アノテーションをサポートします。
    3. Feign は、Ribbon をベースに実装されており、使いやすくなっています。
    4. Feign は Hystrix を統合しており、サービスサーキットブレーカーの機能を備えています。

フェーン機能をオンにする

1. 新しいモジュールを作成し、feign という名前を付け、次の依存関係を pom.xml に追加します。

<dependencies>
    <!-- 都是作为服务注册到Eureka Server ,所以需要添加这个依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
    <!-- Feign 的依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
</dependencies>


2.次の内容を含む新しい application.yml ファイルを作成します。

server:
  port: 8050
spring:
  application:
      name: feign
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

3. スタートアップ クラスを作成し、Feign 関連のアノテーションを追加します。
スタートアップ クラスに FeignApplication という名前を付け、
コードは次のようになります。

package com.southwind;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class FeignApplication {
    
    
    public static void main(String[] args){
    
    
        SpringApplication.run(FeignApplication.class,args);
    }
}

4. 最初の記事で作成した Student エンティティ クラスを引き続き操作する必要があるため、元のエンティティ クラス コードを
Student クラスにコピーする必要があります。

package com.southwind.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor                 //无参构造
@AllArgsConstructor                //有参构造
public class Student {
    
    
    private long id;
    private String name;
    private int age;

}

ディレクトリ構造は次のとおりです。
ここに画像の説明を挿入します

4. FeignProviderClient という名前の新しいインターフェイスを作成し、com.southwind.feign パッケージに配置します。

FeignProviderClient コードは次のとおりです。


```java
package com.southwind.feign;

import com.southwind.entity.Student;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Collection;

//这里就体现了Feign 的声明式调用,都是接口,
//value = provider是因为提供者在注册中心的名字叫做 provider
@FeignClient(value = "provider")
public interface FeignProviderClient {
    
    
   /* 需要调用提供者的controller 里面的方法,直接就行(有
    * 点相当于它自己就会把provider 替换成IP地址,然后把Mapping 里面的值给拼接
    * 到后面,实现模块间的调用。)
    */
    @GetMapping("/student/findAll")
    public Collection<Student> findAll();
    @GetMapping("/student/index")
    public String index();
}

5. コントローラーを作成し、FeignHandler.java という名前を付けて、com.southwind.controller フォルダーに保存します。

package com.southwind.controller;

import com.southwind.entity.Student;
import com.southwind.feign.FeignProviderClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collection;

@RestController
@RequestMapping("/feign")
public class FeignHandler {
    
    
    @Autowired
    private FeignProviderClient feignProviderClient;

    @GetMapping("/findAll")
    public Collection<Student> findAll(){
    
    
        return feignProviderClient.findAll();
    }

    @GetMapping("/index")
    public String index(){
    
    
        return feignProviderClient.index();
    }
}

6. 登録センター eruekaserver を起動し、前の記事と同様に、1 つのプロジェクトで 2 つの異なるポートのプロバイダー サービスを開始し、eurekaclient を開始してから、feign プロジェクトを開始します。

7. ブラウザに「localhost:8050/feign/index」と入力します。

ここに画像の説明を挿入します

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

Feign 宣言呼び出しでも負荷分散を実現でき、コードが簡素化され、zuul ゲートウェイ メソッドを使用するよりも便利です。

Feign を使用してサービスサーキットブレーカーを実現する

サーキットブレーカーとは何ですか。
マイクロサービスがフラッシュ セール シナリオまたは同様のシナリオを処理し、サーバーへの非常に大量の同時アクセスが発生すると、サービスがクラッシュし、サービスからの応答を長時間待つことができず、そのサービスを呼び出すサービスもクラッシュする可能性があります。このようにして、類推すると、「雪崩効果」が起こります。この時に活躍するのがヒューズで、回路におけるヒューズのようなもので、最大電流を超えると電源を遮断して漏電や感電を防ぎます。サービスが応答せずに呼び出され続けると、サーキット ブレーカーがアクティブになり、サービスへのアクセスが一時的に停止され、サーキット ブレーカーの結果が返されて、後で再試行するようにユーザーに通知されます。ダウンしたサービスが通常に戻るまで待ちます。サービスに正常にアクセスできるようになると、ヒューズは自動的に閉じられます。

1. 元の feign プロジェクトの yml ファイルに、feign ヒューズを有効にするコードを追加します。

server:
  port: 8050
spring:
  application:
    name: feign
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true
feign:
  hystrix:
    enabled: true

feign.hystrix.enabled: true ヒューズをオンにするかどうか

2. FeignProviderClient の FeignError 実装クラスを作成し、フォールト トレラントな処理ロジックを定義し、@Component アノテーションを介して FeignError インスタンスを IoC コンテナに挿入します。

ここに画像の説明を挿入します
FeignError コード:

package com.southwind.feign.impl;

import com.southwind.entity.Student;
import com.southwind.feign.FeignProviderClient;
import org.springframework.stereotype.Component;

import java.util.Collection;
@Component
public class FeignError implements FeignProviderClient {
    
    
    @Override
    public Collection<Student> findAll() {
    
    
        return null;
    }
//当熔断开启时,停止对该服务的访问,然后调用此方法告知用户系统繁忙
    @Override
    public String index() {
    
    
        return "服务器维护中.....";
    }
}

3. FeignProviderClient定義時に@FeignClientのfallback属性によるマッピングを設定し、ダウングレード処理を行います。

FeignProviderClientに、ダウングレード処理(赤枠部分)を追加します
ここに画像の説明を挿入します
この際、Feignがサービスプロバイダにアクセスした際、サービスプロバイダが正常な状態ではなく、アクセスに失敗した場合、feignErrorでフォールバックメソッドを見つけて対処します。このようにすると、500、404などのWebページのステータスコードは表示されなくなりますが、作成したフォールバック、つまりサーキットブレーカーの処理方法が表示されます。

4. テスト

まずサービス プロバイダーを停止します。このとき、ふりをしてプロバイダーに電話すると、サーバーが応答していないことを示す 500 が報告されます。
ここに画像の説明を挿入します

この時点で偽装を再起動します(偽装サーキットブレーカーをオンにした後、まだ有効になっていません。サーキットブレーカーを有効にするために、ここで偽装を再起動します)

ブラウザで再度アクセスします: localhost:8050/feign/index

ここに画像の説明を挿入します
ヒューズは正常に作動しました。プロバイダーは調整できないため、独自のサーキット ブレーカー メソッドを直接呼び出します。

おすすめ

転載: blog.csdn.net/chenmaolin928/article/details/109184353