- 了解Feign的作用
- 掌握Feign的使用过程
- 掌握Feign的负载均衡配置
- 掌握Feign的熔断配置
- 掌握Feign的压缩配置
- 掌握Feign的日志配置
一、 Feign简介
Feign [feɪn] 译文 伪装。Feign是一个声明式WebService客户端.使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解。不再需要拼接URL,参数等操作。项目主页:https://github.com/OpenFeign/feign 。
- 集成Ribbon的负载均衡功能
- 集成了Hystrix的熔断器功能
- 支持请求压缩
- 大大简化了远程调用的代码,同时功能还增强啦
- Feign以更加优雅的方式编写远程调用代码,并简化重复代码
总结:
- feign 是一个[声明式]REST客户端。(http客户端:RestTemplate 使用Restful 风格进行开发的)
- feign 是基于RestTemplate开发的一个声明式的Rest客户端;只需要写一个接口,定义一个注解,就可以直接使用。
二、Feign的快速入门
使用Feign替代RestTemplate发送Rest请求。
2.1 使用feign的步骤
- consumer中添加起步依赖(spring-cloud-starter-openfeign)
- consumer中编写一个接口, 添加一个注解进行声明@FeignClient,注解后面的name 指定的是要发送到哪个微服务对应的名字。最后定义一个方法。
- consumer中编写控制层,在Controller中使用@Autowired注入FeignClient。(在controller service dao里面都可以使用)
- consumer中在启动类中添加@EnableFeignClients,开启Feign。
- provider中被调用方controller 一定要【实现】声明的接口的方法。
(1)导入依赖
在user-consumer中添加spring-cloud-starter-openfeign依赖
<!--配置feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)创建Feign客户端(接口)
在user-consumer中创建com.it.feign.UserClient接口,添加一个注解进行声明@FeignClient,定义一个方法。
//name 指定的是要发送到哪个微服务对应的名字
@FeignClient(name = "user-provider",fallback = UserClientFallback.class)
/*@RequestMapping("/user")*/
public interface UserClient {
/**
* 实际上是发送请求给微服务 获取数据的
* @param id
* @return
*/
@RequestMapping("/user/find/{id}")
public User findById(@PathVariable(name = "id") Integer id);
}
解释:
- Feign会通过动态代理,帮我们生成实现类。
- 注解@FeignClient声明Feign的客户端,注解value指明服务名称
- 接口定义的方法,采用SpringMVC的注解。Feign会根据注解帮我们生成URL地址
- 注解@RequestMapping中的/user,不要忘记。因为Feign需要拼接可访问地址
(3)编写控制层
在user-consumer中: 创建com.it.controller.ConsumerFeignController,在Controller中使用@Autowired注入FeignClient,代码如下:
@RestController
@RequestMapping("/feign")
public class ConsumerFeignController {
@Autowired
private UserClient userClient;
//根据ID获取用户的数据(要使用feign的方式来获取)
@RequestMapping(value = "/{id}")
public User findById(@PathVariable(name = "id") Integer id){
return userClient.findById(id);
}
}
(4)在user-provider的controller 一定要【实现】声明的接口的方法。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User findById(@PathVariable Integer id){
System.out.println("这个是18081==================================");
return userService.findById(id);
}
//provider接受这个请求
@GetMapping("/find/{id}")
public User find(@PathVariable Integer id){
System.out.println("这个是18081==================================");
return userService.findById(id);
}
}
(5)在启动类中开启Feign
在user-consumer的启动类中添加@EnableFeignClients,开启Feign。
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableFeignClients//开启feign
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public Logger.Level feignLoggerLevel(){
//设置feign调用的级别是 Full
return Logger.Level.FULL;
}
}
(6)测试
请求<http://localhost:18082/feign/2>
,效果如下: