草庐IT

新项目如何技术选型以及落地实现

小小张自由 2023-03-28 原文
 

目录

一、技术选型概述

二、确定Spring家族依赖的版本号

1.springcloud

2.spring cloud alibaba

3.springboot

三、确定数据库信息

1.MySQL相关

1.1  官网推荐,兼容性好

1.2  Maven使用频率较高:

2.数据库连接池

2.1  Druid与C3P0的比较

2.2  druid依赖的版本使用:1.2.6

四、搭建整个工程

1.父项目的pom依赖

2.子模块的依赖

3.部分目录结构 

五、其他依赖

推荐阅读

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。


一、技术选型概述

技术选型的基本原则:求稳,适当求新。

根据业务需求,选用B/S、微服务架构,使用Java作为后端开发语言,Vue作为前端开发。

项目管理工具使用禅道,内容管理工具使用Confluence,代码协同工具使用Git,

数据库使用MySQL,缓存使用Redis,集成开发环境使用IDEA。

之前用过的,建议依旧沿用。

以上内容只是根据业务确定。


二、确定Spring家族依赖的版本号

SpringBoot、SpringCloud、SpringCloud Alibaba皆选用官网最稳定,最新版本。

1.springcloud

官网地址:Spring Cloud

2.spring cloud alibaba

官网地址:Spring Cloud Alibaba

3.springboot

官网地址:Spring Boot

 

SpringBoot选用2.3.12.RELEASE的原因是:SpringCloud Hoxton.SR12版本推荐使用 2.3.12.RELEASE版本。


三、确定数据库信息

1.MySQL相关

MySQL服务器的版本是5.6(之前安装的继续沿用)

mysql依赖的版本使用:8.0.16

1.1  官网推荐,兼容性好

MySQL :: MySQL Connector/J 5.1 Developer Guide :: 2 Connector/J Versions, and the MySQL and Java Versions They Require

MySQL :: MySQL Connector/J 8.0 Developer Guide :: 1 Overview of MySQL Connector/J

以下是 Connector/J 8.0的一些兼容性信息:

JDBC版本:Connector/J 8.0实现JDBC 4.2。当Connector/J 8.0与JDBC更高版本的库一起工作时,对于仅由JDBC 4.3和更高版本支持的方法调用,它会返回SQLFeatureNotSupportedException。

MySQL服务器版本:Connector/J 8.0支持MySQL 5.6、5.7和8.0。

JRE版本:Connector/J 8.0支持JRE 8或更高版本。

编译需要JDK:编译Connector/J 8.0需要JDK 8.0或更高版本。此外,在连接到MySQL服务器时,可能需要定制JSSE提供程序来使用一些更高版本的TLS和密码套件

 

强烈建议将 MySQL Connector/J 8.0 与 MySQL Server 8.0、5.7 和 5.6 一起使用。请升级到 MySQL Connector/J 8.0。

1.2  Maven使用频率较高:

 

2.数据库连接池

2.1  Druid与C3P0的比较

Java-数据库连接池技术_小小张自由—>张有博-CSDN博客_java-数据库连接池技术

2.2  druid依赖的版本使用:1.2.6

druid与druid-spring-boot-starter 的区别

作用是一样的,都是连接池提供连接,里边的配置参数都是一样的;

druid-spring-boot-starter只是在druid基础上进行了一次封装,专门用来整合spring-boot项目;

如果springboot项目想使用druid也是可以的,但是需要手动编写配置类并注入到bean中,并加载对应的配置参数;

但是不建议,明明有现成封装好的jar,就直接使用就好了!!!

四、搭建整个工程

1.父项目的pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tfjybj</groupId>
    <artifactId>daily</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modules>
        <module>daily-statistics</module>
    </modules>

    <!-- 统一管理jar包版本 -->
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring.boot.version>2.3.12.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR12</spring.cloud.version>
        <spring.cloud.alibaba.version>2.1.2.RELEASE</spring.cloud.alibaba.version>
        <mysql.version>8.0.16</mysql.version>
        <druid.version>1.2.6</druid.version>
        <swagger.version>2.9.2</swagger.version>
        <lombok.version>1.18.8</lombok.version>
        <xxl-job.version>2.2.0</xxl-job.version>
        <fastjson.version>1.2.58</fastjson.version>
    </properties>




    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
    <!--在父工程pom文件中声明依赖,但不引入,父项目声明,供子项目按需引入-->
    <dependencyManagement>
        <dependencies>

            <!--spring boot,spring cloud,spring cloud alibaba-->
            <!--选用官网稳定的版本-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--swagger生成API文档-->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${swagger.version}</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${swagger.version}</version>
            </dependency>
            <!--fastjson的依赖-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <!--lombok的依赖-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>



        </dependencies>
    </dependencyManagement>

    <!--所有声明在父项目 dependencies 中的依赖都会自动引入,并默认被所有子项目继承-->
    <!--即使在子项目中不引入该依赖,那么子项目依然会从父项目中继承该依赖项。-->
    <dependencies>


    </dependencies>

