Feign:可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
Feign是Netflix开发的声明式/模板化的HTTP客户端。
Feign的使用
1.在consumer的pom文件中导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2.在启动类开启Feign功能
@SpringCloudApplication @EnableFeignClients // 开启feign客户端 public class ItestConsumerApplication { public static void main(String[] args) { SpringApplication.run(ItestConsumerApplication.class, args); } }
可以删除 RestTemplate
@FeignClient(value = "test-provider") // 标注该类是一个feign接口 public interface UserClient { @GetMapping("user/{id}") User queryById(@PathVariable("id") Long id); }
-
-
@FeignClient声明这是一个Feign客户端,类似@Mapper注解。同时通过
value
属性指定服务名称 -
改造原来的调用逻辑,调用UserClient接口:
@Controller @RequestMapping("consumer/user") public class UserController { @Autowired private UserClient userClient; @GetMapping @ResponseBody public User queryUserById(@RequestParam("id") Long id){ User user = this.userClient.queryUserById(id); return user; } }
负载均衡
Feign已经集成了Ribbon依赖和自动配置:
Feign也有对Hystrix的集成,默认情况下是关闭的,
通过下面的参数来开启:
feign: hystrix: enabled: true # 开启Feign的熔断功能
1)要定义一个类UserClientFallback,实现刚才编写的UserClient,作为fallback的处理类,
@Component public class UserClientFallback implements UserClient { @Override public User queryById(Long id) { User user = new User(); user.setUserName("服务器繁忙,请稍后再试!"); return user; } }
2)然后在UserFeignClient中,指定刚才编写的实现类
@FeignClient(value = "test-provider", fallback = UserClientFallback.class) // 标注该类是一个feign接口 public interface UserClient { @GetMapping("user/{id}") User queryUserById(@PathVariable("id") Long id); }