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

news2024/11/29 8:53:25

目录

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.coloradmin.cn/o/1804477.html

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

相关文章

pytorch 自定义学习率更新 Poly

Poly 学习率调整策略需要继承_LRScheduler类&#xff0c;该类包含三个重要属性和两个重要方法 学习率与batch-size的关系 一般来说&#xff0c;batch-size的大小一般与学习率的大小成正比。batch-size越大一般意味着算法收敛方向的置信度越大&#xff0c;也可以选择较大的学…

四川赤橙宏海商务信息咨询有限公司引领抖音电商新纪元

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。作为电商领域的一匹黑马&#xff0c;四川赤橙宏海商务信息咨询有限公司凭借其专业的服务理念和创新的运营策略&#xff0c;在抖音电商领域崭露头角&#xff0c;成为行业内的佼佼者。 赤橙宏海商务…

coap:安装libcoap

# 称最新版的openssl 安装依赖东东 yum install -y libtool doxygen asciidoc perl-IPC-Cmd下载解压 cd /chz/install/openssl wget https://www.openssl.org/source/openssl-3.3.1.tar.gz tar zxvf openssl-3.3.1.tar.gz编译安装 cd /chz/install/openssl/openssl-3.3.1 .…

关于焊点检测(SJ-BIST)模块实现

关于焊点检测&#xff08;SJ-BIST&#xff09;模块实现 语言 &#xff1a;Verilg HDL 、VHDL EDA工具&#xff1a;ISE、Vivado、Quartus II 关于焊点检测&#xff08;SJ-BIST&#xff09;模块实现一、引言二、焊点检测功能的实现方法&#xff08;1&#xff09; 输入接口&#x…

服务部署:Linux系统部署C# .NET项目

1. 安装 .NET SDK 首先&#xff0c;你需要在你的 Linux 系统上安装 .NET SDK。 Ubuntu系统&#xff1a; 下载 Microsoft 包配置文件 wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb 这个命令使用 wge…

SpringCloud-OpenFeign拓展-连接池、最佳使用方法、日志输出

目录 1 OpenFeign连接池 1.1 常见连接类型 1.2 连接池使用方法 1.2.1 引入依赖 1.2.2 开启连接池功能 1.2.3 配置完成&#xff0c;重启实例即可&#xff0c;底层将更改设置。 2 OpenFeign最佳使用方法 2.1 每个微服务都是单独的project&#xff0c;内部有三个独立模块 …

go语言内置预编译 //go:embed xxx 使用详解

在go语言里面&#xff0c;我们可以使用一个“类注释”的语法来来让编译器帮助我们在编译的时候将一些文件或者目录读取到指定的变量中来供我们使用。 go:embed语法&#xff1a; //go:embed 文件或者目录路径 var 变量名 变量类型 说明&#xff1a; 文件或者目录路径 可以…

域内攻击 ---> AS-REP Roasting

今天&#xff0c;我们就来讲一下另外一种Roasting攻击 AS-REP Roasting 1.AS-REP Roasting原理 其实和kerberoasting一样&#xff0c;这种攻击也是一种暴力破解的攻击&#xff0c;完全取决于攻击者的字典。 但是不同于Kerberoasting&#xff0c;他不需要用户进行注册SPN&…

达梦8 探寻达梦排序原理:新排序机制(SORT_FLAG=1)

测试版本&#xff1a;--03134283938-20221019-172201-20018 达梦的排序机制由四个dm.ini参数控制&#xff1a; #maximum sort buffer size in Megabytes &#xff0c;有效值范围&#xff08;1~2048&#xff09; SORT_BUF_SIZE 100 #ma…

深圳中赢娱乐控股集团至江西省宜春市袁州区访问交流

2024年6月7日&#xff0c;深圳中赢娱乐控股集团受邀来到江西省宜春市袁州区就“短剧文旅”项目展开深度座谈&#xff0c;并与飞剑潭乡达成合作意向。 下午2:30&#xff0c;深圳中赢控股集团董事李平进带团队一行12人&#xff0c;访问宜春市袁州区&#xff0c;宜春市副市长谢萍、…

Java——数组排序和查找

