Feign入门之快速实战
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Feign入门之快速实战相关的知识,希望对你有一定的参考价值。
Feign远程调用
问题引入
先来看我们以前利用RestTemplate发起远程调用的代码:
就这样的代码,存在下面的问题:
-
代码可读性差,编程体验不统一
-
参数复杂URL难以维护
那么怎么解决上面的问题呢?这就引出了Feign。
Feign
Feign简介
Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
详细的概念可以参考官网的内容,后面也会大致讲解,这里就不赘述了,先快速实战一下。
我们直接进入实战,将原来的RestTemplate替换为现在的Feign
Feign替代RestTemplate实战
Fegin的使用步骤如下:
1. 引入依赖
我们在order-service服务的pom文件中引入feign的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 添加注解
在order-service的启动类添加注解开启Feign的功能:
package com.yyl.order;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
@Slf4j
@EnableFeignClients
@MapperScan("com.yyl.order.mapper")
@SpringBootApplication
public class OrderApplication
public static void main(String[] args)
SpringApplication.run(OrderApplication.class, args);
3. 编写Feign的客户端
在order-service中新建一个接口,内容如下:
package cn.itcast.order.client;
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;
@FeignClient("userservice")
public interface UserClient
@GetMapping("/user/id")
User findById(@PathVariable("id") Long id);
这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:
- 服务名称:userservice
- 请求方式:GET
- 请求路径:/user/id
- 请求参数:Long id
- 返回值类型:User
这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。
这里肯定会有小伙伴疑惑,这就完事了,能用啦???
是的是的。这是因为Feign全给你内部封装好了,他基本实现流程是这样的:
- 首先他会根据主角
@FeignClient
注解中的服务名,去匹配对应的微服务地址 - 然后通过
@GetMapping
注解绑定Feign客户端方法对应的请求 - 他是声明式客户端,这些基本的都声明好了,他就内部帮你发送了
- 完事了,用的时候拿这个接口调这个方法就OK了
先大致知道是这样,后面再去学Feign原理,声明式的嘛,就是编写简单
4. 测试
修改order-service中的OrderService类中的queryOrderById方法,使用Feign客户端代替RestTemplate:
@Service
public class OrderService
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId)
// 查询订单
Order order = orderMapper.findById(orderId);
// 利用Fegin发送请求
User user = userClient.findById(order.getUserId());
// 封装user到order
order.setUser(user);
// 返回order
return order;
看起来优雅多了,重启运行,我们请求一下:
也没问题
快速实战总结
使用Feign编写远程调的步骤:
① 引入依赖
② 添加@EnableFeignClients注解
③ 编写FeignClient接口
④ 使用FeignClient中定义的方法代替RestTemplate
以上是关于Feign入门之快速实战的主要内容,如果未能解决你的问题,请参考以下文章