之前我们使用RestTemplate虽然也可以实现远程调用,但是呢,多多少少还是差点意思,因为它存在一些问题:
- 代码可读性差,编程体验不统一
- 参数复杂URL难以维护
这是之前使用RestTemplate发起远程调用的代码:
为了解决这些问题,我们可以使用Feign,Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign,其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
定义和使用Feign
1.引入依赖
在消费者服务中引入
<!-- Feign客户端依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.添加注解
在消费者服务的启动类上添加注解
@EnableFeignClients // 开启Feign的功能
3.编写Feign客户端
新建接口
package cn.itcast.order.clients;
/**
* @author 温柔哥
* @create 2024-01-19 11:25
*/
import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* Feign的客户端
*/
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
Feign默认是支持SpringMVC的注解的,大大节省了我们的学习成本!
这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:
服务名称:userservice
请求方式:GET
请求路径:/user/{id}
请求参数:Long id
返回值类型:User
这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了
4.测试
// 2.使用Feign发起远程调用
User user = userClient.findById(order.getUserId());
对比本文最开头的代码,是不是显得可读性很高了!
并且,Feign的功能很强大,已经集成Ribbon到自身,本身就可以实现负载均衡了,查看Feign的依赖便一目了然: