SpringCloud-远程调用OpenFeign-基本使用

目录

1 直接使用RestTemplate发起Http请求

1.1 将RestTemplate注册为SpringBean

1.2 在service实现类中注入RestTemplate

1.3 使用注入的RestTemplate 传入参数后发起http请求 

2 引入Nacos后使用RestTemplate发起Http请求

2.1 基础知识

2.2 Nacos的使用

2.2.1 引入nacos discovery依赖(单个project一般在父工程的pom中引入)

 2.2.2 在服务中的配置文件application.yaml 中配置Nacos地址。

2.2.3 启动服务即可被注册中心扫描到,(同一个服务多个实例也会被扫描到)

2.3 在Nacos基础上通过RestTemplate发起Http请求

3 基于OpenFeign发起远程请求

3.1 OpenFeign 准备工作

3.1.1 引入依赖

3.1.2 向启动类中加上@EnableFeignClients注解,启动OpenFeign功能,第三个注解

 3.2 编写FeignClient

3.2.1 创建对应的Client类,如ItemClient类,用来处理对应的请求,如下示例就是处理根据ids查询商品的请求

3.2.2 之前service的实现类中的代码变更如下

4 OpenFeign拓展


单体架构变为微服务架构需要解决的问题之一就是各个微服务间的通信问题,解决方法就是发送http请求,过程如下示例图 

若对其他基础知识不感兴趣请转3 基于OpenFeign发起远程请求

1 直接使用RestTemplate发起Http请求

不引入其他依赖,直接使用RestTemplate发起Http请求实现远程调用的方法(不推荐,只适合微服务单一实体情况

1.1 将RestTemplate注册为SpringBean

在启动类中加入以下代码

@SpringBootApplication
public class CartApplication {
    public static void main(String[] args) {
        SpringApplication.run(CartApplication.class, args);
    }
    //加入下面的代码
    @Bean
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }
}

1.2 在service实现类中注入RestTemplate

如下图

1.3 使用注入的RestTemplate 传入参数后发起http请求 

下面是一个远程调用的方法获取购物车商品数据的示例方法:

 private void handleCartItems(List<CartVO> vos) {
        // 1.获取商品id
        Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
        
//        2利用RestTemplate
        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
                "http://localhost:8081/items?ids={ids}",  //http请求路径,
                HttpMethod.GET,    //请求类型,GET,PUT,POST,DELETE
                null,              //请求实体
                new ParameterizedTypeReference<List<ItemDTO>>() {
                },                 //返回数据的类型,此处通过new 一个对象传入结果类型
                Map.of("ids", CollUtil.join(itemIds, ","))  //讲数据拼接到请求路径中
        );

        if(!response.getStatusCode().is2xxSuccessful()){
            return;   //判断相应状态码,不成功直接结束
        }
        List<ItemDTO> items = response.getBody(); //没有结束则表示请求成功,获得响应数据

        // .....       其他后续操作
}

以上便是直接使用RestTemplate的过程,缺点在于若一个微服务有多个实例,或多个微服务时,无法快速做出合适的选择,不适合多变的情况。为解决这种情况,则引入注册中心Nacos。

2 引入Nacos后使用RestTemplate发起Http请求

在以上情况的基础下,引入注册中心(此处引用Nacos),实现多个服务,多个实例间的管理。

2.1 基础知识

服务治理中的三个角色分别是什么?

  • 服务提供者:暴露服务接口,供其它服务调用
  • 服务消费者:调用其它服务提供的接口
  • 注册中心:记录并监控微服务各实例状态,推送服务变更信息

消费者如何知道提供者的地址?

  • 服务提供者会在启动时注册自己信息到注册中心,消费者可以从注册中心订阅和拉取服务信息

消费者如何得知服务状态变更?

  • 服务提供者通过心跳机制向注册中心报告自己的健康状态,当心跳异常时注册中心会将异常服务剔除,并通知订阅了该服务的消费者

当提供者有多个实例时,消费者该选择哪一个?

  • 消费者可以通过负载均衡算法,从多个实例中选择一个

2.2 Nacos的使用

首先需要安装注册中心Nacos,请根据自己的平台进行安装(docker或者本机)安装以后注意ip,此处省略安装过程。

