ruoyi-cloud 服务间的调用,OpenFeign的使用

news2024/11/22 22:14:55

1. 在公共包内添加实体类

请添加图片描述

2.在 com.ruoyi.common.core.constant 添加如下代码

package com.ruoyi.common.core.constant;
public class ServiceNameConstants
{
    /**
     * 药材服务的serviceid (生产者 nacos内注册应用名)
     */
    public static final String DRUG_SERVICE = "ruoyi-drug";
}

ruoyi-api\ruoyi-api-system\src\main\java\com\ruoyi\system\api创建 RemoteDrugService

package com.ruoyi.system.api;

import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.factory.RemoteDrugFallbackFactory;
import com.ruoyi.system.api.factory.RemoteUserFallbackFactory;
import com.ruoyi.system.api.model.BDrug;
import com.ruoyi.system.api.model.LoginUser;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

/**
 * 药材服务
 * 
 * @author ruoyi
 */
@FeignClient(contextId = "remoteDrugService", value = ServiceNameConstants.DRUG_SERVICE, fallbackFactory = RemoteDrugFallbackFactory.class)
public interface RemoteDrugService
{
    /**
     * 通过药材名查询药材信息
     *
     * @param id 药材id
     * @param source 请求来源
     * @return 结果
     */
     // SecurityConstants.INNER  我使用了内部调用接口 所以不需要网关路由那一段url
    @GetMapping("/drug/{id}")
    public AjaxResult getDrugInfo(@PathVariable("id") Long id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}

ruoyi-api\ruoyi-api-system\src\main\java\com\ruoyi\system\api\factory创建 RemoteDrugFallbackFactory

package com.ruoyi.system.api.factory;

import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.system.api.RemoteDrugService;
import com.ruoyi.system.api.domain.SysUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;

/**
 * 药材服务降级处理
 * 
 * @author ruoyi
 */
@Component
public class RemoteDrugFallbackFactory implements FallbackFactory<RemoteDrugService>
{
    private static final Logger log = LoggerFactory.getLogger(RemoteDrugFallbackFactory.class);

