继文章 微服务系列之 Eureka 实现注册中心案例,可以发现,我们在远程调用时,使用以下的方式:

public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.查询用户信息,远程调用,放弃http请求
        String url = "http://userservice/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        // 3.封装User到Order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

给人的第一感觉就是:不优雅,这种方式是使用RestTemplate的方式来发起的远程调用,在代码中还存在"http://userservice/user/"类似的请求地址,如果项目大了起来,或者说是url后面的参数多了起来,可以想象,代码中就会存在大量的url地址,不优雅。

以下,介绍Feign的用法来规避这种问题的出现。

Feign简介

Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
image-1655605843332

使用

依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
功能开启
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients //开启Feign
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}
定义一个接口
@FeignClient("userservice")//指定服务名称:userservice,将来要通过发送http请求
public interface UserClient {

    @GetMapping("user/{id}")
    User getUserById(@PathVariable("id") Long id);
}
使用,改变原来的OrderService写法
    @Autowired
    private UserClient userClient;


    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.使用Feign来远程调用
        User user = userClient.getUserById(order.getUserId());
        order.setUser(user);
        // 4.返回
        return order;
    }

测试

image-1655607361874

总结

Feign的使用步骤

  • 引入依赖
  • 添加@EnableFeignClients注解
  • 编写FeignClient接口
  • 使用FeignClient中定义的方法代替RestTemplate