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

这篇具有很好参考价值的文章主要介绍了Spring6新特性来了!便捷替代Feign封装RPC接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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新特性来了!便捷替代Feign封装RPC接口

 被调用方日志文件输出:

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

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

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

 文章来源地址https://www.toymoban.com/news/detail-451632.html

到了这里,关于Spring6新特性来了!便捷替代Feign封装RPC接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring6】| Spring6整合JUnit 一:Spring6整合JUnit

    目录 一:Spring6整合JUnit 1. Spring对JUnit4的支持 2. Spring对JUnit5的支持 1. Spring对JUnit4的支持 准备工作:pom.xml 注: 以前是直接使用单元测试Junit,现在使用Spring对Junit的整合! 声明Bean spring.xml配置 单元测试: ①以前的写法 ②使用Spring对Junit4的支持写法 (1)使用两个注解:

    2023年04月18日
    浏览(90)
  • 【Spring6】| Spring6整合JUnit 一:Spring6整合JUnit

    目录 一:Spring6整合JUnit 1. Spring对JUnit4的支持 2. Spring对JUnit5的支持 1. Spring对JUnit4的支持 准备工作:pom.xml 注: 以前是直接使用单元测试Junit,现在使用Spring对Junit的整合! 声明Bean spring.xml配置 单元测试: ①以前的写法 ②使用Spring对Junit4的支持写法 (1)使用两个注解:

    2023年04月20日
    浏览(73)
  • springboot整合feign实现RPC调用,并通过Hystrix实现服务降级

    feign/openfeign和dubbo是常用的微服务RPC框架,由于feigin内部已经集成ribbon,自带了负载均衡的功能,当有多个同名的服务注册到注册中心时,会根据ribbon默认的负载均衡算法将请求分配到不同的服务。这篇文章就简单介绍一下怎么使用feign来调用远程的服务。 首先,需要有一个

    2024年02月16日
    浏览(51)
  • 实现跨语言通信的便捷之道:RPC在Java和Go中的使用案例

    导语: 在现代软件开发中,构建分布式系统和跨语言通信变得越来越常见。RPC(远程过程调用)作为一种通信协议,提供了一种简单而高效的方式来实现不同语言之间的通信。本文将探讨RPC的使用案例,并展示如何在Java和Go之间实现跨语言通信。 什么是RPC? RPC是一种允许不

    2024年01月19日
    浏览(44)
  • Java 【dubbo rpc改feign调用】解决调用服务提供方无法传递完整参数问题

    【框架改造问题点记录,dubbo改为spring cloud alibaba】 【第二篇】feign接口异常解决 【描述】多参数情况下,调用服务提供方无法传递完整参数、改@SpringQueryMap原因是会将实体自动拆分为拼接参数。目前只遇到多参数:实体和单参数情况,持续更新… 汇总: 1.多个普通参数,

    2024年02月16日
    浏览(68)
  • Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架

    https://github.com/kwsc98/krpc-rust 刚刚学习Rust语言或者没怎么了解Rust-RPC框架的同学,可能以为又是一个标题党了,但实际上了解过这部分的同学都知道,目前来说主流的Rust-RPC框架和实际定义的RPC框架还是有着很大的差别。我们先看一下隔壁Java是如何实现的,就拿本项目Java版本

    2024年01月23日
    浏览(50)
  • ChatGPT开源替代来了!参数量200亿,在4300万条指令上微调而成

    OpenChatKit 是一个类 ChatGPT 开源工具包,内含一个 20B 参数量的大模型,而且该模型在 4300 万条指令上进行了微调。 转自《机器之心》 2023 年,聊天机器人领域似乎只剩下两个阵营:「OpenAI 的 ChatGPT」和「其他」。 ChatGPT 功能强大,但 OpenAI 不太可能将其开源。「其他」阵营表

    2023年04月11日
    浏览(37)
  • Spring6-01

    什么是开闭原则? 在软件开发过程中应当对扩展开放,对修改关闭。 也就是说如果在进行功能扩展的时候,添加额外的类是没有问题的,但因为功能扩展而修改之前运行正常的程序,这是不被允许的。因为一旦修改了之前运行正常的程序,就会导致项目整体要进行整体的全

    2024年02月08日
    浏览(87)
  • spring6-事务

    1、JdbcTemplate 1.1、简介 Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作 1.2、准备工作 ①搭建子模块 搭建子模块:spring-jdbc-tx ②加入依赖 ③创建jdbc.properties ④配置Spring的配置文件 beans.xml ⑤准备数据库与测试表 1.3、实现CURD ①装配 JdbcTemplate 创建测试类,整

    2024年02月08日
    浏览(37)
  • Spring6 初始

    @ 目录 Spring6 初始 每博一文案: 1. 初始 Spring6 1.1 OCP开闭原则 1.2 依赖倒置原则DIP 1.3 控制反转IoC 2. Spring 初始 2.1 Spring特点 2.2 Spring6 的下载: 2.3 Spring的jar文件 3. 第一个Spring 程序的编写 4. 第一个Spring程序详细剖析 4.1 bean标签的id属性可以重复吗? 4.2 底层是怎么创建对象的,是

    2024年02月17日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包