微服务实战04-feign服务调用

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,182元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务实战04-feign服务调用

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

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


1.物流模块

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

52.png


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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

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


2.订单类和物流类

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


53.png


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

再来一个物流类

/**
 * 物流单
 */
public class Logistic {
 private Integer logisticId;   //物流单ID
 private List<Integer> orderIds;  //订单集合
 private String date;    //创建时间
 public Integer getLogisticId() {
  return logisticId;
 }
 public void setLogisticId(Integer logisticId) {
  this.logisticId = logisticId;
 }
 public List<Integer> getOrderIds() {
  return orderIds;
 }
 public void setOrderIds(List<Integer> 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<Order> queryOrders();
}

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


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


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


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


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


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


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


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


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


4.在哪里适用feign客户端

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

@Service
public class LogisticsServiceImpl implements LogisticsService{
 @Autowired
 private OrderFeignClient orderFeignClient; 
 @Override
 public void createLogisticsList() {
  List<Order> orders = orderFeignClient.queryOrders();
  List<Integer> 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接口。这个服务用于创建物流单。在服务中,注入了一个名为orderFeignClient的OrderFeignClient客户端,用于远程调用ORDER-DATA-SERVICE服务获取订单列表数据。


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


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


5. controller

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

这个类是一个基于Spring的REST服务控制器,使用@RestController注解进行标识,它提供了Web接口/logistic/create,该接口使用HTTP GET方法请求。请求的处理逻辑定义在create方法中,该方法通过依赖注入自动装配了一个名为logisticsService的LogisticsService服务,并调用服务的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/

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

54.png


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

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

55.png


相关文章
|
4月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
745 3
|
2月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
2月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
6月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
421 102
|
4月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
511 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
9月前
|
NoSQL MongoDB 微服务
微服务——MongoDB实战演练——文章评论的基本增删改查
本节介绍了文章评论的基本增删改查功能实现。首先,在`cn.itcast.article.dao`包下创建数据访问接口`CommentRepository`,继承`MongoRepository`以支持MongoDB操作。接着,在`cn.itcast.article.service`包下创建业务逻辑类`CommentService`,通过注入`CommentRepository`实现保存、更新、删除及查询评论的功能。最后,新建Junit测试类`CommentServiceTest`,对保存和查询功能进行测试,并展示测试结果截图,验证功能的正确性。
199 2
|
9月前
|
NoSQL Java MongoDB
微服务——MongoDB实战演练——文章评论实体类的编写
本节主要介绍文章评论实体类的编写,创建了包`cn.itcast.article.po`用于存放实体类。具体实现中,`Comment`类通过`@Document`注解映射到MongoDB的`comment`集合,包含主键、内容、发布时间、用户ID、昵称等属性,并通过`@Indexed`和`@CompoundIndex`注解添加单字段及复合索引,以提升查询效率。同时提供了Mongo命令示例,便于理解和操作。
162 2
|
9月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——MongoTemplate实现评论点赞
本节介绍如何使用MongoTemplate实现评论点赞功能。传统方法通过查询整个文档并更新所有字段,效率较低。为优化性能,采用MongoTemplate对特定字段直接操作。代码中展示了如何利用`Query`和`Update`对象构建更新逻辑,通过`update.inc(&quot;likenum&quot;)`实现点赞数递增。测试用例验证了功能的正确性,确保点赞数成功加1。
192 0
|
9月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
155 0
|
6月前
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
507 9