浅试仿 mapstruct实现微服务编排框架详解

目录
  • 微服务编排框架
  • 开发背景
  • 接口的方式
  • 通过注解的方式
  • 书写代码方式的选择
  • 方案选择
    • feign
    • MapStruct
  • 方案总结
    • Feign @FeignClient
    • MapStruct

微服务编排框架

起始原因 是 我们公司 分布式事务 使用的是 seate 分布式事务框架,现在只在一些小部分使用,因为考虑到seate 对性能 TCP的影响,对事务这块没有更多的选择。我就在想 是不是做一个 微服务 编排框架 来解决这个问题。这里就

开发背景

  • 因为我们是saas 可能A企业要这个功能,B企业不要,通过服务编排就可以解决这种情况(还是要受制于业务的)
  • 解决分布式 事务问题,我们涉及到钱的用seate ,其他的用这个框架,能提升性能和TPS

接口的方式

@Component
public class AProcessorDemo extends RollbackProcessor {
    @Override
    protected void processInternal(ProcessContext context) {
        System.out.println("a RollBackProcessor " + context.get("id"));
    }
    @Override
    protected void rollback(ProcessContext context) {
        System.out.println("a rollback RollBackProcessor " + context.get("id"));
    }
}

通过注解的方式

@Component
public class AProcessorDemo  {
    @Processor(name="a")
    protected void processInternal(ProcessContext context) {
        System.out.println("a RollBackProcessor " + context.get("id"));
    }
    @ProcessoRrollback(name="a")
    protected void rollback(ProcessContext context) {
        System.out.println("a rollback RollBackProcessor " + context.get("id"));
    }
}

书写代码方式的选择

代码实现上都可以实现,

选择接口方式 缺点

  • 代码改动会很大
  • node的拆分会根据开发人员的 水平 得到不同体现

选择 注解方式

  • 代码可读性 会降低 因为各种情况都会放在同一个类中
  • 和之前代码的兼容性 比较好,对代码和抽象的能力 要求降低

我感觉还是先按照 接口方式写,之前代码不动,只是新的业务才这么写,让结构清晰,增强抽象的能力。 之后可以用mapStruct 方式优化

张小龙说的为客户/用户考虑, 到我们这 就是为了开发人员考虑。这样能节省 业务开发的改动量

方案选择

feign

有@FeignClient(name = "provider"),其实不就是 根据注解添加代理么?和我们一样的功能,是不是可以借鉴下,其实还是反射 拿值 做响应的对应

上生产,通过阿里云监控平台看,8g内存的机器 tps 到200 就会显示卡在这个BeanUtils 方法上

MapStruct

替换 BeanUtils 复制属性的新组件,用 生成代理类,set方法赋值 来替换了反射的方式 提升性能,减小内存的使用。这种 也是可以的

方案总结

我们平时学习 学一个技术,其实了解其原理是为了 自己写组件的时候 ,能用上他们的思路和技术 来达到我们的目的。我个人不是很排斥学习 八股文,可以学到很多的思路 是我们能用上的。但是面试官 别光考八股文

feign 可能是前面第一版会用,等后面的mapStruct demo写完了 我就升级下版本,让测试同学帮忙测试下,然后换jar 版本呗

说实话 其实我对这种换jar包的方式 还是比较方案的,之前我都是这么干,但是涉及到改动的地方太多,我现在会从K8s 下手,直接挂 agent,不影响业务系统

两个都分析下吧

Feign @FeignClient

主要看 FeignClientsRegistrar registerFeignClients 方法中

BeanDefinition candidateComponent = (BeanDefinition)var21.next();
if (candidateComponent instanceof AnnotatedBeanDefinition) {
    AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition)candidateComponent;
    AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
    Assert.isTrue(annotationMetadata.isInterface(), "@FeignClient can only be specified on an interface");
    Map<String, Object> attributes = annotationMetadata.getAnnotationAttributes(FeignClient.class.getCanonicalName());
    String name = this.getClientName(attributes);
    //注册client 配置到spring 容器
    this.registerClientConfiguration(registry, name, attributes.get("configuration"));
    //注册动态代理类到 spring 容器
    this.registerFeignClient(registry, annotationMetadata, attributes);
}

MapStruct

先实现一个简易的微服务 编排框架 然后 mapStruct 组件画图,然后写一个demo 升级版本 兼容接口 和 注解 两种方式

