本文为稀土技能社区首发签约文章,14天内制止转载,14天后未获授权制止转载,侵权必究!


Hello,这里是爱 Coding,爱 Hiphop,爱喝点小酒的 AKA 柏炎。

本篇是手把手树立根底架构专栏的第六篇,是专栏历史文章,依次读取效果更佳。

第一篇:从零到一树立根底架构(1)-玩转maven依靠版别办理

第二篇:从零到一树立根底架构(2)-如何构建根底架构模块区分

第三篇:从零到一树立根底架构(3)-base模块树立上篇

第四篇:从零到一树立根底架构(4)-base模块树立下篇

第五篇:从零到一树立根底架构(5)-让你的RPC原地起飞

根底架构Demo:common-frame

你需求先clone common-dependency

然后执行mvn clean install 将 common-dependency包打到你本地仓库

否则你拉下来common-frame工程后会报找不到

<parent>
  <groupId>com.baiyan</groupId>
  <artifactId>common-dependency</artifactId>
  <version>1.0.0-SNAPSHOT</version>
</parent>

跟着java的技能生态越来越巨大,市面上出现了越来越多的三方组件,供给了开箱即用的功用。

在同一个微服务的系统下(或许说在同一个部分、同一个公司),咱们运用的中间件与三方依靠库都比较类似。针对这些中间件与三方库,事务服务在运用的时分多多少少都会做一些事务上的包装与装备。

同样的咱们在进行中开发过程中,也会有各式各样的共有装备需求编写。比如在拦截器中记录恳求的操作日志,注解,拦截器都是具有通用性的。各个事务服务都可能用到,在运用上除了日志内容不同,恳求的解析方法与记录方法不会因为事务服务的不同而不同。

本章就将从公共的三方组件装备与系统内共有装备动身,为咱们介绍在如何根底架构中树立起自己的插拔式组件库。

从零到一搭建基础架构(6)-让你的服务组件化

一、什么叫做插拔式组件

Mysql、Redis、ES等等中间件都是咱们日常工作中不可短少的开发东西。

以Mysql为例,咱们最开端在学习java的时分,运用jdbc来访问数据库。增修改查需求树立数据库连接、保护session、处理回来结果、操控游标等等,十分的麻烦。

从零到一搭建基础架构(6)-让你的服务组件化

到了工作中,除掉一些开源结构开发或许数据库开发的同学,很少会有同学运用jdbc来操作数据库。咱们更多仍是运用Mybatis、JPA这种优异的ORM结构去操作数据库。

理由嘛也很简略,开发者去运用这些组件的时分,本质上仍是想操作数据库来进行数据的增修改查。至于你操作数据库还需求先构建连接,保护session池,断开重连等等这种关于我一个事务开发来说我底子不关心。

从零到一搭建基础架构(6)-让你的服务组件化

所以ORM结构就随之诞生了,咱们可以运用结构所带给咱们的便当,只需求在工程中添加数据库相关的装备,就能十分便利的操作数据库。

在Mybatis的根底之上,国内的baomidou开发团队开发了MyBatis-Plus,咱们可以不必再编写xml文件就可以便利的操作数据库进行增修改查。

而在运用Mybatis-Plus的时分,咱们还需求添加一些Mybatis-Plus的增强功用,比如分页装备

@Configuration
public class MybatisConfiguration {
​
   @Bean
   public MybatisPlusInterceptor mybatisPlusInterceptor() {
     MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
     interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
     return interceptor;
   }
​
}

这样咱们就可以直接便利的运用Mybatis-Plus来进行数据库分页查询操作,不必像在运用Mybatis查询分页数据那样,自己写分页的查询类,组装查询结果,核算数据条数还要再写一个count的xml。

技能的前进是因为人的懒惰

从零到一搭建基础架构(6)-让你的服务组件化

从jdbc直接操作mysql,到mybatis编写xml就可以进行增修改查,最后到运用根据Mybatis二次开发的Mybatis-Plus。咱们只需求进行简略的装备,就可以快速运用结构中接口进行开发。

