SpringCloud工程搭建之Fegin为消费者提供封装(可选)

七、Fegin为消费者提供封装(可选)

  • 完整工程源码:https://gitee.com/forwardxiang/spring-cloud-demo.git

7.1 导入依赖

  • 消费者原有的依赖基础上新增:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    

7.2 编写Feign客户端

  • 编写一个接口并交给spring容器,产生代理接口对象,供用户在controller中自动注入后使用:

    @FeignClient("bill-manager")
    public interface UserClient {
        //http://bill-manager/bill/123
        @GetMapping("/bill/{id}")
        User queryById(@PathVariable("id") Long id);
    }
    
  • 编写controller接口,不再出现需要访问的服务ip或者service-id,全由代理对象完成:

    @RestController
    @RequestMapping("/cf")
    public class ConsumerFeignController {
        @Autowired
        private UserClient userClient;
        @GetMapping("/{id}")
        public Bill queryById(@PathVariable Long id){
            return userClient.queryById(id);
        }
    }
    

7.3 开启Fegin功能

  • 在启动类上添加@EnableFeignClients 注解开启Fegin功能:

    //@SpringBootApplication
    //@EnableDiscoveryClient
    //@EnableCircuitBreaker
    @SpringCloudApplication //相当于上面三个注解的组合
    @EnableFeignClients  //开启feign功能,已经自动集成了Ribbon负载均衡
    public class ApiGatewayApplication {
        public static void main(String[] args) {
            SpringApplication.run(ApiGatewayApplication.class, args);
        }
        //注意此处不再@Bean和@LoadBalanced来定义RestTemplate进行负载均衡的配置。
    }
    

7.4 Fegin相关配置

  • Feign默认也有对Hystrix的集成,但是默认关闭,如果需要开启则在yml配置文件:

    feign:
        hystrix:
            enabled: true # 开启Feign的熔断功能
    
  • 给集成的Hystrix编写Fallback回调,首先是实现Feign客户端接口:

    @Component
    public class UserClientFallback implements UserClient {
        @Override
        public User queryById(Long id) {
            User user = new User();
            user.setId(id);
            user.setName("用户异常");
            return user;
        }
    }
    
  • 然后将这个实现类作为Fallback回调指定给他的接口:

    @FeignClient("bill-manager",fallback = UserClientFallback.class)
    public interface UserClient {
        //http://bill-manager/bill/123
        @GetMapping("/bill/{id}")
        User queryById(@PathVariable("id") Long id);
    }
    
  • 这样在发生雪崩等导致服务降级的问题时,如果请求这个配置过Fegin内置Hystrix的接口,就回返回给请求者对应的fallback。

7.5 单独引入Hystrix(配置更容易)

  • 引入依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    
  • 启动类上添加注解@EnableCircuitBreaker。

  • 在controller里编写需要指定fallback的方法同样返回值和参数声明的方法:

    public String queryByIdFallback(Long id) {
        log.error("查询用户信息失败。id:{}", id);
        return "对不起,网络太拥挤了!";
    }
    
  • 将该fallback在正常逻辑的方法上注明:

    @GetMapping("{id}")
    @HystrixCommand(fallbackMethod = "queryByIdFallback")
    public String queryById(@PathVariable Long id) {
        String url = "http://user-service/user/" + id;
        return restTemplate.getForObject(url, String.class);
    }
    
  • 如果需要对整个Controller类编写默认fallback(必须无参),需要用@DefaultProperties注解:

    @RestController
    @DefaultProperties(defaultFallback = "defaultFallback")
    public class ConsumerController {
    	
        //省略其他方法
        
        public String defaultFallback() {
            return "默认提示:对不起,网络太拥挤了!";
        }
    }
    
  • 如果需要更改Hystrix的默认超时时长(缺省1s),可以在yml配置文件里配置:

    hystrix:
      command:
        default:
          execution:
            isolation:
              thread:
                timeoutInMilliseconds: 6000 #服务降级超时时间,默认1S
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fffxxx222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值