远程服务调用的简单应用,并轻松解决LinkedHashMap无法转成相关实体类的问题

这篇具有很好参考价值的文章主要介绍了远程服务调用的简单应用,并轻松解决LinkedHashMap无法转成相关实体类的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🏀(一)为啥需要远程服务调用?

    🐠知其然还要知其所以然,在我们的生产项目上一般而言会部署多个微服务,每个微服务会负责不同版块的业务工作。如果某个微服务需要借助另外的某些微服务中的接口才能完成相应操作时,那么服务与服务之间就会存在相互调用的情况,远程服务调用因此油然而生!例如:跨数据库调用、设备对接等业务功能。

🏀(二)如何远程服务调用?

    🐠大伙开始接项目做的时候,都是单体项目开始做起的,也就是我们所说的SpringBoot框架,搞懂这个后才慢慢介入到微服务架构,也就是SpringCloud。SpringCloud简单点说就是多个SpringBoot拼凑而成的大家庭,搞懂了单体,多个微服务架构也就不解自通了。

    🐠每个服务相关的接口流程就过多的阐述了,如果不清楚的小伙伴可以移步到我在此之前所撰写的简单开发的博文,这个基于SpringBoot_后端接口流程里面有详细的介绍。下面将通过相关项目实例介绍如何远程服务调用

💌(1)创建新的应用模块

    🍑为了将所有跨远程服务调用的流程集中性进行管理,那么新开一个应用模块相当有必要,在新开应用模块下汇集所有的远程服务及相关的实体类、服务熔断降级类及自动配置文件等。如下图所示:
远程服务调用的简单应用,并轻松解决LinkedHashMap无法转成相关实体类的问题

💌(2) 创建远程服务

    🍑创建远程服务的过程,其实就是将自己在某个服务中撰写的接口挪过来放在新开应用模块下的某个Service下即可,而需要注意的点便是:@FeignClient注解中要写明所对应的相关服务,以及“熔断降级”fallbackFactory所指明的类。

/**
 * @InterfaceName: RemoteReportService
 * @Description:
 * @Author: YuHao
 * @Date: 2023/06/07
 */
@FeignClient(contextId = "remoteReportService", value = "***相关应用服务名称", fallbackFactory = RemoteReportFallbackFactory.class)
public interface RemoteReportService {

  
    @GetMapping("/clickReport/getRoadSectionTrafficReport")
    R getRoadSectionTrafficReport(@RequestParam("beginDate") String beginDate, @RequestParam("endDate")String endDate,
                                                               @RequestParam("directionList") List<String> directionList, @RequestParam("roadSectionNameList")List<String> roadSectionNameList);

    @GetMapping("/sa/getMainLineAndServiceAreaFlow")
    R getMainLineAndServiceAreaFlow(@RequestParam("beginDate") String beginDate,@RequestParam("lineYearBeginDate") String lineYearBeginDate,@RequestParam("lineAllBeginDate") String lineAllBeginDate, @RequestParam("endDate")String endDate,@RequestParam("deviceIps") List<String> deviceIps,@RequestParam("gantryIds") List<String> gantryIds);

}
💌(3)创建服务熔断降级工厂类

    🍑这一步的过程是防止某个被调取的服务挂掉了之后,去调用的服务还在不停地发送请求,进而发生雪崩等情况的出现。当服务请求不到时,该类的创建能发挥关键作用,查询相关日志也能及时发现报错点的位置。

/**
 * @ClassName: RemoteReportFallbackFactory
 * @Description:
 * @Author: YuHao
 * @Date: 2023/06/07
 */
@Component
@Slf4j
public class RemoteReportFallbackFactory implements FallbackFactory<RemoteReportService> {

