在Feign中添加自定義配置

首先先建立一個FeignConfig類,代碼以下:git

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)的異常,github

若是你要使用@RequestMapping這個註解你就把feignContract這個方法註釋掉,就行了。web

 

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

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

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屬性中返回了,若是調用服務異常的話頁面的結果以下:ide

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

相關文章
相關標籤/搜索