SpringCloud之负载均衡Feign(四)

514 阅读3分钟

feign

简单使用

由上面可以看到,ribbon负责负载均衡,每次都是通过restTemplete来实现远程服务调用,这样操作起来比较麻烦,我们能不能像以前一样,直接通过调用serverice,来实现某项操作呢,这时feign就出现了。feign默认集成了hystrix,相当于把ribbon和hystrix的功能都封装到了一起,使用起来更加方便,我们只需要添加@EnableFeignClients@FeignClient注解即可。废话不多说,直接看代码。

  • 添加依赖
    由于demo_api和demo_web都需要feign,所以定义添加到demo_parent中。
1        <!-- feign -->
2        <dependency>
3            <groupId>org.springframework.cloud</groupId>
4            <artifactId>spring-cloud-starter-openfeign</artifactId>
5        </dependency>
 1      @Autowired
2    RestTemplate restTemplate;
3    @Autowired
4    UserService userService;
5    //@HystrixCommand(commandProperties = {@HystrixProperty(name = //"execution.isolation.thread.timeoutInMilliseconds",value="3000")},
6    //fallbackMethod = "requestError"
7    //)
8    @GetMapping("getUser")
9    public BaseResult getUser(Integer id) {
10        //BaseResult baseResult = restTemplate.getForObject("http://USER/user/get/1", BaseResult.class);
11//        try {
12//            Thread.sleep(5000);
13//        } catch (InterruptedException e) {
14//            e.printStackTrace();
15//        }
16        BaseResult baseResult = userService.get(id);
17        return baseResult;
18    }

测试:

feign_ceshi1.png
feign_ceshi1.png

熔断器

由上面我们知道,feign默认集成了Hystrix,但是默认是关闭状态的,我们需要在yml配置文件中开启hystrix。

1feign:
2  hystrix:
3    enabled: true

添加完成后,我们就可以做熔断降级的事情了,上面hystrix那一章我们写的是单个方法的降级,这次我们做所有服务的统一降级,首先需要在UserService接口上添加上@FeignClient(value = "USER",fallbackFactory = MyFallbackFactory.class),然后编写我们自己指定的MyFallBackFactory类,代码如下:

 1package com.lytw13.demo.fallback;
2
3import com.lytw13.demo.model.BaseResult;
4import com.lytw13.demo.service.UserService;
5import feign.hystrix.FallbackFactory;
6import org.springframework.stereotype.Component;
7import org.springframework.web.bind.annotation.PathVariable;
8
9@Component
10public class MyFallbackFactory implements FallbackFactory<UserService{
11    @Override
12    public UserService create(Throwable cause) {
13        return new UserService() {
14            @Override
15            public BaseResult get(@PathVariable("id") Integer id) {
16                return new BaseResult(400,"服务器访问人数过多,请稍候访问",null);
17            }
18
19            @Override
20            public BaseResult list() {
21                return new BaseResult(400,"服务器访问人数过多,请稍候访问",null);
22            }
23        };
24    }
25}

测试:

feign_ceshi2.png
feign_ceshi2.png