一、排序介绍 1、排序的概念 排序是将多个数据按照指定的顺序进行排列的过程。 2、排序的种类 排序可以分为两大类&#xff1a;内部排序和外部排序。 3、内部排序和外部排序 1&#xff09;内部排序 内部排序是指数据在内存中进行排序&#xff0c;适用于数据量较小的情况…

【HTTP系列】HTTP1.0/1.1/2.0 的区别

文章目录 一、HTTP1.0二、HTTP1.1三、HTTP2.0# 多路复用二进制分帧首部压缩服务器推送 四、总结HTTP1.0&#xff1a;HTTP1.1&#xff1a;HTTP2.0&#xff1a; 参考文献 一、HTTP1.0 HTTP协议的第二个版本&#xff0c;第一个在通讯中指定版本号的HTTP协议版本 HTTP 1.0 浏览器…

OmniGlue: Generalizable Feature Matching with Foundation Model Guidance

【引用格式】&#xff1a;Jiang H, Karpur A, Cao B, et al. OmniGlue: Generalizable Feature Matching with Foundation Model Guidance[J]. arXiv preprint arXiv:2405.12979, 2024. 【网址】&#xff1a;https://arxiv.org/pdf/2405.12979 【开源代码】&#xff1a;https…

c++与c

命名空间的设置&#xff1a; 避免冲突 命名空间&#xff1a; 如果将变量全部定义在全局可能不安全&#xff0c;都可以进行修改。 如果将变量定义在局部&#xff0c;当出了大括号就不能使用。 所以说在定义一个命名空间的时候 定义函数&#xff0c;变量&#xff0c;命名空间…

适用于 Windows 的 8 大数据恢复软件

数据恢复软件可帮助您恢复因意外删除或由于某些技术故障&#xff08;如硬盘损坏等&#xff09;而丢失的数据。这些工具可帮助您从硬盘驱动器 (HDD) 中高效地恢复丢失的数据&#xff0c;因为这些工具不支持从 SSD 恢复数据。重要的是要了解&#xff0c;您删除的数据不会被系统永…

嵌入式系统如何尽可能避免存储数据丢失与损坏?

正文 大家好&#xff0c;我是bug菌&#xff5e; 对于一些需要动态存储数据的嵌入式系统往往我们需要考虑系统在各种状态的数据可靠性问题。当然也不仅仅这些数据敏感的协议&#xff0c;最常见的就是你向存储系统写入数据的过程中给断电了&#xff0c;系统下一次上电跑飞了~ 掉电…

ssm621大湾区旅游推荐系统的设计与实现+vue【已测试】

前言&#xff1a;&#x1f469;‍&#x1f4bb; 计算机行业的同仁们&#xff0c;大家好&#xff01;作为专注于Java领域多年的开发者&#xff0c;我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源&#xff1a; &#x1f469;‍&#x1f4bb; SpringBoot…

ICLR24大模型提示(8) | 退一步思考:在大型语言模型中通过抽象引发推理

【摘要】我们提出了一种简单的提示技术&#xff0c;即后退提示法&#xff0c;它使 LLM 能够进行抽象&#xff0c;从包含特定细节的实例中得出高级概念和第一原理。通过使用概念和原理来指导推理&#xff0c;LLM 显著提高了遵循正确推理路径解决问题的能力。我们使用 PaLM-2L、G…

Android Media Framework(三)OpenMAX API阅读与分析

这篇文章我们将聚焦Control API的功能与用法&#xff0c;为实现OMX Core、Component打下坚实的基础。 1、OMX_Core.h OMX Core在OpenMAX IL架构中的位置位于IL Client与实际的OMX组件之间&#xff0c;OMX Core提供了两组API给IL Client使用&#xff0c;一组API用于管理OMX组件…

对Java中二维数组的深层认识

首先&#xff0c;在JAVA中&#xff0c;二维数组是一种数组的数组。它可以看作是一个矩阵&#xff0c;通常是由于表示二维数据节后&#xff0c;如表格和网格。 1.声明和初始化二维数组 声明 int[][] arr;初始化 int[][] arrnew int[3][4];或者用花括号嵌套 int[][] arr{{1,…