</project>

2.子模块的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>daily</artifactId>
        <groupId>com.tfjybj</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>daily-statistics</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

        <!-- nacos服务注册/发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--nacos配置中心来做配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--重复依赖,但是没有找到在哪里-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-jdbc</artifactId>-->
<!--        </dependency>-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!--mysql:官网推荐 Maven使用频率较高-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>

         <!--swagger生成API文档-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>

        <!--lombok的依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--json格式转换-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>

        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.0.2</version>
        </dependency>


    </dependencies>

    <!--用于项目打包,打包需要的插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.12.RELEASE</version>
            </plugin>
        </plugins>
    </build>


</project>

2.1 nacos中的部分配置

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://mysql.xxx.tech/daily_prod
      username: roots
      password: roots
      filter:
        config:
          enabled: true #数据库过滤器是否开启
      connect-properties:
        druid.statmergeSql: true  #打开mergeSql功能
        druid.stat.slowSqlMillis: 5000  #慢SQL记录
        config.decrypt: false #是否解密
        config.decrypt.key: ${custom.publicKey} #解密的公钥
  jpa:
    hibernate:
      #      实体类发生改变,数据表会更新
      ddl-auto: update
      #      操作实体对象的时候,会跟我们生成sql语句: false 不生成sql语句:
      show-sql: true

2.2  Bootstrap中部分的配置

server:
  port: 9000

spring:
  cloud:
    nacos:
      discovery:
        server-addr: nacos.xxx.tech:80
        namespace: Daily-dev
      config:
        server-addr: nacos.xxx.tech:80
        namespace: Daily
        prefix: statistics
        file-extension: yml
  application:
    name: Daily-statistics

xxl:
  job:
    admin:
      addresses: http://xxljob.xxx.tech:8081/job-admin-dev  #xxljob调度中心部署  例如:http://127.0.0.1:8080/xxl-job-admin
    executor:
      appname: daily-test #xxljob配置的执行器名称,
      ip:             #执行器IP,默认为空表示自动获取IP
      port: 9998 #xxljob配置的端口号,默认为9999
      logpath: /data/xxl-job/jobhandler  #执行器运行日志文件存储磁盘路径
      logretentiondays: -1  #调度中心日志表数据保存天数,过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能
    accessToken: #调度中心通讯TOKEN [选填]:非空时启用


logging:
  level:
    com.alibaba: warn

3.部分目录结构 

 

五、其他依赖

其他依赖的版本号:没有仔细研究,使用我们其他项目中常用的。其实也可以直接去Maven官网上找。https://mvnrepository.com/

或者去github社区看看活跃度。没活跃度的就别用了,容易出错,出错不易解决。

推荐阅读

使用到了nacos做注册中心,配置中心,配置过程请见博客:SpringBoot项目集成nacos,并启动报错Failed to configure a DataSource: ‘url‘ attribute is not speci_小小张自由—>张有博-CSDN博客_springboot集成nacos启动报错

使用到了xxljob管理定时任务,配置过程请见博客:SpringBoot项目集成xxljob全纪录(图文详解)_小小张自由—>张有博-CSDN博客

使用到了sonarqube检查代码质量,配置过程请见博客:配置sonarqube的全过程_小小张自由—>张有博-CSDN博客_sonarqube使用方法

对异常进行了统一处理,配置过程请见博客:Spring Boot 统一处理全局异常_小小张自由—>张有博-CSDN博客

通过AOP实现全局日志打印,配置过程请见博客:

通过AOP实现全局日志打印_小小张自由—>张有博-CSDN博客

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。

 

 

 

 

 


有关新项目如何技术选型以及落地实现的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  8. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  9. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  10. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

随机推荐