SpringCloud使用Feign实现远程调用流程详细介绍
作者:自牧君 发布时间:2021-06-02 06:47:16
标签:SpringCloud,Feign,远程调用
前言
本次示例代码的文件结构如下图所示。
1. 导入依赖坐标
在 order-service
的 pom.xml
文件中导入 Feign 的依赖坐标。
<!-- Feign远程调用客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 开启Feign自动装配
在 order-service
的启动类上添加注解 @EnableFeignClients
,以开启 Feign 功能。
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients
@Slf4j
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
log.info("订单微服务启动成功");
}
}
3. 声明远程调用
Feign 采用了 Spring MVC 的注解的方式发起远程调用。只需要把发 HTTP 请求的信息声明在一个接口中,并添加注解 @FeignClient("微服务名称")
,Feign 就会自动为我们发起 HTTP 请求。通常需要声明的信息如下。
声明的信息 | 值 |
---|---|
微服务名称 | userservice |
请求方式 | GET |
请求路径 | /user/{id} |
请求参数 | Long id |
返回值类型 | User |
下面的代码示例演示了订单微服务 order-service
向用户微服务 user-service
发起【根据用户 ID 查询用户】的远程调用。
clients/UserClient.java
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User getById(@PathVariable Long id);
}
4. 替代RestTemplate
下面代码示例展示了使用 Feign 之前,使用 RestTemplate
发起远程调用。
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
// 自动注入RestTemplate,用于发起HTTP请求远程调用
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.使用RestTemplate发起HTTP请求,查询订单所属用户信息
// 2.1 根据查询的订单order中的userId动态生成HTTP请求的url
String url = "http://userservice/user/" + order.getUserId();
// 2.2 发送HTTP请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
// 3.把远程调用获得的user封装进order对象中
order.setUser(user);
// 4.返回order订单信息
return order;
}
}
使用 Feign 之后,首先把 UserClient
接口自动注入 OrderService.java
,代码示例如下图所示。
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
// 自动注入userservice的Feign客户端,用于发起HTTP请求远程调用
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.使用Feign客户端发起HTTP请求,查询订单所属用户信息
User user = userClient.getById(order.getUserId());
// 3.把远程调用获得的user封装进order对象中
order.setUser(user);
// 4.返回order订单信息
return order;
}
}
通过对比,使用 Feign 远程调用的编程风格非常统一,没有像 RestTemplate
那样还需要定义字符串 URL 。
5. 测试
启动订单微服务 order-service
和 2 个用户微服务 user-service
。
测试成功,查询订单时能远程调用用户微服务 user-service
的查询用户方法。
此外,Feign 内部还自动实现了 Ribbon 负载均衡。
来源:https://blog.csdn.net/Sihang_Xie/article/details/129009475


猜你喜欢
- 一、spring声明式事务1.1 spring的事务管理器spring没有直接管理事务,而是将管理事务的责任委托给JTA或相应的持久性机制所
- 阅读目录(Content)•1.get与post的区别•1.1 get方法 jsp中的代码form表单代码•1.2 action包中serv
- 在linux主机部署Eureka高可用方案的时候,发现注册到服务中心的服务IP是随机的,由于主机的网卡是多个,随机的IP并不是自己想要的,上
- 前言本章是关于Java数组的最全汇总,本篇为汇总中篇,主要讲了二维数组和不规则的数组的相关内容。数组是最常见的一种数据结构,它是相同类型的用
- 初次使用IDEA,创建一个maven工程,发现在目录结构中产生了两个不一样的东西——.iml文件和.idea文件夹。非常好奇,所以立刻上网查
- 前言坚持是一件比较难的事,坚持并不是自欺欺人的一种自我麻痹和安慰,也不是做给被人的,我觉得,坚持的本质并没有带着过多的功利主义,如果满是功利
- 赋值运算符也有和算数操作符所结合的用法之前附录中有提及,用法是:比如要将x加上4,然后再赋值给x,就可以写成x+=4. public cla
- 在java项目开发中。最开始换行符大家一般是在idea中设置新文件为LF,并且对旧文件通过IDEA下方的点击来更换换行符。很显然,对于几千文
- 工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式。android中用到了太多的工厂类,其中有用工厂方
- 我就废话不多说了,大家还是直接看代码吧~package com.zejian.annotationdemo; import java.lan
- 本文以实例形式简单讲述了C#观察者模式,分享给大家供大家参考。具体实现方法如下:现在假设有一个软件公司,每当有新产品推出,就把信息通知到一些
- C++ 中String 替换指定字符串的实例详解C++的string提供了replace方法来实现字符串的替换,但是对于将字符串中某个字符串
- android root权限破解分析许多机友新购来的Android机器没有破解过Root权限,无法使用一些需要高权限的软件,以及进行一些高权
- 谜题在C#中,用virtual关键字修饰的方法(属性、事件)称为虚方法(属性、事件),表示该方法可以由派生类重写(override)。虚方法
- 在 Java 语言中,运算符有算数运算符、关系运算符、逻辑运算符、赋值运算符、字符串连接运算符、条件运算符。算数运算符算数运算符是我们最常用
- 或是将Datagrid或是Gridview的输出导出,实现大体上又分为调用COM+组件或是利用Response(当然是B/S架构的项目)的输
- 依赖<dependency> <groupId>io.springfox</groupId> <a
- 作为Android app,发布多个分发平台是常规操作。然后,有时由于个渠道面对的用户不同,或平台审核标准不同,需要在各渠道使用不同的业务逻
- 一、简介相信大家用eclipse上的模拟器会觉得很慢很卡,这里给大家介绍个好东西安卓模拟器genymotion。了解更多,可到此网站http
- 使用Kotlin的Lambda表达式,我们可以抛弃回调接口的使用。只需设置希望后面会被调用的函数即可。示例如下新建一个Kotlin类clas