RestTemplate存在的问题
这是一段使用RestTemplate来发起远程调用的代码,存在以下问题
1,代码可读性差,编程体验不统一(其实还好)
2,复杂的url难以维护,修改起来十分麻烦
3,总结起来就是不够优雅
Http客户端Feign
那莫如何书写一个优雅的远程调用的代码呢??
Feign登场了,他是一个声明式的http客户端他的主旨是使得编写 java http 客户端更容易。为了贯彻这个理念,采用了通过处理注解来自动生成请求的方式(官方称呼为声明式、模板化)。通过声明式 http 客户端实现我们就可以在 java 中像调用一个本地方法一样完成一次 http 请求,大大减少了编码成本,同时提高了代码可读性。
通过使用feign就可以帮助我们解决上述存在的问题,
Feign的定义和使用
1,在项目中引入Feign的客户端依赖
<!--Feign客户端依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
2,在启动类使用@EnableFeignClients开启Feign的功能,一定要开启
3,编写Feign的客户端
注意这里的客户端是接口的形式,并且他的书写方式万泉河springMvc一致极其方便
@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User dinfUserBuId(@PathVariable("id") Long id);
}
4,发起调用
就一行核心代码,注入UserClient然后调用方法即可
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//使用Feign发起远程调用Long userId = order.getUserId();User user = userClient.finfUserBuId(userId);// 3.封装user到order中order.setUser(user);// 4.返回return order;}
}
5,而且向负载均衡等等Feign已经继承ribbob实现了负载均衡
Feign的自定义配置
Feign可修改的配置为:
Feign如何配置覆盖原有配置?
1,配置文件方式-全局有效
2,也可以在config下面设置服务名,针对某个服务设置
一般来说,默认即可,测试的时候可以开启部分
还可以使用java代码配置Feign
Feign性能优化
方案一:将controller和FeignClient继承同一接口
方案二:将FeignClient,pojo,Feign的默认配置都导入一个项目中,给所有消费者使用