    @Override
    public RemoteDrugService create(Throwable throwable)
    {
        log.error("药材服务调用失败:{}", throwable.getMessage());
        return new RemoteDrugService()
        {
            @Override
            public AjaxResult getDrugInfo(Long id, String source)
            {
                return AjaxResult.error("获取药材失败:" + throwable.getMessage());
            }
        };
    }
}

3. 在消费者启动类 添加扫描包路径

不然和报如下图所示错误nested exception is java.lang.IllegalStateException: No fallbackFactory instance of type class xxxxxxFallbackFactory found for feign client xxxService

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sciGenuineController': Unsatisfied dependency expressed through field 'sciGenuineService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sciGenuineServiceImpl': Unsatisfied dependency expressed through field 'remoteDrugService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.ruoyi.system.api.RemoteDrugService': Unexpected exception during bean creation; nested exception is java.lang.IllegalStateException: No fallbackFactory instance of type class com.ruoyi.system.api.factory.RemoteDrugFallbackFactory found for feign client remoteDrugService
@SpringBootApplication(scanBasePackages = {"com.ruoyi.genuine","com.ruoyi.system"})
//com.ruoyi.genuine 是我自己的包名字(消费者)

service层

package com.ruoyi.genuine.service.impl;

@Service
public class SciGenuineServiceImpl implements ISciGenuineService 
{
....
	 @Autowired
     private RemoteDrugService remoteDrugService;
...
    @Override
    public BDrug selectBdrugById(Long id)
    {
        AjaxResult drugInfoResult = remoteDrugService.getDrugInfo(id, SecurityConstants.INNER);
     
        if (StringUtils.isNull(drugInfoResult) || StringUtils.isNull(drugInfoResult.get("data")))
        {
            throw new ServiceException("药材:" + id + " 不存在");
        }
        if ("200" == drugInfoResult.get("code"))
        {
            throw new ServiceException((String) drugInfoResult.get("msg"));
        }
        Object o = drugInfoResult.get(AjaxResult.DATA_TAG);
        BDrug dburg = JSON.parseObject(JSON.toJSONString(o), new TypeReference<BDrug>() { });

        return dburg;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI极客日报0818 - AI帮助中风患者重新行走

&#x1f440;AI 日报合集 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 有了人工智能&#xff0c;似乎没有什么是我们解决不了的。人工智能的一项新突破让瘫痪的中风幸存者能够通过“智能裤子”再次行走。让我们深入了解…… 今日要点: **&#x1f456;惊艳&#xff01…

QT实现天气预报

1. MainWindow类设计的成员变量和方法 public: MainWindow(QWidget* parent nullptr); ~MainWindow(); protected: 形成文本菜单来用来右键关闭窗口 void contextMenuEvent(QContextMenuEvent* event); 鼠标被点击之后此事件被调用 void mousePressEvent(QMouseEv…

系统架构设计师之软件架构风格

系统架构设计师之软件架构风格

学习心得02:QT6

以前也多少接触过QT。只是因为工作并不需要深入了解&#xff0c;所以是简单试用。现在有时间了&#xff0c;专门买了本书&#xff0c;从头到尾看了一番。因为是补充知识&#xff0c;所以范例、操作也没有实际操作。 QT使用的语言是C。比较特殊的地方是信号和槽。

11----图片

在Markdown中&#xff0c;可以通过简单的语法插入图片。 一、普通的添加图片&#xff1a;![图片描述](图片链接) 下面的代码&#xff0c;在上一节生成超链接的代码&#xff08;链接到网站&#xff09;前面添加一个感叹号(!)&#xff0c;同时把链接换成图片地址。 其中&#xf…

[PCIE 5.0] 第5代PCIe SSD 发展前沿(2023 Q2 更新)

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,禁止转载,如有误请留言。 1 什么是 PCIe 5.0? 第 5 代快速周边组件互连称为 PCI Express 5.0。它也称为第 5 代 PCIe、PCIe 5、PCI v5 或简称为 PCIe 5.0。 2 PCIE5.0 速度 2.1 PCIE5.0 极限速度 从PCIe 4.0更新到…

【NX】NX二次开发BlockUI集列表的详细使用步骤

最近使用NX二次开发&#xff0c;需要用到集列表&#xff0c;也就是SetList这个控件&#xff0c;然而网上相关的资料和范例实在是太少&#xff0c;有幸找到《NX二次开发-BlockUI集列表的使用技巧》和《UG&#xff08;NX&#xff09;二次开发 BlockUI 集列表使用方法》&#xff0…

vite+vue3 自动按需导入element-plus

安装element npm install element-plus自动导入 安装自动导入的插件: npm install -D unplugin-vue-components unplugin-auto-import配置 vite.config.js文件&#xff1a; import { defineConfig } from vite import AutoImport from unplugin-auto-import/vite import C…

Axios使用CancelToken取消重复请求

处理重复请求&#xff1a;没有响应完成的请求&#xff0c;再去请求一个相同的请求&#xff0c;会把之前的请求取消掉 新增一个cancelRequest.js文件 import axios from "axios" const cancelTokens {}export const addPending (config) > {const requestKey …

陕西科技大学改考408!附考情分析

改考信息 8月14日&#xff0c;陕西科技大学公布了2024年硕士研究生招生目录&#xff08;初稿&#xff09;&#xff0c;其中不难发现083500软件工程初试专业课由819数据结构改为408计算机学科专业基础 图片&#xff1a;陕西科技大学24专业目录-软件工程学硕 https://yjszs.sus…

Vue组件库 (一):Element常用组件

Element基于Vue2.0的桌面端组件库 组件&#xff1a;组成网页的部件。例如超链接、图片、按钮等。 一、环境配置 1、下载element 在vscode工程终端下下载。一定要注意&#xff1a;是在工程下安装&#xff01; npm install element -ui2.15.3 出现以下问题&#xff1a; 经判…

基于Spring Boot的机场VIP客户管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的机场VIP客户管理系统的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java s…

泰迪大数据挖掘建模平台功能特色介绍

大数据挖掘建模平台面相高校、企业级别用户快速进行数据处理的建模工具。 大数据挖掘建模平台介绍 平台底层算法基于R语言、Python、Spark等引擎&#xff0c;使用JAVA语言开发&#xff0c;采用 B/S 结构&#xff0c;用户无需下载客户端&#xff0c;可直接通过浏览器进行…

水库信息化综合管理系统解决方案

一、系统概述 水库综合信息化管理系统主要对水库坝址以上流域、工程本身、下游受益区及相关区的实时气象、水情、工情、旱情、洪涝灾情&#xff0c;以及社会经济和自然环境等信息自动化实时采集&#xff0c;构建一站式的水库信息公共平台&#xff0c;通过多功能完善的系统软件和…

C# Windows登录界面进行截图,控制鼠标键盘等操作实现(一)

首先常规的账户进程是没办法获取登录界面的信息的&#xff0c;因为登录界面已经不在某个账户下了&#xff0c;登录界面显示了每一个账户的切换。所以得使用System权限的进程。 那么Windows系统究竟是怎么将登录界面与用户桌面隔离开的呢&#xff1f;首先先通过一些Windows操作系…

Linux系统编程4(进程信号详解)

你知道为什么当程序中出现除0就会引发程序崩溃退出吗&#xff1f;你知道为何在Linux中输入kill -9 pid 就能杀死进程id为pid的进程吗&#xff1f;这篇文章将详细探讨解答这些问题&#xff0c;文章内容比较长&#xff0c;大家可以收藏慢慢看 什么是信号 在进程间通信这篇文章中…

一百五十九、Kettle——Kettle9.2通过配置Hadoop clusters连接Hadoop3.1.3(踩坑亲测、附流程截图)

一、目的 由于kettle的任务需要用到Hadoop&#xff08;HDFS&#xff09;&#xff0c;所以就要连接Hadoop服务。 之前使用的是kettle9.3&#xff0c;由于在kettle新官网以及博客百度等渠道实在找不到shims的驱动包&#xff0c;无奈换成了kettle9.2&#xff0c;kettle9.2的安装…

【Apollo学习笔记】—— Planning模块

前言 本文记录学习planning模块时的一些笔记&#xff0c;总体流程参照https://zhuanlan.zhihu.com/p/61982682中的流程图&#xff0c;如上图所示。 planning_component modules/planning/planning_component.cc PlanningComponent::Init部分首先完成规划模式的选择&#xff…

ArcGIS 利用cartogram插件制作变形地图

成果图 注&#xff1a;本图数据并不完全对&#xff0c;只做为测试用例 操作 首先需要下载一个插件cartogram 下载地址在这里 https://www.arcgis.com/home/item.html?idd348614c97264ae19b0311019a5f2276 下载完毕之后解压将Cartograms\HelpFiles下的所有文件复制到ArcGIS…

LeetCode(力扣)257. 二叉树的所有路径Python

LeetCode257. 二叉树的所有路径 题目链接代码 题目链接 https://leetcode.cn/problems/binary-tree-paths/ 代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.…