【springcloud学习(dalston.sr1)】使用Feign实现接口调用(八)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一)

(一)Feign的理解

前面文章【springcloud学习(dalston.sr1)】服务消费者通过restTemplate来访问服务提供者(含源代码)(五)里提到了通过restTemplate进行接口调用,这里有个不好的地方,就是不同的接口,都需要手写restTemplate来调用,且需要自己实现返回结果的处理,自己转换json数据到实体类,且需要手工指定不同的请求类型(post、get、delete、put),极为不方便。

我们知道像mybaitis,我们直接声明一个DAO接口,结合mapper.xml文件,就能访问数据库了。那么访问http的URL,能否也声明一个接口,就能实现http请求的访问呢?答案是肯定的,feign就可以用来实现这个需求。

(二)通过Feign来实现http请求的访问

(1)首先我们在microservicecloud-api项目中,新建一个接口GoodsClientService,注意这个接口我们加了注解FeignClient,并且这个注解里,我们指定了服务名称为MICROSERVICECLOUD-GOODS。然后在其getGoods方法里,我们也加入了熟悉的GetMapping注解,并设置了请求的url为/goods/list

package com.company.api.service;import com.company.api.entity.Goods;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;import java.util.List;@FeignClient(value = "MICROSERVICECLOUD-GOODS", fallbackFactory = GoodsClientServiceFallbackFactory.class)
public interface GoodsClientService {@GetMapping("/goods/list")List<Goods> getGoods();
}

因为在前面microservicecloud-provider-8001项目中,我们有在controller提供这个http接口

(2)新建一个microservicecloud-consumer-feign模块,类似于microservicecloud-consumer-80项目,同样作为消费者,其整体结构如下:

(4)修改POM文件,增加其相关依赖(注意这个项目依赖于前面提到的microservicecloud-api的接口,所以需要引入microservicecloud-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>springcloud2025</artifactId><groupId>com.company</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>microservicecloud-consumer-feign</artifactId><dependencies><dependency><groupId>com.company</groupId><artifactId>microservicecloud-api</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Feign相关支持 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency><!-- ribbon相关 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency></dependencies>
</project>

(5)新增application.yml配置文件

server:port: 80eureka:client:register-with-eureka: false #false表示不向注册中心注册自己service-url:defaultZone: http://localhost:7001/eureka/ #http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/#启用服务降级
feign:hystrix:enabled: true

(7)新增启动类和配置类

启动类

package com.company.consumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;//这里需要手动制定包扫描路径,否则识别不到API项目中的GoodsClientServiceFallbackFactory,导致项目无法启动
@SpringBootApplication(scanBasePackages = {"com.company.consumer","com.company.api.service"})
@EnableEurekaClient
@EnableFeignClients(basePackages = "com.company.api.service")
//因为Feign接口在另一个API项目中,且API项目的包和当前项目有点不一样,所以需要加上扫描包的范围,确保能扫描到
public class Consumer80FeignApplication {public static void main(String[] args) {SpringApplication.run(Consumer80FeignApplication.class, args);}
}

这里需要注意的是启动类上面@EnableFeignClients(basePackages = "com.company.api.service"),需要能扫描到前面提到的microservicecloud-api项目中的接口GoodsClientService

配置类

package com.company.consumer.config;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class ConfigBean {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}/*** 设置ribbon负载均衡的算法,默认是轮询算法,也即每个都轮询一次。* @return*/@Beanpublic IRule myRule() {return new RoundRobinRule(); //默认是轮询算法,也即每个都轮询一次。// return new RandomRule(); //现在采用随机的算法// return new RetryRule(); //如果provider都是正常的话,则轮询。如果有1个不可用的话,则在尝试几次失败后,会自动轮询能正常使用的服务}
}

然后在控制器controller

package com.company.consumer.controller;import com.company.api.entity.Goods;
import com.company.api.service.GoodsClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import java.util.List;@RestController
@RequestMapping("/consumer")
public class GoodsConsumerContrller {//private static final String REST_URL_PREFIX = "http://localhost:8001";private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-GOODS";@Autowiredprivate GoodsClientService goodsClientService;@Autowiredprivate RestTemplate restTemplate;@GetMapping("/goods/list")public List<Goods> getGoods() {return restTemplate.exchange(REST_URL_PREFIX + "/goods/list", HttpMethod.GET,null,   new ParameterizedTypeReference<List<Goods>>(){}).getBody();}@GetMapping("/goods/list/feign")public List<Goods> getGoodsByFeign() {return goodsClientService.getGoods();}
}

注意:我们前面在microservicecloud-api项目中定义了一个接口GoodsClientService,需要注入到controller中,然后就可以使用该接口,调用getGoods方法,来实现对microservicecloud-provider-8001项目的对应接口的调用。

(三)前面准备工作做好后,我们可以启动相关服务了,按照如下顺序,依次启动服务microservicecloud-eureka-7001 作为eureka注册服务端

microservicecloud-provider-8001 作为eureka 客户端,同时作为服务提供者

microservicecloud-consumer-feign 作为eureka 客户端,同时作为服务消费者

(四)启动正常后,我们在浏览器地址栏输入localhost/consumer/goods/list/feign

通过打断点,确认调用的是GoodsClientService接口,如图

然后放行该断点,在浏览器看到响应即为正常。如下图。这说明我们可以通过GoodsClientService接口来完成相关接口的调用(直接声明个接口,避免了通过restTemplate硬编码)

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

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

相关文章

SpringbBoot nginx代理获取用户真实IP

为了演示多级代理场景&#xff0c;我们分配了以下服务器资源&#xff1a; 10.1.9.98&#xff1a;充当客户端10.0.3.137&#xff1a;一级代理10.0.4.105&#xff1a;二级代理10.0.4.129&#xff1a;三级代理10.0.4.120&#xff1a;服务器端 各级代理配置 以下是各级代理的基本配…

实验九视图索引

设计性实验 1. 创建视图V_A包括学号&#xff0c;姓名&#xff0c;性别&#xff0c;课程号&#xff0c;课程名、成绩&#xff1b; 一个语句把学号103 课程号3-105 的姓名改为陆君茹1&#xff0c;性别为女 &#xff0c;然后查看学生表的信息变化&#xff0c;再把上述数据改为原…

typeof运算符和深拷贝

typeof运算符 识别所有值类型识别函数判断是否是引用类型&#xff08;不可再细分&#xff09; //判断所有值类型 let a; typeof a //undefined const strabc; typeof str //string const n100; typeof n //number const …

NAT/代理服务器/内网穿透

目录 一 NAT技术 二 内网穿透/内网打洞 三 代理服务器 一 NAT技术 跨网络传输的时候&#xff0c;私网不能直接访问公网&#xff0c;就引入了NAT能讲私网转换为公网进行访问&#xff0c;主要解决IPv4(2^32)地址不足的问题。 1. NAT原理 当某个内网想访问公网&#xff0c;就必…

Git的安装和配置(idea中配置Git)

一、Git的下载和安装 前提条件&#xff1a;IntelliJ IDEA 版本是2023.3 &#xff0c;那么配置 Git 时推荐使用 Git 2.40.x 或更高版本 下载地址&#xff1a;CNPM Binaries Mirror 操作&#xff1a;打开链接 → 滚动到页面底部 → 选择2.40.x或更高版本的 .exe 文件&#xf…

【教程】Docker更换存储位置

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景说明 更换教程 1. 停止 Docker 服务 2. 创建新的存储目录 3. 编辑 Docker 配置文件 4. 迁移已有数据到新位置 5. 启动 Docker 服务 6…

PostgreSQL 配置设置函数

PostgreSQL 配置设置函数 PostgreSQL 提供了一组配置设置函数&#xff08;Configuration Settings Functions&#xff09;&#xff0c;用于查询和修改数据库服务器的运行时配置参数。这些函数为数据库管理员提供了动态管理数据库配置的能力&#xff0c;无需重启数据库服务。 …

sql server 2019 将单用户状态修改为多用户状态

记录两种将单用户状态修改为多用户状态&#xff0c;我曾经成功过的方法&#xff0c;供参考 第一种方法 USE master; GO -- 终止所有活动连接 DECLARE kill_connections NVARCHAR(MAX) ; SELECT kill_connections KILL CAST(session_id AS NVARCHAR(10)) ; FROM sys.dm_ex…

主机A向主机B发送一个长度为L字节的文件,假设TCP的MSS为1460字节,则在TCP的序号不重复使用的前提下,L的最大值是多少?

&#x1f4d8;题干回顾&#xff1a; 主机A向主机B发送一个长度为L字节的文件&#xff0c;假设TCP的MSS为1460字节&#xff0c;则在TCP的序号不重复使用的前提下&#xff0c;L的最大值是多少&#xff1f; 这个问题关键在于“TCP序号不重复使用”。 ✅ 正确答案是&#xff1a;D.…

一次因校时服务器异常引起的性能差异分析

一次因校时服务器异常引起的性能差异分析 一.背景知识1. **TSC 频率**:硬件级高精度计时2. **gettimeofday**:用户态时间接口3. **adjtimex**:系统时钟的软件校准4. **`clock_adjtime(CLOCK_REALTIME, {modes=ADJ_TICK})`**: 用于修改系统时钟中断间隔(`tick` 值)。5. 关系…

acwing 4275. Dijkstra序列

题目背景 输入 输出 完整代码 #include<bits/stdc.h> using namespace std; int n,m,k,a[1010],dist[1010],g[1010][1010],st[1010];int dij(int u){memset(st,0,sizeof st);memset(dist,0x3f,sizeof dist);dist[u]0;for(int i0;i<n;i){int ta[i];for(int j1;j<n;…

[思维模式-37]:什么是事?什么是物?什么事物?如何通过数学的方法阐述事物?

一、基本概念 1、事&#xff08;Event) “事”通常指的是人类在社会生活中的各种活动、行为、事件或情况&#xff0c;具有动态性和过程性&#xff0c;强调的是一种变化、发展或相互作用的流程。 特点 动态性&#xff1a;“事”往往涉及一系列的动作、变化和发展过程。例如&a…

Linux常用命令40——alias设置命令别名

在使用Linux或macOS日常开发中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;alias命令来自英文单词alias&#xff0c;中文译为“别名”&#xff0c;其功能是设置命令别名信息。我们可以使用alias将一些较长的命令进行简写&#xff0c;往往几十个字符的命令会变…

310. 最小高度树

题目 树是一个无向图&#xff0c;其中任何两个顶点只通过一条路径连接。 换句话说&#xff0c;任何一个没有简单环路的连通图都是一棵树。 给你一棵包含 n 个节点的树&#xff0c;标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表&#xff08;每一个边都…

Axure 纵向滚动隐藏滚动条 Axure 滑动开关(属性开关)on-off

文章目录 I 滑动开关(属性开关)操作说明block 矩形操作说明round小圆圈操作说明on-off 属性开关组合操作说明II Axure 纵向滚动隐藏滚动条思路包含图片的动态面板1操作说明包含动态面板的顶级动态面板I 滑动开关(属性开关)操作说明 block 矩形操作说明 在画布中添加一个矩形…

MySQL之基础事务

目录 引言&#xff1a; 什么是事务&#xff1f; 事务和锁 mysql数据库控制台事务的几个重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意图&#xff1a; 2.事务的隔离级别 四种隔离级别&#xff1a; 总结一下隔离指令 1. 查看当前隔离级别​​ …

VS Code 重磅更新:全新 MCP 服务器发现中心上线

目前各种 MCP 客户端层出不穷&#xff0c;但是安装 MCP 服务却格外繁琐&#xff0c;尤其 VS Code 中无界面化的 MCP 服务配置方式&#xff0c;效率较低。 Copilot MCP 是一个 VS Code 插件&#xff0c;在今天发布的新版本中&#xff0c;插件支持了自动发现与安装开源 MCP 服务…

智能家居“心脏“升级战:GD25Q127CSIG国产芯片如何重构家庭物联生态

在智能家居设备出货量突破10亿台的2023年&#xff0c;家庭网关正经历着前所未有的技术革新。作为连接云端与终端设备的中枢神经&#xff0c;智能网关的存储芯片选择直接决定着整个智能生态系统的运行效率。在这场技术升级浪潮中&#xff0c;兆易创新GD25Q127CSIG串行闪存芯片主…

R语言机器学习算法实战系列(二十五)随机森林算法多标签分组分类器及模型可解释性

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程内容加载必要的R包(带详细注释)1. 加载数据2. 数据分割(按Species分层抽样)3. 数据预处理配方4. 创建随机森林模型(多分类)5. 创建工作流6. 设置交叉验证和参数调优7. 参…

速查 Linux 常用指令 II

目录 一、网络管理命令1. 查看和配置网络设备&#xff1a;ifconfig1&#xff09;重启网络命令2&#xff09;重启网卡命令 2. 查看与设置路由&#xff1a;route3. 追踪网络路由&#xff1a;traceroute4. 查看端口信息和使用情况1&#xff09;netstat 命令2&#xff09;lsof 命令…