美文网首页
实战篇-基础设施,基类与配置

实战篇-基础设施,基类与配置

作者: jimmyz81 | 来源:发表于2022-04-13 21:54 被阅读0次

# 基础基类

- BaseEntity

[infrastructure-core/src/main/java/plus/cove/infrastructure/component/BaseEntity.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]

- 定义所有领域的基类
设置所有类的主键为id,类型为Long,通过雪花算法生成主键,子类可以通过valueOf()生成主键。

雪花算法Long类型主键

- 算法足够简单,除服务器时间需要一致外无其他依赖,1毫秒支持4096个序列,支持1024台机器,支持82年
- 生成数据非连续递增,适合MySql存储引擎
- 全局唯一,适合分表,数据运维等

*Twitter-Snowflake,64位自增ID算法详解 - 简书 (jianshu.com)
* 支持尾数奇偶分散分布,参考<shardingsphere-jdbc>中关于分布式自增主键策略的说明
* 同时提供每日序列号生成器,可以用在每天生成不重复序号的场景,每日序号生成器 [infrastructure-core/src/main/java/plus/cove/infrastructure/generator/DailyNumberGenerator.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]

BaseTimeEntity 
- 带创建时间和更新时间,valueOf()同时对id和时间进行赋值。

- BaseEnum

[infrastructure-core/src/main/java/plus/cove/infrastructure/component/BaseEnum.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]

- 定义所有枚举的基类,用于枚举与数字转换(数据库保存),枚举到描述转换(导出Excel)
- 需要多个描述,可以进行扩展

- ActionResult

[infrastructure-core/src/main/java/plus/cove/infrastructure/component/ActionResult.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]
接口统一返回结构,格式:code=0表示成功,其他失败
{code: 0, message: '错误信息', data: [Object|Array]}

一般情况下业务层直接抛出异常即可,通过webapi层的@ControllerAdvice+@ExceptionHandler [flower-webapi/src/main/java/plus/cove/flower/webapi/config/WebResponseException.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)],截获异常,并返回此格式 。

具体异常可以参阅下节<BusienssException>

- BusinessException

[infrastructure-core/src/main/java/plus/cove/infrastructure/exception/BusinessException.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]
业务异常,包括异常编码和异常信息,业务逻辑使用此异常即可。
通过BusinessError来定义具体业务的具体错误,项目定义了部分公共错误,包括NetworkError, ServiceError, SystemError, ValidatorError。

业务逻辑可以通过throw BusinessException.from(error)或者直接使用校验工具类AssertHelper来抛出异常。 [infrastructure-core/src/main/java/plus/cove/infrastructure/helper/AssertHelper.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]

比如创建账号的时,通过名称查询账号account已存在,则可以通过AssertHelper.assertNull(account, AccountError.EXISTED_ACCOUNT)直接抛出异常。

- BaseConverter

[infrastructure-core/src/main/java/plus/cove/infrastructure/converter/BaseConverter.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]
统一转换,对entity和dto进行转换,对对象和集合进行转换。
DefaultConverter 
- 默认实现,采用orika进行实现(之前用的是mapstruct),默认实现只支持同名称转换,对于复杂转换,可以通过继承DefaultConter,实现自定义转换。

# Spring相关配置

所有的配置以Unite为开始,property以summer.开始。

- cache相关

infrastructure-spring/src/main/java/plus/cove/infrastructure/spring/caching · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)

- UniteCacheConfig  <summer.cache-config>

对缓存进行配置,包括默认过期时间,最大过期时间,空值保留时间
- 最大过期时间:如果缓存的过期时间设置为无限大,则缓存修改名称或者更换库时,会存在无效缓存的风险或带来运维的压力,最大过期时间是针对此种情况,对超过最大过期时间的缓存进行重置,只针对redis;
- 默认过期时间:如果没有设置缓存时间,则使用此设置;
- 空值过期时间:如果缓存为空,则保持此设置时间,防止缓存击穿,需要结合CacheUtils使用;
- 支持@Cacheable方式使用,可以使用CacheUtils进行手动缓存操作,该工具同时支持缓存空值,防止缓存击穿。

架构使用SpringBoot-Cache

- 使用缓存方式一致,支持多种缓存方式,通过在application.properties中配置spring.cache.type=SIMPLE|REDIS,无需改动代码即可实现缓存方式切换,可以方便开发与测试环境切换或调试。
- Cacheable支持设置缓存过期时间(SpringBoot为了支持不同缓存方案 ,不支持设置缓存过期时间),通过在key后加#秒数,可以设置缓存过期时间,比如:@Cacheable(cacheNames = "CACHE_NAME", key = "CACHE_KEY#10"),即设置缓存时间为10秒,CacheUtils同样支持。具体见UniteCacheConfig.resetCache(String name)

- http相关

infrastructure-spring/src/main/java/plus/cove/infrastructure/spring/http · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)

UniteHttpConfig  <summer.http-config>

