java脚手架系列1--模块化、多环境

news2024/10/9 11:20:15

之所以想写这一系列,是因为之前工作过程中有几次项目是从零开始搭建的,而且项目涉及的内容还不少。在这过程中,遇到了很多棘手的非业务问题,在不断实践过程中慢慢积累出一些基本的实践经验,认为这些与业务无关的基本的实践经验其实可以复刻到其它项目上,在行业内可能称为脚手架,因此决定将此java基础脚手架的搭建总结下来,分享给大家使用。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中主要使用基本框架是 spring-boo-2.3.12.RELEASE和spring-cloud.-Hoxton.SR12,所有代码都在commonFramework项目上:https://github.com/forever1986/commonFramework/tree/master

目录

  • 1 模块化
  • 2 多环境
    • 2.1 基本概念
    • 2.2 代码实践

1 模块化

相信各位在项目落地过程中,随着项目内容越来越多,会遇到以下问题:
1)代码过渡耦合,相互引用混乱
2)代码结构缺乏清晰度
开发者对自己或者他人负责的代码边界很模糊,这是复杂项目中最容易遇到的,导致的结果就是开发者很容易修改了他人负责的代码且代码负责人还不知道,责任追踪很麻烦。这时候会有一个比较好的方式,就是模块化。
将一个复杂项目拆分成多个模块是解决上述问题的一个重要方法,多模块的划分可以降低代码之间的耦合性(从类级别的耦合提升到jar包级别的耦合),每个模块都可以是自解释的(通过模块名或者模块文档),模块还规范了代码边界的划分,开发者很容易通过模块确定自己所负责的内容。那么在实践中,模块化有哪些注意点:

  • 父项目:使用java的模块化,一般有一个“空项目”作为父项目,说是“空项目”是因为父项目一般不会拥有功能性,只是一个整体架构的分层体现。
  • 划分类型:可以通过业务划分(公共模块、业务模块等等),也可以通过层级划分(业务层、持久层等)。实践可以根据业务或者框架来划分,比如你使用微服务,那么你可以划分公共模块+业务模块。
  • spring-boot和spring-cloud是目前搭建java后端项目的基本框架。但是我们经常看到项目的pom文件依赖于spring-boot-starter或者依赖于spring-boot-dependencies,其实spring-boot-starter是继承spring-boot-dependencies,如果你的项目或者模块有一个父项目,那么就采用依赖于spring-boot-dependencies;反之则可以采用spring-boot-starter。spring-cloud也是一样的。
  • 使用多模块,还有一个好处就是维护依赖,这时候需要了解pom文件中的dependencyManagement,这是一个规定引入模块及其版本的定义,一般定义在父项目,这样其子模块引入某个依赖就不需要写特定版本,同时也不会造成版本冲突。
  • 打包也是多模块的一个问题,特别是需要引入其它的打包方式,也会导致项目内部子模块打包的问题,因此使用build标签也是需要了解的,其中plugin可以定义Maven不同阶段打包,这样也可以统一规范项目整体打包方式

说了这么多模块化的好处,那么多模块没有坏处吗?当然有,第一个就是散落在各个模块之间就存在依赖性,而依赖性可能会导致编译的性能变慢;其次,多模块化的依赖,一不小心也可能导致依赖循环。那么解决这2个问题,可以采用以下原则:

  • 使用spring-boot的扩展方式spring.factories定义公共模块,这样就是以jar方式引入模块,从而降低一定的编译
  • 定义层级关系,如果我们定义持久层、逻辑层和业务层一样,上层只能引用下层,同层之间可以引用,但是下层不能引用上层。

参考:commonFramework父项目

1)以commonFramework为父项目,在改项目中pom文件中设置各个依赖版本,以便后续子模块使用
2)在commonFramework下建立子模块,其中包括common子模块,common子模块拥有其子模块common-log、common-mybatis、common-swagger等,它们都是以spring.factories方式存在
3)存在manager-biz为业务子模块示例,auth-authentication为oauth授权服务器子模块等等

2 多环境

2.1 基本概念

在项目脚手架中,多环境是一个基本要求。在实际项目开发中,我们会有开发、测试和生产等不同环境,他们在配置一些参数、数据库等都可能不同,因此需要我们配置一个多环境的配置方式,这样我们在开发、打包等操作时,可以随意切换,而不需要做大规模的改动。spring-boot本身提供了spring.profiles.active配置来设置不同环境。在这里我们需要了解spring-boot加载配置文件的基本逻辑:

  • bootstrap.yml(bootstrap.properties)和application.yml(application.properties)。第一:他们之间是先加载bootstrap文件,再加载application文件。第二:bootstrap文件一般理解为系统级别配置,而application是应用级别配置;第三:实际上有一个重要的点就是你某些配置是否需要在Spring ApplicationContext中加载(比如我们说的如果配置多环境时,使用配置中心nacos加载配置中心上面的文件,则需要将nacos配置和spring.profiles.active配置到bootstrap文件中)
  • spring.profiles.active是决定加载那个环境的配置,根据其值,比如说dev,那么会加载application-dev.yml文件
  • nacos说明:nacos有命名空间、分组。而这些都可以对应我们不同环境的划分,我们可以采用不同划分环境方法。比如采用不同nacos服务器作为不同环境划分、采用不同命名空间作为不同环境划分、采用不同分组命名空间作为不同环境划分。实践中,一般采用不同nacos服务器作为不同环境的划分,使用命名空间作为不同业务服务划分。
  • nacos配置
  # nacos配置
spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848   # nacos服务器地址
        namespace: manage-biz   # nacos命名空间
        group: ${spring.profiles.active}  # nacos的分组
        file-extension: yaml  # 加载文件的后缀名
        username: manage-biz  # nacos用户名
        password: manage-biz  # nacos密码
        shared-configs[0]:    # 共享文件(无论哪个环境,都会加载此文件)
          data-id: common.yaml
          refresh: true
          namespace: manage-biz
          group: ${spring.profiles.active}```
  • 配置说明:上面的配置采用的是使用分组作为不同环境配置,namespace作为不同业务配置。默认加载以服务名称+file-extension组合的文件
    参考:manage-biz模块

2.2 代码实践

下面通过读取nacos配置方式配置多环境,以namespace命名空间作为不同业务子模块区分,以group分组作为不同环境区分,同时配置一个shared-config公共配置。

请参考manage-biz子模块

1) 在项目commonFramework下建子模块manage-biz
2)引入spring-boot-web和alibaba-nacos-config

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>

3)在resource下配置bootstrap.yml文件

server:
  port: 9981
spring:
  # 应用名称
  application:
    name: cloud-manage-biz-service
  # 激活环境
  profiles:
    active: dev
  # nacos配置
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: manage-biz
        group: ${spring.profiles.active}
        file-extension: yaml
        username: manage-biz
        password: manage-biz
        shared-configs[0]:
          data-id: common.yaml
          refresh: true
          namespace: manage-biz
          group: ${spring.profiles.active}

4)设置读取配置常量作为测试

package com.demo.manage.biz.constant;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Data
@Component
@RefreshScope
public class NacosValueConstant {

    @Value("${my.project.name}")
    private String value;

    @Value("${lin.test}")
    private String test;
}

5)在nacos配置命名空间为manage-biz,同时创建manage-biz用户拥有manage-biz命名空间。
6)在命名空间manage-biz下,创建3个不同分组的cloud-manage-biz-service.yaml和common.yaml文件(group分别为dev、test和prod)
在这里插入图片描述

7)在6个文件下面分别设置常量my.project.name和lin.test的值,分别设置不同
8)通过修改bootstrap.yml文件里面的spring.profiles.active的值去读取nacos的不同文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2198879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kkFileView 4.4.0最新版本发行版安装包部署及使用文档

kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 一. 下载&部署 下载最新发行包&…

网络层协议 --- IP

序言 在这篇文章中我们将介绍 IP协议&#xff0c;经过这篇文章的学习&#xff0c;我们就会了解运营商到底是如何为我们提供服务的以及平时我们所说的内网&#xff0c;公网到底又是什么&#xff0c;区别是什么&#xff1f; IP 地址的基本概念 1. IP 地址的定义 每一个设备接入…

Java中String类的常见操作Api

目录 String类的常见操作 1).int indexOf (char 字符) 2).int lastIndexOf(char 字符) 3).int indexOf(String 字符串) 4).int lastIndexOf(String 字符串) 5).char charAt(int 索引) 6).Boolean endWith(String 字符串) 7).int length() 8).boolean equals(T 比较对象) 9).b…

【2024】作为前端开发,必须掌握的 Vue3 的 5 个组合式 API 方法

引言&#xff1a;2024 你还不知道 Vue3 的 defineProps、defineEmits、defineExpose、defineOptions 和 defineSlots 吗&#xff1f;这几个 Vue3 组合式 API 方法不仅开发常用&#xff08;涉及组件通信、组件复用等&#xff09;&#xff0c;在面试中也是不可或缺的一部分&#…

SpringBoot实现电子文件签字+合同系统!

一、前言 二、项目源码及部署 1、项目结构及使用框架 2、项目下载及部署 三、功能展示 一、前言 今天公司领导提出一个功能,说实现一个文件的签字+盖章功能,然后自己进行了简单的学习,对文档进行数字签名与签署纸质文档的原因大致相同,数字签名通过使用计算机加密来验证 (…

LabVIEW提高开发效率技巧----阻塞时钟

在LabVIEW开发中&#xff0c;阻塞时钟&#xff08;Blocking Timed Loops&#xff09;是一种常见且强大的技术&#xff0c;尤其适用于时间关键的应用。在这些应用中&#xff0c;精确控制循环的执行频率是关键任务。阻塞时钟通过等待循环的执行完成后再进入下一次迭代&#xff0c…

鸿蒙 Next 实战: 烟花模拟器

前言 通过上一篇文章可以看出&#xff0c;要在鸿蒙应用中实现特别炫的特效还是比较复杂。动画固然重要&#xff0c;但如果在赶工期的情况下&#xff0c;大家都会优先业务&#xff0c;那有没有简单快速的方法呢&#xff1f; 有的&#xff0c;也用像 Android 和 iOS 里 WebView …

.Net Core 接口或网站发布到IIS

将.Net Core 接口或网站发布到IIS上&#xff0c;需要遵循一系列步骤来确保正确配置和部署。下面将以.NET Core 3.1的api接口发布示范&#xff1a; 一、环境准备 安装.NET Core 3.1 SDK和运行时&#xff1a; 在服务器上安装.NET Core 3.1 SDK&#xff08;如果需要在服务器上编译…

宝兰德亮相2024国际信息通信展:数智创新,信创力量!

9月25日-27日&#xff0c;2024中国国际信息通信展览会在北京国家会议中心隆重召开。本届展会以“推动数实深度融合&#xff0c;共筑新质生产力”为主题&#xff0c;全面展示信息通信业发展最新成果。作为国内领先的基础软件供应商&#xff0c;宝兰德再度闪耀会场&#xff0c;在…

[ROS】rqt工具箱

作用&#xff1a; 可以方便的实现 ROS 可视化调试&#xff0c;并且在同一窗口中打开多个部件&#xff0c;提高开发效率&#xff0c;优化用户体验。 组成&#xff1a; rqt工具箱组成有三大部分 rqt 核心实现&#xff0c;开发人员无需关注 rqt_common_plugins rqt…

Gated Transformer Networks for Multivariate Time Series Classification

博客贡献人 徐宁 作者 Minghao Liu , Shengqi Ren , Siyuan Ma , Jiahui Jiao , Yizhou Chen , Zhiguang Wang(Facebook AI) and Wei Song∗ 标签 多元时间序列分类&#xff0c;Transformer&#xff0c;门控 摘要 用于时间序列分类的深度学习模型&#xff08;主要是卷积网…

GO网络编程(七):海量用户通信系统5:分层架构

P323开始&#xff08;尚硅谷GO教程&#xff09;老韩又改目录结构了&#xff0c;没办法&#xff0c;和之前一样&#xff0c;先说下目录结构&#xff0c;再给代码&#xff0c;部分代码在之前讲过&#xff0c;还有知识的话由于本人近期很忙&#xff0c;所以这些就不多赘述了&#…

【源码+文档】基于SpringBoot+Vue的健康宝个人健康管理平台

一、项目技术架构&#xff1a; 本项目是一款基于SpringBootVue的个人健康信息管理系统。后端采用SpringBoot架构&#xff0c;前端采用VueElementUI实现页面的快速开发&#xff0c;并使用关系型数据库MySQL存储系统运行数据。本系统分为两种角色&#xff0c;分别是系统管理员&a…

DS入门引言(0)

文章目录 前言一、什么是数据结构&#xff1f;二、什么是算法&#xff1f;三、数据结构与算法的重要性&#xff1f;四、如何学习它们&#xff1f;总结 前言 是的&#xff0c;我又开了一个专栏&#xff0c;数据结构&#xff08;Data Structure&#xff09;&#xff0c;其实数据结…

【人工智能】AI人工智能的重要组成部分,深入解析CNN与RNN两种神经网络的异同与应用场景和区别

文章目录 一、卷积神经网络&#xff08;CNN&#xff09;详解1. 特征与结构CNN的基本结构 2. 应用场景3. 代码示例 二、循环神经网络&#xff08;RNN&#xff09;详解1. 网络结构与特点RNN的基本结构 2. 应用场景3. 代码示例 三、CNN与RNN的异同点1. 相同点2. 不同点 四、CNN与R…

javascript 阿里云,如何返回某个目录的文件

一、效果图 二、实际代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>阿里云 OSS 文件列表&…

合约测试用例详解

合约测试的综合案例 第一部分 压力测试(使用caliper工具测试) 1.环境要求 配置基本环境 部署Caliper的计算机需要有外网权限;操作系统版本需要满足以下要求:Ubuntu >= 16.04、CentOS >= 7或MacOS >= 10.14;部署Caliper的计算机需要安装有以下软件:python 2.7…

PMP--冲刺题--解题--91-100

文章目录 11.风险管理--4.实施定量风险分析--题干场景中提到了“专家”&#xff0c;同时即将开始“量化风险”&#xff0c;因此对应的就是“定量风险分析”中的“专家判断”技术。项目经理应先征求各位专家们的意见&#xff0c;以获取最佳的量化风险实施方案。谋定而后动91、 […

wordpress发邮件SMTP服务器配置步骤指南?

wordpress发邮件功能如何优化&#xff1f;怎么用wordpress发信&#xff1f; 由于WordPress默认的邮件发送功能可能不够稳定&#xff0c;配置SMTP服务器成为了许多网站管理员的选择。AokSend将详细介绍如何在WordPress中配置SMTP服务器&#xff0c;以确保邮件能够顺利发送。 w…