明天去公司 和公司大佬们 聊聊这个组件行不,以上就是浅试仿 mapstruct实现微服务编排框架详解的详细内容,更多关于仿 mapstruct微服务编排框架的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解Java中的mapstruct插件使用

    实体类的属性映射怎么可以少了它? 我们都知道,随着一个工程的越来越成熟,模块划分会越来越细,其中实体类一般存于 domain 之中,但 domain 工程最好不要被其他工程依赖,所以其他工程想获取实体类数据时就需要在各自工程写 model,自定义 model 可以根据自身业务需要映射相应的实体属性.这样一来,这个映射工程貌似并不简单了.阿森差点就犯难了…… 序 所以阿淼今天就要给大家安利一款叫 mapstruct 的插件,它就是专门用来处理 domin 实体类与 model 类的属性映射的,我们

  • MapStruct表达式应用及避坑详解

    目录 前言 遇到的问题 发现原因 结语 前言 生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解.MapStruct的表达式功能是为了处理特殊对象属性的映射问题,比如DTO中的status属性转换成PO中的status需要进一步的处理,这个时候就需要用到表达式功能了.这里不再赘述关于MapStruct的使用问题,更多的使用教程可参考文档 MapStruct官方文档:https://mapstruct.org/documentation/stable/reference/html/#

  • SpringBoot + MapStruct 属性映射工具的使用详解

    1. MapStruct 是什么? 截取下官方的原话 我给翻译了一下 说白了 当你的对象A有几十个属性 而另一个对象B 与A比较只有一些细微的差别 那么这时候只需要映射过去即可 而不需要疯狂的调用set方法 进行属性的拷贝 这就是这个工具给我们带来的最大便利 官方github链接 点击跳转 2. 引入依赖 采用Mapstruct的 最新版本 1.4.2.Final SpringBoot版本不要选新版的 我对比了下 2.3.0 和 2.5.4 后者会出现属性映射为null的情况 已经将问题反馈了

  • SpringBoot 整合mapstruct的实现步骤

    目录 前言 mapstruct 使用来干什么的? mapstruct 相对于BeanUtils的优势在哪? 编码 引入依赖 创建 DTO.VO 运行测试用例 怎么解决mapstruct 失效呢? mapstruct常规操作 不同字段映射 LIST转换 总结 前言 在项目中,如果我们要遵循分层领域模型规约: 话,肯定避免不了在DTO.VO.BO.AO.VO.Query等实体的转换,我们通常有几种做法: 手动一个个字段的赋值通过反序列化的手段,必须先转成JSON字符串,再转回来使用Spring的Be

  • mapstruct的用法之qualifiedByName示例详解

    qualifiedByName的意思就是使用这个Mapper接口中的指定的默认方法去处理这个属性的转换,而不是简单的get set.网上一直没找到… 可用于格式化小数位等,在po转换为vo时就已格式化小数位完成,所以不必单独再写代码处理小数位. 1 引用pom1 ,能正常使用mapstruct的注解,但不会生成Impl类 <!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-jdk8 --> <dependency

  • Lombok和MapStruct整合详情

    目录 一.流程 1.安装Lombok插件 2.启用注解处理器 二.原理 三.原因 四.解决办法 一.流程 1.安装Lombok插件 (2020.0.4之后版本的IDEA已内置Lombok,老版本的请自行下载插件) 2.启用注解处理器 打开setting -> enable annotation processor (启用注解处理器) OK 完事~ 可以使用了  送上常用四件套: @Data //生成Getter .Setter .ToString .ToString .EqualsAndHash

  • 浅试仿 mapstruct实现微服务编排框架详解

    目录 微服务编排框架 开发背景 接口的方式 通过注解的方式 书写代码方式的选择 方案选择 feign MapStruct 方案总结 Feign @FeignClient MapStruct 微服务编排框架 起始原因 是 我们公司 分布式事务 使用的是 seate 分布式事务框架,现在只在一些小部分使用,因为考虑到seate 对性能 TCP的影响,对事务这块没有更多的选择.我就在想 是不是做一个 微服务 编排框架 来解决这个问题.这里就 开发背景 因为我们是saas 可能A企业要这个功能,B企业不

  • SpringCloud微服务熔断器使用详解

    目录 一.简介 二.作用 三.核心概念 3.1 熔断目的 3.2 降级目的 四.实例 4.1 基于Hystrix 4.1.1 熔断触发降级 4.1.2 超时触发降级 4.1.3 资源隔离触发降级 4.2 基于OpenFeign pom.xml 一.简介 当微服务中的某个子服务,发生异常服务器宕机,其他服务在进行时不能正常访问而一直占用资源导致正常的服务也发生资源不能释放而崩溃,这时为了不造成整个微服务群瘫痪,进行的保护机制 就叫做熔断,是一种降级策略 熔断的目的:保护微服务集群 二.作用 对第三

  • Docker容器服务编排利器详解

    目录 一.使用Docker Compose必要性及定义 二.Docker Compose应用参考资料 三.Docker Compose应用最佳实践步骤 3.1 概念 3.2 步骤 四.Docker Compose安装 五.Docker Compose应用案例 5.1 网站文件准备 5.2 Dockerfile文件准备 5.3 Compose文件准备 5.4 使用docker-compose up启动容器 5.5 访问 一.使用Docker Compose必要性及定义 用容器运行一个服务,需要使用

  • .Net Core微服务rpc框架GRPC通信实际运用

    序 上一篇博客把grpc的概念说了个大概,介绍了proto的数据类型,基本语法,也写了个小demo,是不是没那么难? 今天要从理论到实际,写两个微服务,并利用grpc完成两者之间的通信.只是作为demo写的话会十分简单,毕竟理解为主. 服务端 首先要拿出之前写好的proto文件,然后修改两个属性: Build Action => Protobuf compiler gRpc Stub Classes => Server only 如图: 当然也可以在项目文件里看到它: 然后重新生成项目 ,会自

  • .Net Core微服务rpc框架GRPC通信基础

    什么是rpc? rpc,全称Remote Procedure Call,通过它,你可以像调用本地方法一样调用远程服务.前端可以调用后端方法,后端也可以调用前端方法.其实这个概念并不陌生,上一篇关于web实时应用的文章也提到了这个概念,并实现了前后端互调的操作. 在正式开始使用grpc之前,我们还需要掌握protocol buffer的概念. 什么是grpc? grpc来自大名鼎鼎的谷歌,孵化于CNCF基金会(docker.k8s同样出自这个基金会).它是一款高性能.开源.通用的rpc框架,你可以

  • 在Ubuntu上搭建一个基于webrtc的多人视频聊天服务实例代码详解

    WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. 在疫情期间哪里也去不了,在家没事就研究webrtc视频直播技术,网上找了些教程最终都不太能顺利跑起来的,可能是文章写的比较老,使用的一些开源组件已经更新了,有些配置已经不太一样了,所以按照以前的步骤会有问题.折腾了一阵终于跑起来了,记录一下. 一个简单的聊天室html页面 这个页面使用simple-webrtc来实现webrtc的通讯,sim

  • Docker compose 编排工具详解

    Docker Compose Docker Compose是一个定义及运行多个Docker容器的工具,通过 Compose,无需用shell脚本来启动容器,而使用 YAML 文件来配置应用程序需要的所有服务,然后使用命令,根据 YAML 的文件配置创建并启动所有服务,非常适合于多个容器进行开发的场景. Compose非常适合开发,测试和登台环境以及CI工作流程. YAML YAML是一个可读性高,用来表达数据序列化的格式 相关命令及格式 version:指定此yml文件基于的compase的版本

  • Spring boot admin 服务监控利器详解

    目录 一.简介 二.搭建 1.服务端 2.客户端 3.启动项目 4.客户端配置 3.微服务 3.1.服务端 3.2.客户端 4.我的微服务预警发送其他服务状态信息思路 一.简介 用于对 Spring Boot 应用的管理和监控.可以用来监控服务是否健康.是否在线.以及一些jvm数据等等.Spring Boot Admin 分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client),服务端和客户端之间采用 http 通讯方式实现数据交

  • Mysql 5.7.18安装方法及启动MySQL服务的过程详解

    MySQL 是一个非常强大的关系型数据库.但有些初学者在安装配置的时候,遇到种种的困难,在此就不说安装过程了,说一下配置过程.在官网下载的MySQL时候,有msi格式和zip格式.Msi直接运行安装即可,zip则解压在自己喜欢的目录地址即可.在安装这两种的时候,都需要配置才能用.以下介绍主要是msi格式默认的地址:C:\Program Files\ mysql-5.7.18-win32. 一.在安装或者解压后,需要配置环境变量,过程如下:我的电脑->属性->高级系统设置->高级->

  • Redis Sentinel服务配置流程(详解)

    1.Redis Sentinel服务配置 1.1简介 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常. 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过API 向管理员或者其他应用程序发送通知. 自动故障迁移(Automatic failover): 当一个主服务器不

随机推荐