27

マイクロサービス間の通信には Spring-Cloud-Netflix を使用しています。Foo と Bar という 2 つのサービスがあり、Foo が Bar の REST エンドポイントの 1 つを使用しているとします。次の注釈が付けられたインターフェイスを使用します@FeignClient

@FeignClient
public interface BarClient {
  @RequestMapping(value = "/some/url", method = "POST")
  void bazzle(@RequestBody BazzleRequest);
}

SomeService次に、Foo にサービス クラスがあり、 BarClient.

@Component
public class SomeService {
    @Autowired
    BarClient barClient;

    public String doSomething() {
      try {
        barClient.bazzle(new BazzleRequest(...));
        return "so bazzle my eyes dazzle";
      } catch(FeignException e) {
        return "Not bazzle today!";
      }

    }
}

ここで、サービス間の通信が機能することを確認するために、WireMock などを使用して、偽の Bar サーバーに対して実際の HTTP 要求を発行するテストを構築したいと考えています。このテストでは、feign がサービス応答を正しくデコードし、それを に報告することを確認する必要がありますSomeService

public class SomeServiceIntegrationTest {

    @Autowired SomeService someService;

    @Test
    public void shouldSucceed() {
      stubFor(get(urlEqualTo("/some/url"))
        .willReturn(aResponse()
            .withStatus(204);

      String result = someService.doSomething();

      assertThat(result, is("so bazzle my eyes dazzle"));
    }

    @Test
    public void shouldFail() {
      stubFor(get(urlEqualTo("/some/url"))
        .willReturn(aResponse()
            .withStatus(404);

      String result = someService.doSomething();

      assertThat(result, is("Not bazzle today!"));
    }
}

そのような WireMock サーバーを eureka に挿入して、feign がそれを見つけて通信できるようにするにはどうすればよいですか? どのような注釈マジックが必要ですか?

4

7 に答える 7

2

個人的には、安静な API をスタブ化するのに mockServerを好みます。これは使いやすく、wiremockに似ていますが、後者に比べて非常に強力です。

mockServer で GET restful 呼び出しをスタブするために groovy/spock で記述されたサンプル コードを添付しました。

まず、テスト クラスで mockServer インスタンスを自動配線します

@Autowired
private static ClientAndServer mockServer

setupSpec() メソッドから mockServer インスタンスを開始します。このメソッドは、@BeforeClassアノテーションが付けられた junit メソッドに似ています。

def setupSpec() {
     mockServer = ClientAndServer.startClientAndServer(8080)
   }

対応する単体テストで必要なスタブを定義する

def "test case"() {
 given:
       new MockServerClient("localhost",8080).when(HttpRequest.request().withMethod("GET").withPath("/test/api").withQueryStringParameters(Parameter.param("param1", "param1_value"), Parameter.param("param2", "param2_value"))).respond(HttpResponse.response().withStatusCode(HttpStatus.OK.value()).withBody("{ message: 'sample response' }"))

 when:
 //your code
 then:
 //your code
}

テストケースの実行後、モックサーバーを停止します

def cleanupSpec() {
     mockServer.stop()
} 
于 2020-02-04T09:33:13.253 に答える
0

これは非常に興味深いトピックですが、過小評価されていると思います。マイクロサービス環境で通信チャネルを検証する方法です。チャネルが期待どおりに機能していることを確認することは文字通り不可欠ですが、それでも、多数のプロジェクトが Feign クライアントのテストに時間を費やしているのを目にします。

ほとんどの人は、Feign クライアントの最小限のテストを行う方法について既に回答していますが、次のレベルに進みましょう。

プレーンな Feign クライアントのテスト、リクエスト マッピング/レスポンス マッピング/クエリ マッピングなどは全体像のほんの一部です。マイクロサービス環境では、クライアント側の負荷分散やサーキット ブレーカーなど、サービスの回復力にも注意を払う必要があります。

2021 年になり、Spring Cloud が Hystrix とリボンを非推奨とマークしたので、Resilience4J を検討する時が来ました。

読むには多すぎるため、ここにはコードを記載しませんが、私の GitHub プロジェクトの 1 つへのリンクをいくつか示します。

また、これは説明がないと理解しすぎかもしれませんが、単一のスタックオーバーフローの回答ではできません。そのため、私の記事のいくつかとFeign に関する私のコースをチェックしてください: Spring Cloud を使用したマイクロサービス通信のマスターふりをする

于 2021-12-04T16:39:21.553 に答える