那假如咱们进行事务开发前,根底架构对Mybatis-Plus又包装了一层呢?将所有需求编写代码的装备都做了一个starter包呢?

关于starter包概念或许如何制作还不是很清楚的小伙伴可以阅读:手把手教你如何编写springboot中starter

事务研发只需在装备文件中添加一下数据库连接与分页装备,事务服务甚至连装备类都可以不必写了。

在根底架构中对Mybatis-Plus再包装一层,做成starter变成Mybatis-Baiyan-Plus。二次包装再开发,事务运用开箱即用。

哎呀,啥也不说了,便是起飞,便是便利。

从零到一搭建基础架构(6)-让你的服务组件化

有了这个思路,我来回答一下一个小老弟的问题。

从零到一搭建基础架构(6)-让你的服务组件化

分布式锁的东西类、装备这些关于事务运用来说基本上都是通用的,无非便是key的生成规矩不同,失效时刻不同,可重入规矩等不同,其余的装备都是相同的。

那咱们是不是可以根据本节的思路,将分布式锁的东西类包装成一个starter包(可插拔式组件),事务运用只需引进starter包的maven就能开箱即用你的东西类与装备,不是很爽吗?

从零到一搭建基础架构(6)-让你的服务组件化

二、插拔式组件仍是大的功用模块

研讨过common-frame工程的小伙伴有没有点疑问?

为什么我说插拔式的组件,但是并没有把一类组件独自区分一个Maven模块,而是把它们放在了service包中。

这里的插拔式组件其实是一个泛的概念。不是说一种功用的组件才能叫做插拔式组件,组合的也能叫。要看你怎样设计你的根底架构。

咱们来看看common-frame的service包中包含了什么?

  • minio的装备类与东西类
  • mybatis-plus的装备类
  • nginx装备类
  • service层面在运用POJO时区分的指导demo
  • spring的事件总线装备
  • spring的bean与环境变量读取东西类装备

上述的装备是咱们这个小组、这个部分、这个公司都必须运用到的装备时,我会把这些个东西类与装备都放在同一个包里边,不需求事务服务一个个去引进组件。

假如极致组件化一点的话,minion与mybatis-plus都应该独立做一个starter包来为事务服务供给根底架构能力。但我觉得是没什么必要,咱们应该挑选一个折中的方案:

  • 事务服务所共有的装备放在service包中。但只需是装备,都要加上类似于
@ConditionalOnProperty(value = "spring.minio.enable",havingValue = "true")

这样的开关,避免少数服务确实不需求某些装备。

  • 不一定所共有的,咱们界说与service统计的maven模块,它仅依靠base模块

这样即让事务服务可以快速的运用根底架构所带来的便当,还可以让事务服务灵敏的挑选想要运用的组件进行事务开发。

从零到一搭建基础架构(6)-让你的服务组件化

三、总结

本章的中心思维是包装与通用。在service层进行事务开发时,咱们对外部的jar的运用需求装备,需求二次开发。对内进行一些操作日志型的东西类进行运用时,具有十分高的通用性。

关于这些具有通用性的装备与东西类,咱们将其提取,做成starter。让事务服务只需求引进想要运用的功用的maven就能直接运用这些功用。

而插拔式组件的定位上是一个比较泛的概念,不是非要一类功用就要做一个组件。需求结合当时根底架构服务的事务运用对象是谁?

假如是公司层面的组件,那运用的服务可能是跨部分的,组件需求尽量细化,区分成多个。

假如是小部分或许小组内的组件,组件可以粗话,界说成一个大的以及几个小的即可。

最后用一张图来归纳一下事务服务关于插拔式组件的引用的maven。

从零到一搭建基础架构(6)-让你的服务组件化

四、联络我

假如你觉得文章写得不错,点赞评论+重视,么么哒~

微信:baiyan_lou

我的第一本小册《浅显易懂DDD》已经在上线,欢迎咱们试读~

DDD的微信群我也已经建好了,因为文章内不能放二维码,咱们可以加我微信,备注DDD沟通,我拉你进群,欢迎沟通共同前进。