通过  (服务器ip:8848/nacos) 访问或者 (localhost:8848/nacos) 访问。默认账号密码都是nacos

安装以后的使用步骤

2.2.1 引入nacos discovery依赖(单个project一般在父工程的pom中引入)

<!--nacos 服务注册发现-->
 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

 2.2.2 在服务中的配置文件application.yaml 中配置Nacos地址。

如商品服务item-service为例:

spring:
  application:
    name: item-service #微服务名称
  cloud:
    nacos:
      server-addr: 172.16.121.128:8848    #nacos的地址

2.2.3 启动服务即可被注册中心扫描到,(同一个服务多个实例也会被扫描到)

2.3 在Nacos基础上通过RestTemplate发起Http请求

现在注册中心配置完以后,若想发起远程调用,过程如下

  1. 根据微服务名称获得实例列表
  2. 负载均衡,选择其中一个实例
  3. 获取uri,
  4. RestTemplate发起请求

之前的代码变更如下

// private final  RestTemplate restTemplate;
// private  final DiscoveryClient discoveryClient;
//别忘了在实现类中引入上面两个Bean

private void handleCartItems(List<CartVO> vos) {
// 1.获取商品id
        Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
//       2 整个过程
//       2.1根据服务名称获取实例列表
        List<ServiceInstance> instances = discoveryClient.getInstances("item-service");
        if (CollUtils.isEmpty(instances)){
            return;                    //确保通过微服务名称获取到实例,实例列表不为空
         }
//      2.2手写负载均衡 获得实例
        ServiceInstance serviceInstance = instances.get(RandomUtil.randomInt(instances.size()));  //负载均衡算法获取其中一个实例
//      2.3 获取uri  
        URI uri = serviceInstance.getUri();    

//      2.4 利用RestTemplate发起请求
        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
                uri+"/items?ids={ids}",  //http请求路径,
                HttpMethod.GET,    //请求类型,GET,PUT,POST,DELETE
                null,              //请求实体
                new ParameterizedTypeReference<List<ItemDTO>>() {
                },                 //返回数据的类型,此处通过new 一个对象传入结果类型
                Map.of("ids", CollUtil.join(itemIds, ","))  //讲数据拼接到请求路径中
        );

        if(!response.getStatusCode().is2xxSuccessful()){
            return;   //判断相应状态码,不成功直接结束
        }
        List<ItemDTO> items = response.getBody(); //没有结束则表示请求成功,获得响应数据

        // .....       其他后续操作
}

到这里会有人发问,为什么引入Nacos还麻烦了?!

是的多了两步,通过名称找到实例列表,然后选取实例,然后发送请求。是麻烦了一点,但是解决了普通RestTemplate能向单一实例发送请求的问题, 引入Nacos可以通过负载均衡向多实例发起请求。

但是很显然这么麻烦并不符合开发需求,因此引入OpenFeign。

3 基于OpenFeign发起远程请求

OpenFeign是一个声明式的http客户端,是SpringCloud在Eureka公司开源的Feign基础上改造而来,是为了简化微服务间远程请求。

3.1 OpenFeign 准备工作

3.1.1 引入依赖

一般将依赖引入单独的api module下,若不理解这个单独的module,可看下一篇拓展文章

<!--OpenFeign依赖-->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡依赖-->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

3.1.2 向启动类中加上@EnableFeignClients注解,启动OpenFeign功能,第三个注解

@MapperScan("com.hmall.cart.mapper")
@SpringBootApplication
@EnableFeignClients(basePackages = "com.hmall.api.client")
public class CartApplication {
    public static void main(String[] args) {
        SpringApplication.run(CartApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }
}

 3.2 编写FeignClient

准备工作完成以后,就可以编写FeignClient了,如下图,之前购物车服务需要通过RestTemplate向商品服务发起请求,现在编写ItemClient 商品Feign客户端,来处理此请求,不再需要RestTemplate了。

3.2.1 创建对应的Client类,如ItemClient类,用来处理对应的请求,如下示例就是处理根据ids查询商品的请求

3.2.2 之前service的实现类中的代码变更如下

请求购物车商品的复杂代码变的很简单

//不再需要注入其他Bean 直接注入ItemClient
//直接注入微服务对应的Client Bean !!!

private final ItemClient itemClient;

//注入Bean 不再需要RestTemplate和DiscoveryClient了,只需要上面的itemClient即可
private void handleCartItems(List<CartVO> vos) {
//      1.获取商品id
        Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
//      2. 直接调用Client 中的方法即可发起请求
        List<ItemDTO> items = itemClient.queryItemByIds(itemIds);//直接调用方法获得数据

        if (CollUtils.isEmpty(items)) {
            return;     //判断数据是否为空 空则直接结束
        }

        //...后续其他操作

    }

通过以上你便可掌握微服务间通过OpenFeign快速简单的发起请求获得数据。简单很多,不再需要自己选择实例,不用自己做负载均衡,简单便捷。

4 OpenFeign拓展

OpenFeign 拓展讲解icon-default.png?t=N7T8https://blog.csdn.net/weixin_49418695/article/details/139549013?spm=1001.2014.3001.5501

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hvv--知攻善防应急响应靶机--Linux2

HW–应急响应靶机–Linux2 所有靶机均来自 知攻善防实验室 靶机整理&#xff1a; 夸克网盘&#xff1a;https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘&#xff1a;https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP&#xff1a;https://mp.weixin.…

Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

&#x1f340;简介 Options是.net Core Web api框架自带的功能&#xff0c;Options模式通过定义强类型的类来表示相关配置设置的集合&#xff0c;使得配置管理更为结构化和类型安全。 IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许…

Jenkins三种构建类型

目录 传送门前言一、概念二、前置处理&#xff08;必做&#xff09;1、赋予777权限2、让jenkins用户拥有root用户的kill权限3、要运行jar包端口号需要大于1024 三、自由风格软件项目&#xff08;FreeStyle Project&#xff09;&#xff08;推荐&#xff09;三、Maven项目&#…

【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常

【问题分类】驱动使用 【关键字】OCI、驱动使用、PHP 【问题描述】 PHP使用OCI8连接yashan数据库&#xff0c;使用绑定参数获取数据时&#xff0c;出现报错 如果使用PDO_OCI接口连接数据库&#xff0c;未弹出异常&#xff0c;但是无法正确获取数据 【问题原因分析】 开启O…

springcloud第4季 分布式事务seata作用服务搭建

一 seata作用 1.1 作用 二 seata服务端搭建 2.1 seata搭建 2.2.1 seata 服务端下载安装 下载地址&#xff1a; Seata-Server下载 | Apache Seata 截图如下&#xff1a; 2.2.2 使用mysql初始化seata所需表 1.下载脚本地址&#xff1a;incubator-seata/script/server/db/…

2024最新D卷 华为OD统一考试题库清单(按算法分类),如果你时间紧迫,就按这个刷

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

Nas实现软路由OpenWrt安装

文章目录 基本配置步骤 基本配置 NAS&#xff1a;TS-264C 宇宙魔方 步骤 1.下载软路由OpenWrt 下载地址&#xff1a;https://openwrt.org/ 2.下载好以后&#xff0c;需要下载虚拟盘转换工具&#xff08;StarWind V2V Convert&#xff09; 下载地址&#xff1a;https://…

大模型与知识智能:心理疾病治疗的新希望

前言 随着社会的发展&#xff0c;心理疾病已成为一个日益突出的问题。据《柳叶刀》杂志的系统性综述显示&#xff0c;疫情之后&#xff0c;全世界抑郁症与焦虑症的患病率上升超过25%&#xff0c;其中青少年心理健康的影响最大。此外&#xff0c;2021年国内的精神障碍报告显示&…

Docker 镜像库国内加速的几种方法

在国内&#xff0c;拉取 Docker 镜像速度慢 / 时不时断线 / 无账号导致限流等&#xff0c;比较痛苦。 这里提供几个当前可用的镜像仓库&#xff0c;更新到/etc/docker/daemon.json即可。 更新完记得运行&#xff1a; sudo systemctl daemon-reload sudo systemctl restart …

以keepalived为例说明程序不能正常被gdb调试的原因

现象 通过gdb att $keepalived_pid发起对当前运行keepalived的调试&#xff1b; 在放行keepalived继续执行后&#xff0c;想通过CtrlC按键中断执行&#xff0c;观察下被调试程序的当前内部状态&#xff0c; 但是&#xff0c;在终端输入CtrlC后&#xff0c;导致keepalived被调…

一般简单的功能使用GIS 服务器工具还需要进行扩展开发吗?

有网友困惑怎么使用了我们的 GIS 服务器工具&#xff0c;一些简单的功能需不需要对服务器进行扩展开发&#xff1f;下面我们首先看一下标准GIS WEB服务器例如GEOSERVER&#xff0c;QGISSERVER、GIS数据快捷共享发布工具&#xff08;建立自己的地图网站&#xff09;及其它一些商…

Python虚拟环境的配置

前言&#xff1a; 本人一度被Python的虚拟环境的配置所困扰&#xff0c;前段时间抽空学习了一下&#xff0c;现在总结一下方法&#xff0c;供大家参考。 先使用winr打开命令行窗口。 展示所有虚拟环境 conda env list 创建虚拟环境 例如我们创建一个叫做py_sk的虚拟环境 …

【数据结构】遍历二叉树(递归思想)-->赋源码

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 二叉树遍历是指按照一定的顺序访问二叉树中的每个节点&#xff0c;使得每个节点恰好被访问一次。遍历是二叉树上最重要的运算之一&#xff0c;是二叉树上进行其他运算的基础。 一、二叉树遍历概念 二叉树遍历分类 …

Windows 11 中安装 Docker Desktop 并安装镜像

本该主要介绍在 Windows 11 中安装 Docker Desktop 时的一些准备工作&#xff0c;以及该如何下载和安装&#xff0c;然后分别使用管理界面和 Docker 命令安装两个镜像。 一、准备工作 在 Windows 11 中安装 Docker Desktop 前&#xff0c;需要做一些准备。打开 【Windows 功能…

大模型是什么?能干嘛?怎么学?

引言 随着人工智能技术的飞速发展&#xff0c;大模型研究已成为该领域的一大热点。这些研究覆盖了众多方向&#xff0c;每个方向都面临着独特的研究焦点和挑战。本文将逐一探讨一些备受关注的研究方向&#xff0c;包括检索增强生成RAG、大模型Agent、Mamba、MoE、LoRA等&#…

字符数组基础知识及题目

死识。。。 字符该如何存储呢&#xff1f;这一点我们在以前就接触过了。用char来存储。 如何输入一个单词呢&#xff1f; char a[10002]; scanf("%s",a); 就不用地址符了。 如何输入句子呢&#xff1f; char a[100002]; gets(a); gets是读入句子的&#xff0c…

如何阅读?从阅读中学阅读—《海绵阅读法》

大家好&#xff0c;我是老三&#xff0c;最近读了《海绵阅读法&#xff1a;如何吸收一本书的精华》&#xff0c;第一次阅读教如何阅读的书&#xff0c;整理一番读书笔记&#xff0c;分享给大家。 读书动机 我前一阵子写了篇文章&#xff0c;2024Q1&#xff0c;盘点我看过的54本…

防止Selenium被检测 Google Chrome 125

背景 最近在使用selenium自动播放学习课程&#xff0c;相信大家也有一些类似的使用场景。 能自动化的事情&#xff0c;绝不自己干。 为防止被检测是机器人做题&#xff0c;刷视频&#xff0c;需要做一些小调整。 先来看作为服务方维护者&#xff0c;是如何检测是Selenium打…

【算法-力扣】73.矩阵置零,一文彻底搞懂!

目录 一、题目描述 二、解题思路 三、参考答案 一、题目描述 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 进阶&#xff1a; 一个直观的解决方案是使用 O(mn) 的额外空间&#x…

甄嬛传熹贵妃上户口:如果让他陪你过冬天,那朕能不能睡中间?贝叶斯模型推导爸爸去哪儿

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 背景 《甄嬛传》是大家耳熟能详的宫廷剧&#xff0c;其中复杂的宫斗情节和深刻的人物刻画让人津津乐道。甄嬛因为与皇帝(四郎)闹翻了&#xff0c;去甘露寺待了一段时间&#x…