通过Feign API测试Hystrix回退:com.netflix.client.ClientException:负载均衡器没有客户端

时间:2018-02-15 19:43:10

标签: spring-boot netflix-eureka hystrix spring-cloud-feign netflix-ribbon

在测试我的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;
        }
    }

}

测试类

此测试仅用于验证回退行为:

@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

测试/ 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)

我错过了什么?

补遗

申请类

@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";
    }

}

没有其他课程。

1 个答案:

答案 0 :(得分:0)

所以!我能够重新创建这个问题,感谢你添加了更多的代码,不得不随意使用它,因为我不确定BookClientService看起来是什么样的,实现BookAPI是没有意义的将是内部呼叫,例如在您的应用程序中,而不是与Feign的外部API调用。

反正

我推送了你在这里提供的版本。

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

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

问题是由于第二个属性源(测试版)覆盖了最初的application.yml禁用 hystrix,因为Hystrix已被禁用,因此无法回退它会导致导致回退的根本原因,即缺少服务器来调用Book API。将其重命名为application-test将始终加载到弹簧测试上下文中。您可以使用内联属性或配置文件来解决它。

我在测试中添加了另一个禁用feign / w hystrix的测试,重新创建了你收到的错误。