Spring FeignClient откат не вызывается, но идет исключение - PullRequest
0 голосов
/ 07 мая 2018

У меня возникла проблема при попытке откатить фиктивный клиент на основе документации.

Предположим, что myFeignClient не может подключиться к myFeign

@FeignClient(name = "myFeign", fallback = MyFeignClientFallback.class)
public interface MyFeignClient {
    @PostMapping(“/test")
    Object test(@RequestParam(“param1") String param1);
}

Мой запасной класс такой:

@Component
public class MyFeignClientFallback implements MyFeignClient {
    public Object test(@RequestParam(“param1”) String param1) {

        return “Error";
    }

}

вместо вызова резервного метода он просто завершается ошибкой:

2018-05-07 15: 19: 48.052 ОШИБКА 41592 --- [nio-8081-exec-6] oaccC [. [. [/]. [DispatcherServlet]: Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] выдало исключение [Ошибка обработки запроса; вложенное исключение: java.lang.RuntimeException: com.netflix.client.ClientException: у балансировщика нагрузки нет доступного сервера для клиента: myFeign] с коренной причиной

com.netflix.client.ClientException: у балансировщика нагрузки нет доступного сервера для клиента: myFeign

У меня уже работает симулированный клиент. Я экспериментировал с идеей использования Hystrix, когда столкнулся с этой проблемой.

Я использовал это неправильно или я что-то упустил?

1 Ответ

0 голосов
/ 08 мая 2018

Пожалуйста, включите Hystrix в файле конфигурации application.yml, по умолчанию установлено значение false, и функция не будет работать.

build.gradle

buildscript {
    ext {
        springBootVersion = '2.0.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    launchScript ()
}

archivesBaseName = 'framework' 
version = '1.0'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/milestone" }
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
    compile('org.springframework.cloud:spring-cloud-starter-openfeign')

    testCompile('org.springframework.boot:spring-boot-starter-test')
}

ext {
    springCloudVersion = 'Finchley.RC1'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

application.yml

eureka:
  client:
    serviceUrl:
      defaultZone: //...
  instance:
    preferIpAddress: true 

feign:
  hystrix:
    enabled: true

Application.java

@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

FrameworkHelloService.java

package framework.root.service;

import framework.root.service.FrameworkHelloService.HelloServiceFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "framework", fallback = HelloServiceFallback.class)
public interface FrameworkHelloService {
    @GetMapping("/api/hello")
    public String hello();

    @GetMapping("/api/exception")
    public void exception();

    @GetMapping("/none")
    public String none();

    @Component
    class HelloServiceFallback implements FrameworkHelloService {
        @Override
        public String hello() {
            return null;
        }

        @Override
        public void exception() { }

        @Override
        public String none() {
            return "Fallback!";
        }
    }
}
...