填坑系列之OpenFeign(二)


前提

在fallback時,發現重復注冊了兩次同一uri,報錯:

Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'com.yiming.user_consumer.service.UserConsumerService' method com.yiming.user_consumer.service.UserConsumerService#isAlive() to {GET /user/isAlive}: There is already 'userProviderBack' bean method com.yiming.user_consumer.componant.UserProviderBack#isAlive() mapped.

原因

這是Feign的一個Bug。在api中添加了@RequestMapping(“/xxx”)注解后,SpringMVC、Hystrix、Feign都要檢查uri。如果單是Feign,那么加@RequestMapping沒問題,但是如果再配上Hystrix,就會重復注冊兩次url。

解決方法

方法1:去掉@RequestMapping(“/xxx”)
方法2:在每個方法前手寫uri(如果不嫌麻煩的話…),或者定義一個常量去拼接,例如:@GetMapping("/xxx/xxx")

實例

以下有三個服務,分別為user-apiuser-provider:user-consumer,在調用user-provider服務時,發生異常(請求超時等)就會調用user-consumer中的UserProviderBack類中相應的方法。

user-api:

//@RequestMapping("/user")
public interface RegisterApi {

    @GetMapping("/isAlive")
    String isAlive();
}

或者

public interface RegisterApi {

    @GetMapping("/user/isAlive")
    String isAlive();
}

user-provider:

@RestController
public class UserController implements RegisterApi {

    @Override
    public String isAlive() {
        return "OK";
    }
}

user-consumer:

@FeignClient(name = "user-provider", fallback = UserProviderBack.class)
public interface UserConsumerService extends RegisterApi {

    @GetMapping("/isAlive")
    String isAlive();
}
@Component
public class UserProviderBack implements UserConsumerService {

    @Override
    public String isAlive() {
        return "降級了";
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM