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默认集成了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}
测试: