首页 > 其他分享 >OpenFeign实现微服务远程调用

OpenFeign实现微服务远程调用

时间:2024-07-16 19:54:59浏览次数:12  
标签:调用 服务 请求 OpenFeign springframework org import 日志 远程

跟着黑马微服务课程走的,是思路1,把不同服务的方法统一抽到一个公共模块中

在微服务中,如果一个服务需要请求另一个服务的接口,那么就会涉及到发起远程请求,但是手动发请求太麻烦,OpenFeign 提供了基于接口的声明式 REST 客户端,让开发者可以通过编写接口的方式来定义服务间的调用关系,而在实际执行时,OpenFeign 将根据这些定义自动生成代理对象,并处理请求的发送和接收。这种方式让开发者可以更加专注于业务逻辑的实现,而将远程调用的细节交给框架来处理。

OpenFeign 不一定非得配合服务发现/注册中心才能使用,但通常情况下,结合服务发现/注册中心可以更好地发挥 OpenFeign 的优势。这里使用Nacos作为服务发现注册中心。

1.创建模块

创建一个模块,假设命名为hm-api

其依赖如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>hmall</artifactId>
        <groupId>com.heima</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>hm-api</artifactId>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <!--open feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- load balancer-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!-- swagger 注解依赖 -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.6.6</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

2.编写客户端

在模块中创一个client包,用来存放我们的客户端,每一个服务写一个单独的客户端,书写方式与contrller十分类似

import com.hmall.api.dto.ItemDTO;
import com.hmall.api.dto.OrderDetailDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Collection;
import java.util.List;

@FeignClient("item-service")   //这个注解必须加,参数为nacos上的对应服务名
public interface ItemClient {

    //这里就按照controller里面写对应方法,注意把路径写全
    @GetMapping("/items")
    List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);

    @PutMapping("/items/stock/deduct")
    void deductStock(@RequestBody List<OrderDetailDTO> items);
}

发现实体类报错了,那就把需要的,原本服务里面的实体拿过来

3.改造原本服务代码

在原本服务的pom中导入我们新的模块

  <!--feign模块-->
  <dependency>
      <groupId>com.heima</groupId>
      <artifactId>hm-api</artifactId>
      <version>1.0.0</version>
  </dependency>

在原本服务的启动类上加上注解@EnableFeignClients

在Service中,注入我们需要的Client,使用时,直接调用我们写好的方法就行,openFeign会向对应的服务发送请求(注意要把对应服务给启动)

@Service
@RequiredArgsConstructor
public class PayOrderServiceImpl extends ServiceImpl<PayOrderMapper, PayOrder> implements IPayOrderService {

    // 如果用final,就加 @RequiredArgsConstructor 注解
    // 否则,就用@Autowired注解来注入

    private final UserClient userClient;    

    private final TradeClient tradeClient;


    @Override
    @Transactional
    public void tryPayOrderByBalance(PayOrderFormDTO payOrderFormDTO) {

        // 1.查询支付单
        PayOrder po = getById(payOrderFormDTO.getId());
        // 2.判断状态
        if(!PayStatus.WAIT_BUYER_PAY.equalsValue(po.getStatus())){
            // 订单不是未支付,状态异常
            throw new BizIllegalException("交易已支付或关闭!");
        }

        // 3.尝试扣减余额  这里调用到了其他服务的方法
        userClient.deductMoney(payOrderFormDTO.getPw(), po.getAmount());

        // 4.修改支付单状态
        boolean success = markPayOrderSuccess(payOrderFormDTO.getId(), LocalDateTime.now());
        if (!success) {
            throw new BizIllegalException("交易已支付或关闭!");
        }

        // 5.修改订单状态  这里也用到了其他服务的方法
        tradeClient.markOrderPaySuccess(po.getBizUserId());
    }
}

至此,就可以快捷的发送请求到别的服务了

4.日志配置

OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:

NONE:不记录任何日志信息,这是默认值。

BASIC:仅记录请求的方法,URL以及响应状态码和执行时间

HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

Feign默认的日志级别就是NONE,所以默认我们看不到请求日志。

在我们新建的模块下创建一个config包,定义一个日志配置类


import feign.Logger;
import org.springframework.context.annotation.Bean;

public class DefaultFeignConfig {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.FULL;
    }
}

如果想要日志级别在某一个Client中生效,那就在对应Client的接口类的注解中加入配置

@FeignClient(value = "your-service", configuration = DefaultFeignConfig.class)

如果想要全局生效,那就在服务中启动类的注解中配置

@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)

标签:调用,服务,请求,OpenFeign,springframework,org,import,日志,远程
From: https://blog.csdn.net/YinLiaoEr/article/details/140473324

相关文章

  • 2024-07-16升级问题:调用自带软件打开文件时 android.os.FileUriExposedException
    2024-07-16升级问题:调用手机自带软件打开文件时,出现以下问题:E/AndroidRuntime:FATALEXCEPTION:mainProcess:rs.tabletcropland,PID:10997android.os.FileUriExposedException:file:///storage/emulated/0/arcgis/%E7%9F%B3%E7%8B%AE%E5%B8%82/Attachment/%E7......
  • [Pnetlab实战演练]手把手教你配置华为防火墙的Telnet远程访问!
    实验介绍关于本实验网络管理员在维护网络过程中,经常需要登录很多设备,通过Console口登录每台设备比较困难,为方便维护与调试设备,通过在设备上配置远程登录功能,使远程管理员能够通过Telnet方式远程登录到设备上进行管理。实验目的通过本实验,掌握配置设备Telnet远程登录功......
  • 基于快照的异步远程复制介绍
    本文分享自天翼云开发者社区《基于快照的异步远程复制介绍》,作者:l****n1、简介:本文介绍了基于RBD快照的异步远程复制技术2、概念介绍:异步远程复制:通过定时的将业务端的数据同步到备份端,从而实现数据的备份和灾难恢复的技术;RBD快照:RBD快照是RBD在某一时刻全部数据的只读镜像......
  • 远程开发?启动!
    OJ项目需要用到远程开发,那今天让我们一起从0到1实现远程开发吧~文章目录1、安装VM2、下载ubantu镜像3、创建虚拟机并更改相关设置4、下载软件5、开启ssh服务6、安装Java环境7、远程开发方式一远程部署本地电脑编写代码文件同步运行项目部署项目远程调试程序远程开发方......
  • (02)Unity使用在线AI大模型(调用Python)
    目录一、概要二、改造Python代码三、制作Unity场景一、概要    查看本文需完成(01)Unity使用在线AI大模型(使用百度千帆服务)的阅读和实操,本文档接入指南的基础上使用Unity+C#调用百度千帆大模型,需要阅读者有一定的Unity开发基础。此功能本质上就是拿Python大模......
  • 本地代码推送远程仓库(gitee实例)
    https://www.cnblogs.com/shijiehaiyang/p/14147899.htmlhttps://www.cnblogs.com/maojunyi/p/7735723.html1.首先安装Git及Tortoisegit2.安装完成后手动创建.gitignore文件,用来排除不上传文件(如bin,obj等)3.在本地代码文件夹创建本地仓库4.提交master 5.创建远程仓库后,......
  • PySide6调用UI
    1.使用QUiloader加载fromPySide6.QtUiToolsimportQUiLoaderfromPySide6.QtWidgetsimportQApplication,QWidgetimportsysclassui_call(QWidget): def__init__(self): super().__init__() self.ui=QUiLoader().load('calltest.ui')if__name__=......
  • 模板——函数模板的基本语法和调用规则
    1.模板函数    1.1分为自动类型堆到和显示指定类型template<classT>voidSwapNum(T&a,T&b){ Ttemp=a; a=b; b=temp;}voidtest01(){ inta=10; intb=20; doublec=30.5; doubled=40.8; SwapNum(a,b);//自动类型推导 SwapNum<in......
  • Linux系统搭建轻量级个人博客VanBlog并一键发布公网远程访问
    文章目录前言1.Linux本地部署2.VanBlog简单使用3.安装内网穿透4.创建公网地址5.创建固定公网地址前言今天和大家分享如何在LinuxUbuntu系统搭建一款轻量级个人博客VanBlog,并结合cpolar内网穿透软件生成公网地址,轻松实现随时随地远程访问本地部署的站点。无需......
  • 从远程拉取分支并更新到本地方法1
    要一次性拉取远程仓库中所有分支的更新,通常使用以下方法:gitfetch:gitfetch 会获取远程仓库的所有分支,但不会合并到当前分支。这是最安全的方法,因为它不会改变你当前的工作状态。gitfetch--allgitpull:gitpull 通常用于当前分支的合并。要拉取并合并所有分支的......