    @Override
    public RemoteReportService create(Throwable cause) {

        log.error("***报表获取暂无:{}", cause.getMessage());

         return new RemoteReportService() {
             @Override
             public R getRoadSectionTrafficReport(String beginDate, String endDate, List<String> directionList, List<String> roadSectionNameList) {
                 return R.fail("****报表获取失败:" + cause.getMessage());
             }

             @Override
             public R getMainLineAndServiceAreaFlow(String beginDate,String beginYearLineDate,String beginAllLineDate, String endDate, List<String> deviceIps, List<String> gantryIds) {
                 return R.fail("****报表获取失败:" + cause.getMessage());
             }

         };

    }
}
💌(4)spring.factories配置

🍑spring.factories 配置文件是将 SpringBoot 包以外的 Bean注册到 SpringBoot 的 spring 容器中。由于SpringBoot中的@ComponentSc
an 注解只能扫描 SpringBoot包内的 Bean 并注册到 spring 容器中,因此需借助org.springframework.boot.autoconfigure.Enable
AutoConfiguration来注册SpringBoot包外的Bean。而 spring.factories 配置文件,则是用来记载SpringBoot包外需要注册的Bean的相关类名称。这个配置文件常常容易被忽视,刚开始使用的时候,本人也常未将需要注册的类配置进来,导致我需要服务发现不了,导致远程服务不生效。所以当前面的三个步骤完成以后,记得需要手动将需要的类型配置进来。案例配置如下图所示:
远程服务调用的简单应用,并轻松解决LinkedHashMap无法转成相关实体类的问题

💌(5)远程服务调用

    🍑在本服务中远程调用其他的指定服务,使用@Resource或者@Autowired自动注入即可使用到指定服务的相关接口,而相关的调用过程如下实例所示,拿到返回的结果数据再进行相关的业务处理即可完成此服务模块Service层的撰写。

	//相关业务代码操作已省略...
	@Resource/@Autowired
    private RemoteReportService remoteReportService;

 	R<List<RoadSectionTrafficRep>> r = remoteReportService.getRoadSectionTrafficReport(beginDate, endDate, directionList, roadSectionNameList);

🏀(三)解决LinkedHashMap无法转成相关实体类的问题

    🥘LinkedHashMap无法转成相关实体类,其实这个问题一般是会在远程调用服务中出现得较多,可能因为返回格式等问题导致最终无法转成我们所需的数据类型格式。

    🥘第一需要声明好所返回的实体类,也就是说我们在R中要注明好泛型,不然程序可能不好定位返回的格式是什么类型的数据。

    🥘第二参考Alibaba fastjson开源库,前后端接口联调少不了的就是借用json来打交道,因为json是公认的标准的数据交换格式,fastjson将常用的转换分析方式基本都包含(神器推荐!!!),相关分析转换方法如下实例代码所示:

public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray

public static final JSONObject parseObject(String text)// 把JSON文本parse成JSONObject 
    
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean 

public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 

public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合 

public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本 

public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 

public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。

    🥘在返回参数中写明泛型实体类,并参考fastjson开源库中相关的分析转换方法,即可快速解决此类问题,相关实例代码如下所示:

	@Override
    public List<RoadSectionTrafficRep> getRoadSectionTraffic(String beginDate, String endDate, List<String> directionList, List<String> roadSectionNameList) {
        R<List<RoadSectionTrafficRep>> r = remoteReportService.getRoadSectionTrafficReport(beginDate, endDate, directionList, roadSectionNameList);
        List<RoadSectionTrafficRep> list = r.getData();
        //list转成字符串
        String jsonObject = JSON.toJSONString(list);
        //json字符串再转成实体类
        List<RoadSectionTrafficRep> roadSectionTrafficRepList = JSON.parseArray(jsonObject, RoadSectionTrafficRep.class); //把JSON文本parse成JavaBean集合 
        return roadSectionTrafficRepList;                       
    }

🍆🍆🍆路过的小伙伴,如果本篇博文对你的学习或者工作有所帮助,可以点赞+收藏+关注一波呀~👊👊👊小编后续每过一段时间会整理出相关项目实例的博文,感谢您的支持哦!!!✈️✈️✈️
远程服务调用的简单应用,并轻松解决LinkedHashMap无法转成相关实体类的问题文章来源地址https://www.toymoban.com/news/detail-474886.html

