SpringCloudAlibaba マイクロサービス呼び出しコンポーネント - Feign

SpringCloudAlibaba マイクロサービス呼び出しコンポーネント - Feign

このプロジェクトのコードとメモは、Gitee ウェアハウスのアドレス「コード、メモ」に保存されています。


JAVAプロジェクトでインターフェース呼び出しを実装するにはどうすればよいですか?

1)HTTPクライアント

HttpClient は、Apache Jakarta Common のサブプロジェクトであり、HTTP プロトコルをサポートする効率的で最新の機能豊富なクライアント プログラミング ツールキットを提供するために使用され、HTTP プロトコルの最新バージョンと推奨事項をサポートします。従来の JDK に付属する URLConnection と比較して、HttpClient は使いやすさと柔軟性が向上し、クライアントが HTTP リクエストを送信しやすくなり、開発効率が向上します。

2)はいhttp

ネットワーク リクエストを処理するオープン ソース プロジェクトであり、Android で最も人気のある軽量フレームワークであり、Square によって提供され、HttpUrlConnection および Apache HttpClient の置き換えに使用されます。OkHttp はシンプルな API、効率的なパフォーマンスを備え、複数のプロトコル (HTTP/2 および SPDY) をサポートしています。

3)HTTPURL接続

HttpURLConnection は Java の標準クラスであり、URLConnection を継承し、指定された Web サイトに GET リクエストおよび POST リクエストを送信するために使用できます。HttpURLConnection は使用が複雑で、HttpClient ほど簡単ではありません。

4)RestTemplate Webクライアント

RestTemplate は、Rest サービスにアクセスするために Spring によって提供されるクライアントであり、リモート HTTP サービスにアクセスするためのさまざまな便利なメソッドを提供し、クライアントの書き込み効率を大幅に向上させることができます。上記はインターフェイスを呼び出す最も一般的な方法を紹介しましたが、次に紹介する方法は上記よりも簡単で便利です。

1. フェイクとは何ですか?

Feign は、Retrofit、JAXRS-2.0、および WebSocket に触発されて、Netflix によって開発された宣言型のテンプレート化された HTTP クライアントです (feign はサービス利用者側で宣言されます)。Feign は、HTTP API をより便利かつエレガントに呼び出すのに役立ちます。Feign は、Feign 独自のアノテーションや JAX-RS アノテーションなど、さまざまなアノテーションをサポートしています。

Spring Cloud openfeign は、Spring MVC アノテーションをサポートするために Feign を強化し、Ribbon と Nacos も統合して、Feign をより使いやすくしています。

1.1 利点

Feign では、HTTP を使用してリモート サービスをリクエストするときに、ローカル メソッドを呼び出すのと同じエクスペリエンスを実現できますが、開発者は、HTTP リクエストはおろか、これがリモート メソッドであることをまったく認識していません。Dubbo と同様に、コンシューマーは、通常の Http クライアントを通じてリクエストを作成して戻りデータを解析する必要がなく、インターフェース メソッドを直接呼び出してプロバイダーを呼び出します。これにより、開発者はローカル メソッドを呼び出すのと同じようにリモート インターフェイスを呼び出すことができるため、分散環境の開発はもちろん、リモートとのやり取りの詳細に注意を払う必要もありません。

2. Spring Cloud Alibaba は OpenFeign を迅速に統合します

1) 依存関係を導入する

<!--openfeign远程调用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2) 呼び出しインターフェイス + @FeignClient アノテーションを記述します。

/**
 * Create with IntelliT IDEA
 *
 * @Author: zhengmingzhe
 * @Date: 2023/03/15/21:15
 * @Description: 调用stock-service服务service
 */
/*name 指定调用的rest接口的服务名,比如这里调用库存服务stock-service
 * path 指定rest接口所在的StockController指定的@RequestMapping("/stock")
 *  **/
@FeignClient(name = "stock-service", path = "/stock")
public interface StockFeignService {
    
    
    //声明需要调用的rest接口对应的方法,直接复制过来,对应的就行(不用写实现类)
    @RequestMapping("/reduct")
    String reduct();
}

3) 呼び出し側は、@EnableFeignClients アノテーションをスタートアップ クラスに追加します (追加しない場合、クライアント サービスは見つかりません)。

@SpringBootApplication
@EnableDiscoveryClient   //启动nacos的客户端 不加也行在后续的版本这个注解可不用手动添加
@EnableFeignClients
public class OrderApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(OrderApplication.class, args);
    }
}

4) 通話を開始し、市内通話と同様にリモート サービスを呼び出します。

@RestController
@RequestMapping("/order")
public class OrderController {
    
    
    @Autowired
    StockFeignService stockService;

    @RequestMapping("/add")
    public String add() {
    
    
        System.out.println("下单成功");
        String msg = stockService.reduct();
        return "Hello Feign!" + msg;
    }
}

3. Spring Cloud Feign のカスタム構成と使用

Feign は、ユーザーがより柔軟に使用できるようにするための拡張メカニズムを多数提供します。

3.1 ログの設定

場合によっては、インターフェイス呼び出しの失敗、パラメータの未受信などのバグが発生することがあります。また、呼び出しのパフォーマンスを確認したい場合は、次のことを行う必要があります。

Feignのログは、Feignがリクエスト情報を出力できるように構成されています。

1) 構成クラスを定義し、ログ レベルを指定します。

/*  全局配置:当使用@Configuation会将配置作用于所有的服务提供方
 *   局部配置: 如果只想针对某一个服务进行配置,就不要加@Configuration
 */
@Configuration
public class FeignConfig {
    
    
    /**
     * 日志级别
     * <p>
     *  @return
     */
    @Bean
    public Logger.Level feignLoggerLevel() {
    
    
        return Logger.Level.BASIC;
    }
}

