微服务实战04-feign服务调用
迪丽瓦拉
2025-05-29 12:34:10
0

其实,在feign之前还有一个叫做Ribbon的东西,他们的原理都是rpc远程调用。

我们的教程不讲ribbon,只讲feign,因为feign其实就是对Robbon的一个封装,是现在大多数企业的选择。

1.物流模块

不多废话了,我们这一节来做一个物流模块,先干起来再说。

物流系统也要注册到eureka,属于一个eureka-client

org.springframework.cloudspring-cloud-starter-netflix-eureka-client

因为用到了feign,所以要加这个依赖

org.springframework.cloudspring-cloud-starter-openfeign

物流系统也是可以向外提供接口的,所以要加web依赖

org.springframework.bootspring-boot-starter-web

这样,基本的配置就ok了。

2.订单类和物流类

物流系统的作用,比如说可以获取订单列表,再生产物流单。那就需要订单的实体:

直接把订单系统的订单类拷贝过来即可。

再来一个物流类

/*** 物流单*/
public class Logistic {private Integer logisticId;   //物流单IDprivate List orderIds;  //订单集合private String date;    //创建时间public Integer getLogisticId() {return logisticId;}public void setLogisticId(Integer logisticId) {this.logisticId = logisticId;}public List getOrderIds() {return orderIds;}public void setOrderIds(List orderIds) {this.orderIds = orderIds;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}}

3.feign客户端

feign客户端就是一个用于rpc远程调用外部系统接口的桥梁,说太多专业术语没啥用,我们直接来看代码。

@FeignClient(value = "ORDER-DATA-SERVICE")
public interface OrderFeignClient {@GetMapping("/order/list")public List queryOrders();
}

这是基于Spring Cloud Netflix开发的Feign客户端。

@FeignClient是一个注解,它用于定义一个Feign客户端。这个客户端是用来远程调用ORDER-DATA-SERVICE服务的。

value属性指定了被调用服务的名称,也就是ORDER-DATA-SERVICE

OrderFeignClient是一个接口,用于定义客户端的请求方法。

在这个例子中,客户端定义了一个名为queryOrders的方法,该方法通过远程调用ORDER-DATA-SERVICE服务的/order/list接口来获取订单列表数据。

这个接口是使用HTTP GET方法请求的,List是该接口的返回值。

通过使用这个Feign客户端,可以方便地在微服务架构中进行服务之间的通信。

大家观察一下这个客户端,是不是特别像一个东西?

没错,是不是特别像controller啊。feign客户端就相当于是一个controller,用于调用其他服务的接口。

4.在哪里适用feign客户端

这个没有定论,不过我们一般是在service层中使用的。

@Service
public class LogisticsServiceImpl implements LogisticsService{@Autowiredprivate OrderFeignClient orderFeignClient; @Overridepublic void createLogisticsList() {List orders = orderFeignClient.queryOrders();List orderIds = orders.stream().map(Order::getOrderId).collect(Collectors.toList());System.out.println(String.format("订单号:%s", orderIds));Logistic logistic = new Logistic();logistic.setLogisticId(1);logistic.setDate(DateUtil.now());logistic.setOrderIds(orderIds);System.out.println(String.format("物流单:%s\n创建时间:%s", logistic.getLogisticId(),logistic.getDate()));}}

这是一个名为LogisticsServiceImpl的Spring Service实现类,该类实现了LogisticsService接口。这个服务用于创建物流单。在服务中,注入了一个名为orderFeignClientOrderFeignClient客户端,用于远程调用ORDER-DATA-SERVICE服务获取订单列表数据。

在服务的createLogisticsList方法中,调用了orderFeignClient客户端的queryOrders方法获取订单数据,并使用Java 8的Stream API将订单列表转换为订单ID列表。

接下来,创建一个名为Logistic的物流实体,并将物流单号、创建时间和订单ID列表设置为物流实体的属性。最后,输出物流单的信息,包括物流单号、创建时间和订单ID列表。这个服务的作用是构建物流单信息,为后续的物流操作提供数据支持。

5. controller

@RestController
public class LogisticController {@AutowiredLogisticsService logisticsService;@GetMapping("/logistic/create")public String create() {logisticsService.createLogisticsList();return "OK";}}

这个类是一个基于Spring的REST服务控制器,使用@RestController注解进行标识,它提供了Web接口/logistic/create,该接口使用HTTP GET方法请求。请求的处理逻辑定义在create方法中,该方法通过依赖注入自动装配了一个名为logisticsServiceLogisticsService服务,并调用服务的createLogisticsList方法创建物流单。最后返回一个OK字符串,表示创建物流单成功。通过调用这个Web接口,可以触发创建物流单的操作。

6. 启动类

物流微服务也是单体项目,需要独立部署,因为用到了feign,所以需要加上@EnableEurekaClient@EnableDiscoveryClient@EnableFeignClients这三个注解。

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

配置文件

spring:application:name: logistic-service
eureka:client:serviceUrl:defaultZone: http://localhost:8081/eureka/

定义了应用程序的名称为logistic-service。配置了Eureka的客户端,指定了Eureka服务注册中心的地址为http://localhost:8081/eureka/

最后,把服务都启动起来。

访问:http://localhost:8084/logistic/create

如果看到控制台打印出下面的内容,就说明调用成功了。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...