在Feign中添加自定義配置


首先先創建一個FeignConfig類,代碼如下:

package com.xing.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import feign.Contract;
import feign.Feign;

@Configuration
public class FeignConfig {

    //配置是在FeignClient中的接口中使用Feign自帶的注解
    @Bean
    public Contract feignContract(){
        return new feign.Contract.Default();
   }
    
    //禁用Hystrix
    @Bean
    @Scope("prototype")
    public Feign.Builder feignBuilder() {
        return Feign.builder();
    } 
    
}
        

第一個bean配置的是使用Feign的默認注解,添加第一個配置之后,下面的UserInterface類就一定要使用@RequestLine這個注解才行(這個是Feign的注解),使用@RequestMapping會報Method findByNameEn not annotated with HTTP method type (ex. GET, POST)的異常,

如果你要使用@RequestMapping這個注解你就把feignContract這個方法注釋掉,就好了。

 

第二個bean配置的是是禁用Hystrix

接着Feign調用User服務的接口類UserInterface中的@FeignClient注解中添加configuration = FeignConfig.class就可以吧我們上面的config加載進來,我這里就直接把這個類貼出來了

package com.xing.movie.FeignInteface;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.xing.config.FeignConfig;
import com.xing.movie.entity.User;

import feign.Param;
import feign.RequestLine;
import feign.hystrix.FallbackFactory;

//@FeignClient中的fallback和fallbackFactory不能一起使用
@FeignClient(name = "xing-user" ,/*fallback = UserInterfaceFallback.class,*/configuration = FeignConfig.class , fallbackFactory = HystrixClientFallbackFactory.class)//服務名
public interface UserInterface {
    //@RequestMapping(value ="/user/findByNameEn/{nameEn}" ,method =RequestMethod.GET ) //必須使用RequestMapper,使用GetMapping啟動報錯
    @RequestLine("GET /user/findByNameEn/{nameEn}") //當配置了feignContract之后要使用這個Feign的注解,使用上面的報錯,如果配置了這個,那下面方法里面必須使用@Param不能使用@PathVariable
    public User findByNameEn(@Param("nameEn") String nameEn);//@Param后面需要指定nameEn,不然可能報錯
    
}
//不一定要內部類可以是外部類
//Hystrix異常處理類 ,返回空的user
@Component
class UserInterfaceFallback implements UserInterface {
    @Override
    public User findByNameEn(String nameEn) {
        User user = new User();
        user.setName("");
        user.setNameEn("");
        user.setId(0);
        return user;
    }
}

//Hystrix 訪問異常時可以顯示錯誤信息 
@Component
class HystrixClientFallbackFactory implements FallbackFactory<UserInterface> {

    @Override
    public UserInterface create(Throwable cause) {

        return new UserInterface() {

            @Override
            public User findByNameEn(String nameEn) {
                return new User("fallback;reason was : "+cause.getMessage(), " ", 0);
            }
        };
    }
    
}

 

 這樣就可以禁用掉Feign的Hystrix,測試成功,我這里額外配置fallback 和fallbackFactory 這兩個方法是配置了當Feign調用異常的時候fallback方法是返回一個空的user,而fallbackFactory方法可以打印異常信息我把異常信息放在User類的name屬性中返回了,如果調用服務異常的話頁面的結果如下:

完整源碼在https://github.com/OnlyXingxing/SpringCloud

 


免責聲明!

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



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