ソース コードから、次の 4 つのログ レベルがあることがわかります。

NONE [最高のパフォーマンス、運用環境に適しています]: ログを記録しません (デフォルト値)。

BASIC [運用環境の追跡問題に適用可能]: リクエスト メソッド、URL、レスポンス ステータス コード、および

実行時間。

HEADERS : BASIC レベルに基づいてリクエストとレスポンスのヘッダーを記録します。

FULL [開発およびテスト環境の位置付けの問題により適しています]: リクエストとレスポンスのヘッダーと本文を記録します。

そしてメタデータ。

2) ローカル構成。呼び出されたマイクロサービスを有効にするために、@FeignClient アノテーションで使用される構成クラスを指定します (グローバル構成の場合は追加する必要はありません)。

@FeignClient(name = "stock-service", path = "/stock", configuration = FeignConfig.class)
public interface StockFeignService {
    
    
    //声明需要调用的rest接口对应的方法,直接复制过来,对应的就行(不用写实现类)
    @RequestMapping("/reduct")
    String reduct();
}

3) yml設定ファイルにあるクライアントのログレベルを実行するだけで正常にログが出力されます。形式は「logging.level.feignインターフェースパッケージパス」です

=debug" (対応するサービスが配置されているパッケージを検索し、右クリックして参照をコピー)

logging:
  level:
    com.zmz.order.feign: debug

BASICレベルのログ情報が表示されます。

下成功
2023-03-15 22:39:48.867 デバッグ 23504 — [nio-8040-exec-1] com.zmz.order.feign.StockFeignService : [StockFeignService#reduct] —> GET http://stock-service /stock/reduct HTTP/1.1
2023-03-15 22:39:48.871 デバッグ 23504 — [nio-8040-exec-1] com.zmz.order.feign.StockFeignService : [StockFeignService#reduct] <— HTTP/1.1 200 (3ms)

補足:ローカル設定はymlで設定可能

対応する属性構成クラス:

org.springframework.cloud.openfeign.FeignClientProperties.FeignClientConfiguration

#feign日志局部配置
feign:
  client:
    config:
      stock-service:
        loggerLevel: FULL

3.2 コントラクト設定 (feign のネイティブ アノテーションを使用して、openFeign を feign に復元できます)

Spring Cloud は Feign を拡張し、Spring MVC アノテーションを使用して Feign の機能を完成させます。ネイティブ Feign は Spring MVC アノテーションをサポートしていません。ネイティブ アノテーションを使用して Spring Cloud でクライアントを定義したい場合は、コントラクトを構成することでこの構成を変更できます。Spring Cloud のデフォルトは SpringMvcContract です。Spring Cloud 1 の初期バージョンではネイティブ Fegin が使用されていましたが、Netflix の終了に伴い Open feign に置き換えられました。

    /**
     * 修改契约配置,支持Feign原生的注解
     *  @return
     */
    @Bean
    public Contract feignContract() {
    
    
        return new Contract.Default();
    }

注: コントラクト構成を変更した後、OrderFeignService は springmvc アノテーションをサポートしなくなり、Feign ネイティブ アノテーションを使用する必要があります。

@FeignClient(name = "stock-service", path = "/stock", configuration = FeignConfig.class)
public interface StockFeignService {
    
    
    //声明需要调用的rest接口对应的方法,直接复制过来,对应的就行(不用写实现类)
//    @RequestMapping("/reduct")
//    String reduct();

    @RequestLine("GET/reduct")  // @RequestLine替换@RequestMapping加上请求方式GET
    String reduct();   
}

3) さらに、yml を通じてコン​​トラクトを構成することもできます。

  #feign日志局部配置
feign:
  client:
    config:
      stock-service:
        loggerLevel: FULL
        contract: feign.Contract.Default  #设置为默认的契约(还原成原生注解)

3.3 タイムアウト設定

接続タイムアウトと読み取りタイムアウトはオプションで設定できます。オプションの最初のパラメータは接続タイムアウト (ms) で、デフォルト値は 2s です。2 番目のパラメータはリクエスト処理タイムアウト (ms) で、デフォルト値は 5s です。

 /*设置feign调用超时时间*/
 @Bean
 public Request.Options options() {
    
    
     return new Request.Options(5000, 10000);
 }

ymlでの設定

feign:
  client:
    config:
      stock-service:
        loggerLevel: FULL
        contract: feign.Contract.Default  #设置为默认的契约(还原成原生注解)
        connectTimeout: 5000
        readTimeout: 3000

追加説明: Feign は最下層としてリボンを使用しますが、タイムアウト期間は Feign の設定に依存します。

3.4 認証ロジックを実装するためのカスタム インターセプター

コンシューマーがプロバイダーを呼び出したときに有効になります (認証 Authorization を検証するときに、偽のログ レベルを FULL に設定します)

public class FeignAuthRequestInterceptor implements RequestInterceptor {
    
    
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void apply(RequestTemplate template) {
    
    
        logger.info("feign拦截器----");
// 业务逻辑
        String access_token = UUID.randomUUID().toString();
        template.header("Authorization", access_token);
    }
}

//@Configuration
public class FeignConfig {
    
    
    /**
     * 日志级别
     * <p>
     *  @return
     */
    @Bean
    public Logger.Level feignLoggerLevel() {
    
    
        return Logger.Level.FULL;
    }
    /*定义拦截器*/
    @Bean
    public FeignAuthRequestInterceptor feignAuthRequestInterceptor() {
    
    
        return new FeignAuthRequestInterceptor();
    }
}

おすすめ

転載: blog.csdn.net/qq_45925197/article/details/129573734