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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 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


相关文章
|
1月前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
71 4
|
2月前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
109 1
|
3月前
|
Dubbo Java 应用服务中间件
微服务框架Dubbo环境部署实战
微服务框架Dubbo环境部署的实战指南,涵盖了Dubbo的概述、服务部署、以及Dubbo web管理页面的部署,旨在指导读者如何搭建和使用Dubbo框架。
260 17
微服务框架Dubbo环境部署实战
|
3月前
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
621 2
|
3月前
|
运维 持续交付 API
深入理解并实践微服务架构:从理论到实战
深入理解并实践微服务架构:从理论到实战
143 3
|
3月前
|
自然语言处理 Java 网络架构
解锁跨平台微服务新纪元:Micronaut与Kotlin联袂打造的多语言兼容服务——代码、教程、实战一次打包奉送!
【9月更文挑战第6天】Micronaut是一款轻量级、高性能的Java框架,适用于微服务开发。它支持Java、Groovy和Kotlin等多种语言,提供灵活的多语言开发环境。本文通过创建一个简单的多语言兼容服务,展示如何使用Micronaut及其注解驱动特性实现REST接口,并引入国际化支持。无论是个人项目还是企业应用,Micronaut都能提供高效、一致的开发体验,成为跨平台开发的利器。通过简单的配置和代码编写,即可实现多语言支持,展现其强大的跨平台优势。
54 3
|
3月前
|
运维 监控 持续交付
深入浅出:微服务架构的设计与实战
微服务,一个在软件开发领域如雷贯耳的名词,它代表着一种现代软件架构的风格。本文将通过浅显易懂的语言,带领读者从零开始了解微服务的概念、设计原则及其在实际项目中的运用。我们将一起探讨如何将一个庞大的单体应用拆分为灵活、独立、可扩展的微服务,并分享一些实践中的经验和技巧。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
82 3
|
4月前
|
消息中间件 缓存 Kafka
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
|
4月前
|
监控 Cloud Native 开发者
云端精英的.NET微服务秘籍:Azure上的创新实战演练
【8月更文挑战第28天】在现代软件开发中,微服务架构通过分解应用程序提升可维护性和扩展性。结合Azure与.NET框架,开发者能轻松打造高效且易管理的云原生微服务。首先,使用Docker容器化.NET应用,并借助Azure Kubernetes Service(AKS)或Azure Container Instances(ACI)部署。为确保高可用性和伸缩性,可利用Azure Traffic Manager负载均衡及Azure Autoscale动态调整实例数。
31 0
|
4月前
|
消息中间件 SQL 关系型数据库
go-zero微服务实战系列(十、分布式事务如何实现)
go-zero微服务实战系列(十、分布式事务如何实现)