Spring6新特性来了!便捷替代Feign封装RPC接口

news2024/9/30 9:18:49

spring6的新特性笔者最近也有在研究,其中在HttpServiceProxyFactory服务代理工厂的使用方式体验上,笔者认为极其像是在用Feign编写RPC接口,使用服务代理工厂我们只要在全局配置单例的服务代里工厂bean再维护一个http interface接口就能统一的管理并根据需求去调用这些RPC服务了,不再像Feign服务调用以及dubbo服务注册与服务发现以及服务引入,soa服务暴露与引入,在进行远程调用前还要进行必要的配置。免去了相当一部分的繁琐操作。

尝鲜版demo

1、首先我们要拥有一台已经启动且正在等待我们远程调用的实例,并且你已经排除了潜在的远程调用问题(跨域,拦截器等可能导致远程调用请求失败的原因)

我这里准备了一个springboot实例,提供一个请求方法为get的接口:

    @GetMapping("/getAllAirQualityIndex")
    @ResponseBody
    public ResponseMessage<List<AirQualityIndexDTO>> getAllAirQualityIndex() {
        List<AirQualityIndex> airQualityIndices = airQualityIndexService.selectAll();
        if (CollectionUtils.isEmpty(airQualityIndices)) {
            return ResponseMessage.success(null, "监测记录为空");
        }	
        List<AirQualityIndexDTO> result = new ArrayList<>(airQualityIndices.size());
        airQualityIndices.forEach(airQualityIndex -> {
            District district = districtService.selectEntityByPrimaryKey(airQualityIndex.getDistrictid());
            if (Objects.isNull(district)) {
                throw new RuntimeException("区域信息获取失败");
            }
            AirQualityIndexDTO airQualityIndexDTO = AirQualityIndexDTO.fillValue(airQualityIndex, district);
            result.add(airQualityIndexDTO);
        });
        return ResponseMessage.success(result, "获取全部监测记录成功");
    }

这里请读者牢记:接口URI为:

http://127.0.0.1:9000/getAllAirQualityIndex

后续编写接口会用到。

2、愉快的进行编写调用方实例,这里调用方直接拿被调用方的接口数据就行(不搭建三层了,嫌麻烦)

注意:

1、调用方项目的springboot版本为3.0.0或以上,需要引入下面的依赖;

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>

2、JDK版本在17或以上;

3、不要轻易的相信@Resource注解去引入组件,因为import的包名可能不是javax嗷~~;

4、不要尝试在同一台实例内部进行远程调用(会报出连接被拒)

编写服务调用的接口

public interface Api {

    @GetExchange(value = "/getRpcInfo")
    RpcInfo getRpcInfo( );

    @HttpExchange(value = "/getRpcInfo",method = "GET")
    RpcInfo getRpc();

    @GetExchange("/getAllAirQualityIndex")
    Object getAirList();
}

这里注意@GetExchange注解的使用和@GetMapping使用的方式几乎一毛一样,只不过你这里的value都必须要是远程调用的接口名(别配上了协议ip端口前缀)

配置全局单例服务代理bean组件

@SpringBootApplication
public class CloudHttpInterfaceApplication {

    @Bean("HttpInterface")
    @Scope(value = "singleton")
    public HttpServiceProxyFactory getHttpFactory() {
        return HttpServiceProxyFactory
                .builder(WebClientAdapter
                        .forClient(WebClient.builder()
                                .baseUrl("http://localhost:9000/")
                                .build())).build();
    }

    public static void main(String[] args) {
        SpringApplication.run(CloudHttpInterfaceApplication.class, args);
    }

}

