ふりをする
- ふりとは何ですか
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
ヒューズは正常に作動しました。プロバイダーは調整できないため、独自のサーキット ブレーカー メソッドを直接呼び出します。