到了这里,关于远程服务调用的简单应用,并轻松解决LinkedHashMap无法转成相关实体类的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 解决微服务进行远程调用时报错:feign.FeignException$Unauthorized: [401] during [GET] to [http://xxxxx]

    现在有两个服务,一个 user-service 服务作为 服务提供者 ,另一个 resource-service 服务作为 服务消费者 ,当消费者进行远程调用服务者提供的服务时出现未授权错误Unauthorized: [401]。 在 Feign 在进行远程调用时, 默认是没有将请求头继续往下传递的, 而系统微服务接入认证之后, 必

    2024年02月05日
    浏览(34)
  • LinkedHashMap 简单实现LRU

    要使用 LinkedHashMap 来实现LRU(最近最少使用)缓存,可以设置它的访问顺序为 true ,以便在每次访问一个元素时,将它移到最后,从而实现LRU的特性。以下是一个简单的Java示例: 在上面的示例中,创建了一个 LRUCache 类,它扩展了 LinkedHashMap ,并在构造函数中设置了访问顺序

    2024年02月08日
    浏览(41)
  • 解决 Axios 跨域问题,轻松实现接口调用

    跨域是指访问另外一个域的资源,由于浏览器的同源策略,默认情况下使用 XMLHttpRequest 和 Fetch 请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略,这是由浏览器对 JavaScript 施加的安全限制。 跨域请求被阻止 (Cross-Origin Request Blocked) : 这是由浏览器实施的同源策略

    2024年02月05日
    浏览(32)
  • 远程访问如此简单,通过 ZeroTier 和 Tailscale 轻松组建虚拟局域网,实现内网穿透。

    因为最近用了 Plex 所以研究了一下远程访问,经过一番折腾基本上算是搞明白了,在这里分享一些自己的经验给和我一样的小白,如果有不对的地方欢迎指正。 这里的远程访问是指 在局域网外通过网络访问局域网 ,用来实现 屏幕共享 、 文件共享 、 远程桌面 、 远程联机

    2023年04月20日
    浏览(48)
  • 微服务-服务拆分和远程调用

    任何分布式架构都离不开服务的拆分,微服务也是一样。 微服务拆分时的几个原则: 不同微服务,不要重复开发相同业务 微服务数据独立,不要访问其它微服务的数据库 微服务可以将自己的业务暴露为接口,供其它微服务调用 以微服务cloud-demo为例,其结构如下: cloud-de

    2024年01月20日
    浏览(26)
  • 微服务服务拆分和远程调用

    单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统 分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝 微服务:一种良好的分布式架构方案 ①优点:拆分粒度更小、服务更独立、耦合度更低 ②缺点

    2024年02月13日
    浏览(26)
  • 只会 Windows 也能轻松搭建远程桌面 RustDesk 自用服务器

    网管小贾 / sysadm.cc “哥,你啥时候回来啊?XX业务系统又出问题了!” “情况紧急,老大说让你远程处理,总之尽快解决!” 虽说我常年出差在外总能收到这样的消息,似乎早已习惯,但是公司小胡的这通连环轰炸却让我有些焦躁。 如今情况不同,我发现最近HS采样点都离

    2024年02月04日
    浏览(47)
  • 解密Spring Cloud微服务调用:如何轻松获取请求目标方的IP和端口

    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 目的 Spring Cloud 线上微服务实例都是2个起步,如果出问题后,在没有ELK等日志分析平台,如何确定调用到了目标服务的那个实例,以此来排查问题 效果 可以看到服务有几个实例是上线,并

    2024年02月05日
    浏览(26)
  • 【微服务】Feign远程调用

           📝个人主页: 五敷有你         🔥系列专栏: 微服务 ⛺️稳中求进,晒太阳 先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一 参数复杂URL难以维护 Feign是一个声明式的http客户端,官方地址:GitHub - OpenF

    2024年03月28日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包