通过 Feign API 测试 Hystrix 回退:com.netflix.client.ClientException:负载均衡器没有可供客户端使用的服务器

Testing Hystrix fallback through Feign API: com.netflix.client.ClientException: Load balancer does not have available server for client

在测试我的 Feign API 的 Hystrix 回退行为时,我收到了一个错误,当我期望它成功时。

Feign 接口:

这是对外部服务的api。

@FeignClient(name = "book", fallback = BookAPI.BookAPIFallback.class)
public interface BookAPI {

    @RequestMapping("/")
    Map<String, String> getBook();

    @Component
    class BookAPIFallback implements BookAPI {

        @Override
        @RequestMapping("/")
        public Map<String, String> getBook() {
            Map<String, String> fallbackmap = new HashMap<>();
            fallbackmap.put("book", "fallback book");
            return fallbackmap;
        }
    }

}

测试class

此测试的存在只是为了验证回退行为:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = NONE)
public class BookServiceClientTest {

    @MockBean
    RestTemplate restTemplate;// <---- @LoadBalanced bean

    @Autowired
    private BookServiceClient bookServiceClient;

    @Before
    public void setup() {
        when(restTemplate.getForObject(anyString(), any()))
                .thenThrow(new RuntimeException("created a mock failure"));
    }

    @Test
    public void fallbackTest() {
        assertThat(bookServiceClient.getBook())
                .isEqualTo(new BookAPI.BookAPIFallback().getBook().get("book")); // <--- I thought this should work
    }
}

配置文件

application.yml

这些文件显示了可能相关的配置:

feign:
  hystrix:
    enabled: true

test/application.yml

eureka:
  client:
    enabled: false

问题

运行 应用程序一切正常。
但是当 运行 这个测试时,我得到以下错误。
当然,这是一个测试,所以我还是想绕过查找。

java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: book

at org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient.execute(LoadBalancerFeignClient.java:71)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:97)

我错过了什么?

附录

申请class

@SpringBootApplication
@EnableCircuitBreaker
@EnableDiscoveryClient
@EnableFeignClients
public class LibraryApplication {

    public static void main(String[] args) {
        SpringApplication.run(LibraryApplication.class, args);
    }

}

图书馆控制器

@Controller
public class LibraryController {

    private final BookServiceClient bookService;

    public LibraryController(BookServiceClient bookServiceClient) {
        this.bookService = bookServiceClient;
    }

    @GetMapping("/")
    String getLibrary(Model model) {
        model.addAttribute("msg", "Welcome to the Library");
        model.addAttribute("book", bookService.getBook());
        return "library";
    }

}

没有其他 class。

所以!我能够重新创建问题,感谢添加更多代码,不得不稍微尝试一下,因为我不确定 BookClientService 是什么样子并且实现 Book[= 没有意义35=] 因为那将是内部调用,例如在您的应用程序中,而不是使用 Feign 的外部 API 调用。

无论如何,

我在此处推送了您提供的我的版本。

https://github.com/Flaw101/feign-testing

当我将 src/test/resources 文件夹中的第二个 application.yml 重命名为 application-test.yml 时,问题已解决,这将合并属性。

问题是由第二个 属性 源代码(测试源代码)覆盖初始 application.yml 禁用 hystrix 引起的,因为 Hystrix 是disabled 没有回退可去,它抛出了导致回退的根本原因,缺少可以为 Book API 调用的服务器。将其重命名为 application-test 将始终加载到 spring 测试上下文中。您可以使用内联属性或配置文件来解决它。

我在测试中添加了另一个禁用 feign /w hystrix 的测试,re-creates 您收到的错误。