对连接超时,读取超时,跨域等进行设置
- corsMaxAge 跨域预校验有效期
- corsAllowedOrigin 跨域允许的源地址
- corsAllowedHeaders 跨域允许的头
- corsAllowedMethods 跨域运行的方法

- json相关

infrastructure-spring/src/main/java/plus/cove/infrastructure/spring/json · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)

UniteJsonConfig  <summer.json-config>

- 设置日期格式化;
- 设置jackson格式化,包括忽略不存在的属性,忽略重复属性;
- JsonUtils可以手动序列化和反序列化,与系统默认保持一致。

关于Long类型格式化

js不支持Long,如果主键是Long类型,直接返回的话js无法使用,通过使用jackson的ObjectMapper的SimpleModel设置String和Long类型在前后台进行转换,具体见:UniteJsonConfig.setJsonMapper()

关于Redis格式化

为了使redis具有可读性,value使用json格式,具体设置见DefaultRedisCacheConfig
redis能够反序列化json格式,需要携带类型名,需要在jackson的ObjectMapper中设置携带类型名,具体见UniteJsonConfig.setRedisMapper()

- redis相关

infrastructure-spring/src/main/java/plus/cove/infrastructure/spring/redis · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)

UniteRedisConfig  <summer.redis-config>

DefaultRedisCacheConfig - 设置redis的key和value格式化,使用jackson进行格式化,在webapi的RedisConfig进行设置,具体见代码。

- jwt相关

infrastructure-spring/src/main/java/plus/cove/infrastructure/spring/jwt · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)

UniteJwtConfig  <summer.jwt-config>
设置jwt相关参数,包括发行人,身份,角色等
- tokenExpired 设置jwt过期时间,默认三天
- tokenSecret 设置jwt密钥,算法使用HmacSHA512,使用此密码进行加密。

- validator相关

infrastructure-spring/src/main/java/plus/cove/infrastructure/spring/validator · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)

接口输入验证是一个高频使用功能,如果使用if判断会非常繁琐,代码丑陋,系统使用java规范JSR303并结合Spring的@Validated
flower-webapi/src/main/java/plus/cove/flower/webapi/controller/DistrictController.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)

在JSR303基础上,增加部分通用验证器,包括中文校验,日期范围校验,手机号检验,同时支持ValidatorUtils手动校验。

使用方法
DistrictController的class上增加@Validated
DistrictController的method的参数上增加@Valid
如果校验失败则抛出ConstraintViolationException或MethodArgumentNotValidException异常,通过@ControllerAdvice截获异常,具体见 [flower-webapi/src/main/java/plus/cove/flower/webapi/config/WebResponseException.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]

关于集合校验,需要在手动CollectionValidator,具体见WebMvcConfig-getValidator()


SpringBoot入门系列

实战篇-项目架构,原则和分层
实战篇-基础设施,基类与配置
实战篇-接口实现,配置和部署
实战篇-仓储技术选型
实战篇-工具类实战

相关文章

  • Android单元测试(二)-实战

    一、项目单元测试环境配置 gradle配置: 抽取单测基类: 1)纯java单测基类 2)PowerMock基类 ...

  • mpaasH5容器定制 H5 页面导航栏

    一、处理H5 基类 1、创建、指定H5 基类 在配置容器的时候指定H5 基类 2、在基类的viewWillAppe...

  • 架构 学习

    第三层:ASI、AF或者其他网络请求方式。 第二层:第二层分有基类与类目(Category)构成,基类用于配置共有...

  • [Spring] Spring Test结合JUnit的单元测试

    配置依赖文件名:pom.xml(部分) 建立与src同级的测试源码目录 (test),编写测试基类。BastTes...

  • C#——访问基类的成员

    1.基类与派生类之间的转换C#允许派生类转换为基类,但不允许把基类转换为派生类。这样,一个基类的对象即可以指向基类...

  • Dubbo Config

    Dubbo Config AbstractConfig 这是dubbo所有的配置类的基类,除了id外没有实例属性了...

  • OC.派生、重写、多态

    1.派生类是在基类的基础之上设计出来的, 其目的是扩展基类的功能或修改基类功能. 派生类包含了基类的所有特征与功能...

  • 9. C++ 继承 基类、派生类、访问权限

    9.1 基类与派生类 被继承的类称为父类或基类,继承的类称为子类或派生类。“子类”和“父类”通常放在一起称呼,“基...

  • CSPM云安全配置管理CSPM(云安全动态管理)

    CSPM云安全配置管理CSPM(云安全动态管理) CSPM能够对基础设施安全配置进行分析与管理。这些安全配置包括账...

  • Retrofit2 的使用与封装

    Retrofit2 的使用与封装 响应基类 请求数据对象基类 BaseNetClient BaseNetHelpe...

网友评论

      本文标题:实战篇-基础设施,基类与配置

      本文链接:https://www.haomeiwen.com/subject/mumasrtx.html