还是我们的老套路,每到一个新东西新内容的时候先来认识一下Feign到底是什么,真正的了解以后才能更正确的使用
1.介绍
Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端。Feign是一种负载均衡的HTTP客户端, 使用Feign调用API就像调用本地方法一样,从避免了调用目标微服务时,需要不断的解析/封装json 数据的繁琐。Feign集成了Ribbon。Ribbon+eureka是面向微服务编程,而Feign是面向接口编程。
Fegin是一个声明似的web服务客户端,它使得编写web服务客户端变得更加容易。使用Fegin创建一个接口并对它进行注解。它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign。
2、Feign的优点
Feign旨在使编写Java Http客户端变得更容易。在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon。利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮循实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
Feign说明
Feign是一个声明式的http客户端,其作用是帮助我们优雅的实现http请求的发送
总结:Feign是对Ribbon的进一步封装,目的是让远程调用更加简便。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@EnableFeignClients/*开启Feign的功能*/
3.新建Feign客户端包clients,在这个包新建一个接口UserClient用来进行远程调用
@FeignClient("userservice")/*指定服务的名称*/
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);/*从路径获得的参数需要加上@PathVariable注解*/
}
4.在service中调用远程服务(RestTemplate和Feign只能使用其中一个)
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.使用Feign远程调用
User user = userClient.findById(order.getUserId());
// 3.封装user到order
order.setUser(user);
// 4.返回
return order;
}
5.修改本服务的名称为原服务名称-abc
orderservice-abc
在application.yml文中添加以下内容:
feign:
client:
config:
default: #这里用default就是全局配置,如果写某个服务名称,则针对某个微服务生效
loggerLevel: FULL
public class FeignClientConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC; //设置全局日志等级,调试错误时可以使用FULL,平时不建议使用,因为会消耗性能,BASIC和NONE建议使用
}
}
是配置类全局生效:在启动类上修改注解@EnableFeignClients指定默认的Feign配置为我们创建的Feign配置
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)