• 在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

  • 相关阅读:
    P1629 邮递员送信
    P1119 灾后重建
    最短路问题
    P1194 买礼物
    最小生成树
    P1038 神经网络
    P2661 信息传递
    mysql 5.7启动报错
    docker flannel网络部署和路由走向分析
    k8s---无头服务
  • 原文地址:https://www.cnblogs.com/xing-12/p/9952971.html
Copyright © 2020-2023  润新知