这里不难发现我把url(http://localhost:9000/)配置在这个组件里了,如果调用的远程实例不止一台,我们可以维护一个map对象,key是实例名,value就是它的实例地址,编写一个适配器去根据你传回的参数适配你想调用的远程实例地址去构造组件,当然这样的话组件的作用域也就仅仅在请求上了。

编写简单的API适配器(没啥好处,维护map改进逻辑就还行)

@Configuration
@DependsOn({"HttpInterface"})
public class ServiceAdapter {

    @Qualifier("HttpInterface")
    @Autowired
    HttpServiceProxyFactory httpServiceProxyFactory;

     public <T> T getServiceApi(Class<T> serviceClazz){
       return httpServiceProxyFactory.createClient(serviceClazz);
    }
}

这里提一下注解@DependsOn的作用是实例化当前组件之前先实例化注解中的组件,当项目中的组件存在严格的依赖关系时,必须要先实例化底层组件再实例化上层组件。类似的注解还有@Order、@Conditional(在实例化当前组件时检查某类型的组件是否已经存在)及其衍生注解。

编写测试用例

    @Autowired
    ServiceAdapter serviceAdapter;

    @Test
    public void test2(){
        Object airList = serviceAdapter.getServiceApi(Api.class).getAirList();
        System.out.println(airList);
    }

测试结果

调用方控制台打印:

 被调用方日志文件输出:

 这里我们通过spring6提供的HTTP服务代理工厂的方式搭建了一个最基础的demo展示它的作用,只能说体验比Feign好!

 

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

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

相关文章

跨域跨网访问延迟高?中科三方云解析智能线路提供最优解析方案

在日常工作生活中&#xff0c;大多数人都是直接通过域名访问web服务器&#xff0c;但计算机并不能直接识别域名&#xff0c;因此需要域名系统&#xff08;DNS&#xff0c;Domain Name System&#xff09;将域名翻译成可由计算机直接识别的IP地址&#xff0c;这个环节就是域名解…

MOSFET开关:电源变换器基础知识及应用

​MOSFET是一种常用的场效应晶体管&#xff0c;广泛应用于电源变换器中。电源变换器是一种将输入电源转换为输出电源的电路&#xff0c;通常用于电子设备中。在本文中&#xff0c;我们将介绍MOSFET开关及其在电源变换器中的基础知识和应用。 一、MOSFET开关的基础知识 MOSFET…

MySQL---单列索引(包括普通索引、唯一索引、主键索引)、组合索引、全文索引。

1. 索引 索引是通过某种算法&#xff0c;构建出一个数据模型&#xff0c;用于快速找出在某个列中有一特定值的行&#xff0c;不使用索 引&#xff0c;MySQL必须从第一条记录开始读完整个表&#xff0c;直到找出相关的行&#xff0c;表越大&#xff0c;查询数据所花费的 时间…

算法之单调栈常见题目

什么时候需要使用单调栈&#xff1f; 通常是一维数组&#xff0c;要寻找任意一个右边或者左边第一个比自己大或小的元素的位置&#xff0c;此时我们就想到可以使用单调栈了。 单调栈的本质是空间换时间&#xff0c;因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高…

电轨车运维作业vr实操培训平台训练一批高素质的维修型人才

卡车由于使用频繁、长期载重以及各种不可预测的外界作业技能人员的培训。基于web3d开发的卡车检修作业3d模拟仿真教学系统弥补了教学条件的不足&#xff0c;在提升培训效果、节省教学经费上有显著的作用。 深圳华锐视点研发的卡车检修作业3d模拟仿真教学系统实时动态展示三维仿…

GNN 学习记录

GNN 参考资料&#xff1a;https://www.bilibili.com/video/BV16v4y1b7x7 图网络为什么复杂 需要接受任意尺寸的输入没有固定的节点顺序和参考锚点&#xff08;比如文本是从前往后处理&#xff0c;图像是有像素点的&#xff0c;图没有起始点&#xff09;动态变化和多种模态的…

月入3000万,23岁美国女网红用AI分身交1000多男友!谈恋爱按分钟计费

来源 | 新智元 微信号&#xff1a;AI-era 【导读】这位23岁的女网红用GPT-4复刻了一个自己后&#xff0c;已经周入7万多美元了。不仅如此&#xff0c;短短几天内&#xff0c;候补名单上就排了差不多1万名男施主。 各种逼真的AI工具火了之后&#xff0c;各路心思活泛的选手都开…

Spring Boot 项目【前后端分离】 之架子搭建

Spring Boot 项目【前后端分离】 之架子搭建 注意如果看过我ssm项目的博客的项目的前端可以不需要看或者快速看一下即可 比较页面什么的一样主要是技术栈不同. 技术栈 - 使用了前后端分离&#xff0c;前端的主体框架Vue3&#xff0b;后端的基础框架Spring-Boot 1.前端技术栈…

SQL: STUFF()和FOR XML PATH的使用

STUFF(param1, startIndex, length, param2) 将param1中自startIndex(SQL中都是从1开始&#xff0c;而非0)起&#xff0c;删除length个字符&#xff0c;然后用param2替换删掉的字符。 示例&#xff1a; select STUFF(abcdefg,1,0,1234) --结果为1234abcdefg select ST…

每日一题163——矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例 2&#xff1a; 输入&…

Docker与Docker-compose安装Vulfocus Vulhub漏洞环境

目录 一.docker 和 docker-compose 介绍&#xff1a; docker&#xff1a; docker-compose&#xff1a; 二者的区别&#xff1a; 二者的联系&#xff1a; 二者的总结&#xff1a; 二.Centos 7安装Docker 三.Centos 7安装docker-compose 四.docker-compose搭建Vulhub漏…

Linux安装MySQL后无法通过IP地址访问处理方法

本文主要总结Linux安装Mysql后&#xff0c;其他主机访问不了MySQL数据库的原因和解决方法 环境说明&#xff1a; MySQL 5.7.30CentOS Linux release 7.6.1810 (Core) 创建完Mysql数据库后可以查看mysql 日志获取root 用户登录密码 [rootlocalhost mysql-5.7.30]# cat /var/l…

2 机器学习知识 Softmax回归 deep learning system

机器学习算法的三个主要部分 The hypothesis class: 模型结构loss fuction 损失函数An optimization method&#xff1a;在训练集上减小loss的方法 多分类问题 训练数据&#xff1a; x ( i ) ∈ R n , y ( i ) ∈ 1 , . . . , k f o r i 1 , . . . m x^{(i)}\in \mathbb{R}…

在Fedora-Workstation-Live-x86_64-36-1.5中编译安装信使iptux0.7.6

在Fedora-Workstation-Live-x86_64-36-1.5中编译安装信使iptux0.7.6 https://github.com/iptux-src/iptux/tree/v0.7.6 下载信使iptux-0.7.6.zip&#xff0c;类似飞鸽传书ipmsg&#xff0c;已经尝试过0.8.3版本不成功 [rootfedora ~]# unzip /home/ruhong/download/iptux-0.7…

usb摄像头驱动-core层driver.c

usb摄像头驱动-core层driver.c 文章目录 usb摄像头驱动-core层driver.cusb_bus_typeusb_device_matchusb_uevent usb_register_driver 在ubuntu中接入罗技c920摄像头打印的信息如下&#xff1a; 在内核中&#xff0c;/driver/usb/core/driver.c 文件扮演了 USB 核心驱动程序管…

自动化遍历测试技术之android maxim遍历测试工具

这里写目录标题 一、问题1、例如app中存在问题2、解决方法3、改进策略4、自动遍历测试5、常见遍历工具与技术 二、android maxim 遍历测试工具策略使用环境预备命令行模式策略 三、android fastbot 遍历测试工具使用 一、问题 业务线众多 业务流程复杂 依赖传统券商一些资源 …

2023年最新软件测试面试题,自动化测试面试题,接口自动化测试面试题详解,对标大厂。

【软件测试面试题】 1、你的测试职业发展是什么&#xff1f;   测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程…

软件测试之性能测试

性能测试是与时间相关的。 主要内容 性能测试基础概念和术语介绍性能测试模型性能测试分类介绍性能测试实施与管理 性能测试基础 为什么要进行性能测试&#xff08;WHY&#xff09;&#xff08;最重要&#xff09; 应用程序是否能够很快的响应用户的要求&#xff1f;应用程…

【C程序设计】——程序=算法+数据结构

目录 &#x1f34a;&#x1f34a;一、什么是算法&#xff1f; &#x1f34a;&#x1f34a;二、简单的算法举例 &#x1f34a;&#x1f34a;三、算法的特性 &#x1f34a;&#x1f34a;四、怎样表示一个算法 一个程序主要包括以下两方面的信息&#xff1a; &#xff08;1&am…

软件测试项目实战经验附视频以及源码【商城项目,app项目,电商项目,银行项目,医药项目,金融项目】

前言&#xff1a; ​​大家好&#xff0c;我是凡叔。 很多初学的测试小白都在烦恼找不到合适的项目去练习&#xff0c;这也是难倒大部分测试小白的一个很常见的问题&#xff0c;项目经验确实是每一个测试非常宝贵的经验&#xff01;这里凡叔给大家找了一些常用的项目合集&…