Spring Cliud Feign
Feign是什么
降低远程调用的复杂度
Feign 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。
省去自己获取url、参数类型等,通过SpringMvc注解获取UserController的请求方式、路径、参数、返回结果等
使用Feign之前Controller调用其他业务
public String queryById(@PathVariable("id") Integer id) {
String url = "http://user-service/user/"+id;
String user = template.getForObject(url, String.class);
return user;
}
使用Feign案例
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
添加注解
启动类加 @EnableFeignClients注解
@EnableFeignClients
@SpringCloudApplication //==@EnableCircuitBreaker、@EnableDiscoveryClient、@SpringBootApplication
public class ConsumerApplication {
/*@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate(); 使用Feign后不在需要该步骤
}*/ //
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
}
编写UserClient接口
@FeignClient("user-service") //获取服务名,从eureka拉取该服务的服务列表,底层会利用ribbon实现负载均衡,在通过 @GetMapping @PathVariable获取地址并传递id发起请求
public interface UserClient {
@GetMapping("user/{id}")
User queryById(@PathVariable("id") Integer id);
}
修改Controller类
@RestController
@RequestMapping("consumer")
//@DefaultProperties(defaultFallback = "queryByIdFallback") Feign中包含hystrix,所以...
public class ConsumerController {
/* @Autowired
private RestTemplate template; 使用Feign后不在需要该步骤 */
@Autowired
private UserClient client;
@GetMapping("{id}")
public User queryById(@PathVariable("id") Integer id) {
return client.queryById(id);
}
public String queryByIdFallback() {
return "服务器正忙,请稍后再试!";
}
}
定义一个类实现UserClient接口,作为fallback的处理类
@Component
public class UserClientFailBack implements UserClient {
@Override
public User queryById(Integer id) {
User user = new User();
user.setUsername("查无此人!");
return user;
}
}
Feign中的ribbon(负载均衡),在yml中配置
ribbon:
ConnectionTimeOut: 500 # 建立连接的超时时长,默认1秒
ReadTimeOut: 2000 # 读取数据超时时长,默认1秒
Feign中的hystrix(熔断),在yml中配置
# feign的 hystrix启动,
feign:
hystrix:
enabled: true
因为Feign中包含了ribbon和hystrix所以 pom.xml中只需导入Feign即可,但是启动ConsurmerApplicatiom会出现java.lang.NoClassDefFoundError: com/netflix/hystrix/contrib/javanica/aop/aspectj/HystrixCommandAspect 所以hystrix的依赖还需要单独引入
测试
UserApplication服务开启
ConsumerApplication请求UserApplication结果正常
UserApplication服务关闭
ConsumerApplication请求UserApplication结果异常
Feign的请求压缩
Spring Cloud Feign支持对请求和响应进行GZIP压缩,以减少通信过程中的损耗。
feign:
compression:
request:
enable: true #开启请求压缩
response:
enable: true #开启响应压缩