マイクロサービス + springcloud + springcloud アリババ研究ノート【OpenFeignの活用】(5/9)

前の章では、リボンが停止して停止されたと述べました. OpenFeign は、リボンのさらなる単純化とカプセル化 (インターフェイス + 注釈) です。

1.OpenFeignの紹介

1.1. Feign と OpenFeign の概念と機能

Feign は宣言型 Web クライアントです. インターフェイスを作成し、注釈を追加してマイクロサービス間の呼び出しを完了するだけで済みます. Feign を使用すると、Web サービス クライアントの作成が容易になります.

これは、サービス インターフェイスを定義し、それに注釈を追加することで機能します。feign は、プラグ可能なエンコーダーとデコーダーもサポートしています。Spring Cloud は Feign をカプセル化して、Spring MVC 標準アノテーションと Http MessageConverters をサポートします。Feign は、負荷分散をサポートするために Eureka および Ribbon と組み合わせて使用​​できます。

Feign は、Ribbon と RestTemplate を統合して、Http 呼び出しの負荷分散された実行を実装しますが、元のメソッド (Ribbon+RestTemplate) をカプセル化します。開発者は、RestTemplate を手動で使用してサービスを呼び出す必要はありませんが、このインターフェイスでインターフェイスを定義します。これは、インターフェース指向プログラミングの目的に沿ったものであり、開発を簡素化します。
ここに画像の説明を挿入

つまり、A が B を呼び出したい場合、Feign は B の外部サービスとまったく同じインターフェイスを A に作成することになります. このインターフェイスを呼び出して B にサービスを提供できます.

1.2、Feign と OpenFeign の違い

ここに画像の説明を挿入

2.OpenFeignの利用手順

2.1. Feign コンシューマー側マイクロサービスの作成

プロジェクト モジュール名: Cloud-order-feign80

2.2. POM ファイル構成の変更

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud2023</artifactId>
        <groupId>com.tigerhhzz.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Cloud-order-feign80</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>com.uclass.springcloud</groupId>
            <artifactId>Api-Commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>

</project>

プロジェクトの依存関係を確認してください。openfeign は本質的にリボンを継承しており、リボンの負荷分散機能も備えています。
ここに画像の説明を挿入

2.3、yml 設定ファイルを書く

server:
  port: 80

spring:
  application:
    name: Cloud-consumer-feign-order80

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      #      defaultZone: http://localhost:7001/eureka/   #单机版
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/   #集群版

2.4、メインのスタートアップ クラスを書く

クラスに @EnableFeignClients アノテーションを追加して、Feign クライアントを示します。

package com.tigerhhzz.springcloud;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@Slf4j
@EnableFeignClients     //激活对Feign的使用
@SpringBootApplication
public class OrderFeignMain80 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(OrderFeignMain80.class, args);
        log.info("OrderFeignMain80启动成功~~~~~~~~~~~~~~~~~~~");
    }
}

2.5、ビジネスクラスを書く

ビジネス ロジック インターフェイス + @FeignClient アノテーション構成は、provider8001 または 8002 サービスを呼び出します。

2.5.1. サービスプロバイダーインターフェースのリモート呼び出し用のサービスレイヤーインターフェースを書く

サービス層: @FeignClient(value = "cloud-payment-service") アノテーションを追加するように注意してください。値の値は、リモートで呼び出す必要があるマイクロサービスの名前を示します。

package com.tigerhhzz.springcloud.service;

import com.tigerhhzz.springcloud.entities.CommonResult;
import com.tigerhhzz.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @author tigerhhzz
 * @date 2023/4/11 15:27
 */

@Component
@FeignClient(value = "cloud-provider-service")   //需要寻找的微服务名称
public interface PaymentFeignService {
    
    

    @GetMapping(value = "/payment/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
2.5.2. URL マッピングとサービス呼び出し用のコントローラー層を作成する
package com.tigerhhzz.springcloud.controller;

import com.tigerhhzz.springcloud.entities.CommonResult;
import com.tigerhhzz.springcloud.entities.Payment;
import com.tigerhhzz.springcloud.service.PaymentFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@Slf4j
public class OrderFeignController {
    
    

    @Resource
    private PaymentFeignService paymentFeignService;
 
    @GetMapping(value = "/consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
    
    
        return paymentFeignService.getPaymentById(id);

    }
}

注: 80 モジュールが開始された後、クライアント アクセス アドレスは /consumer/payment/get/{id} であり、最初にアクセス インターフェイス レイヤー 2.5.1 に記述された PaymentFeignService インターフェイスを見つけ、アノテーション @FeignClient(value = " cloud-provider -service") Eureka レジストリに移動して、サービス名が "cloud-provider-service" のマイクロサービス インターフェイスを見つけます。その呼び出しインターフェイスは @GetMapping(value = "/payment/{id}" であり、外部に公開されています8001 モジュールによって提供される世界) インターフェイス; 中間に openfeign インターフェイスのレイヤーがあります。

2.6. テスト

インターフェイスにアクセスし、openfeign の負荷分散機能をテストします。

  1. 最初に 2 つの Eureka クラスター 7001/7002 を開始します
  2. さらに 2 つのマイクロサービスを開始する 8001/8002
  3. OpenFeign モジュールを開始します OrderFeignMain80
  4. アクセスアドレス:http://localhost/consumer/payment/get/1

Feign はデフォルトでリボンを使用して負荷分散を実現し、結果を取得します (Feign には負荷分散構成アイテムが付属しています)。
ここに画像の説明を挿入

3. OpenFeign タイムアウトメカニズム

3.1、タイムアウトの状況

OpenFeign のデフォルトの待機時間は 1 秒で、1 秒を超えるとエラーが直接報告されます

3.2. タイムアウト時間を設定する

application.yaml 構成ファイルで、タイムアウト期間を設定します。

#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
# 表示建立连接后从服务器读取到可用资源,所用时间
 ReadTimeout:  5000
# 表示建立连接时间,适用于网络正常的情况下,两端连接所用时间
 ConnectTimeout: 5000

OpenFeign の最下層は負荷分散のためのリボンであるため、そのタイムアウト期間はリボンによって制御されます。

4.OpenFeignのログ印刷

ここに画像の説明を挿入

Feign インターフェイスの呼び出しステータスを監視および出力し、設定によってログ レベルを調整して、Feign での HTTP リクエストの詳細を理解します。

4.1、ログレベル

  • NONE: デフォルト、ログを表示しません
  • BASIC: リクエストメソッド、URL、レスポンスステータスコード、実行時間のみ記録
  • HEADERS: BASICで定義されている情報に加えて、リクエストとレスポンスのヘッダー情報があります
  • FULL: HEADERS で定義された情報に加えて、リクエストとレスポンスのボディとメタデータ

4.2. OpenFeign を使用したログ:

構成クラスに OpenFeign のログ クラスを追加することを実現する

注: Logger は import feign.Logger パッケージの下に導入されています。

@Configuration
public class FeignConfig {
    
    
    @Bean
    Logger.Level feignLoggerLevel() {
    
    
        return Logger.Level.FULL;
    }
}

4.3. 指定したクラスのログ レベルを設定する

YML ファイルのログを開く必要がある Feign クライアント

logging:
 level:
  #feign日志以什么级别监控哪个接口
  com.uclass.springcloud.service.PaymentFeignService: debug

4.4、印刷結果

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_43025151/article/details/130078429