架构序列一:如何规整的新建springcloud/springboot项目(微服务)?

springcloud和springboot框架,或许大家早已司空见惯,但是如何更优秀的开启自己的微服务呢?如何使code更规范呢?不再让后人唾弃,觉得晦涩难懂......

    基于此,作者会把一整套完整的架构贡献出来并手把手教给大家,免费的哦~

    环境:windows系统,jdk1.8,maven工具,idea开发工具

 

    整套架构初步规划包含技能点:

    springcloud、springboot、mybatis、分环境打包、mybatis-plus、动态数据源、druid、增删改查一键生成、gateway网关、feign的使用、熔断机制、如何防止雪崩、分布式+集群、注册中心:zookeeper+zkui和nacos、一个项目如何进行zk和nacos同时使用、动态配置:一个配置,所有集群节点共同热点使用

    

    首先新建一个maven项目:

    

图片

    

图片

 

图片

图片

 

图片

至此,整个项目最外层架子已经搭起来了,下面咱们继续填充模块:

图片

图片

图片

 

至此项目即这样:

图片

然后在增加一个parent,为何要增加parent呢,因为parent里无业务性源码,只有一个pom引用,表示所有的微服务都集成parent,使用parent下的pom引用的第三方jar,这样就不用每个微服务的pom给自己在引入同样的jar了。

图片

好了,以同样的方式在搞一个B业务服务:

图片

 

A服务与B服务在建立自己的真正的微服务:

图片

图片

同样的方式建B微服务:

图片

删除无用的文件夹:

图片

图片

parent的src进行保留,后续有用。

大家是不是很奇怪,作者为何要建一个micro-business-A,里面还要在新建micro-business-A-api呢?大家千万别急,一定要跟着作者一起继续,绝对会让你恍然大悟的。

大家有没有想过:如果A服务使用了一个dateUtil工具类,如果B也想使用呢?难道给A建一个dateUtil类,同时给B服务也要建吗?NONONO~,在建一个common它不香吗~

大家一起来:

图片

 

图片

图片

好了,至此,我们最简单,最规整的架子就搭起来了,是时候给pom填充内容了。

首先打开最micro-app的pom:

图片

图片

 

图片

源码分享:

<properties>
    <java.version>1.8</java.version>
    <spring-boot.version>2.3.1.RELEASE</spring-boot.version>
    <spring-boot-admin.version>2.2.1</spring-boot-admin.version>
    <mybatis.version>3.3.1</mybatis.version>
    <servlet.version>4.0.1</servlet.version>
    <fastjson.version>1.2.68</fastjson.version>
    <lombok.version>1.18.12</lombok.version>
    <commons-lang3.version>3.10</commons-lang3.version>
    <commons-collections.version>3.2.2</commons-collections.version>
    <commons-collections4.version>4.4</commons-collections4.version>

    <druid.version>1.1.22</druid.version>

    <mapstruct.version>1.3.1.Final</mapstruct.version>
    <jansi.version>1.18</jansi.version>

    <mysql.version>5.1.41</mysql.version>
<jackson.version>2.10.3</jackson.version>
<velocity.version>1.7</velocity.version>
<swagger2.version>2.9.2</swagger2.version>
<swagger-annotations.version>1.6.1</swagger-annotations.version>
<reflections.version>0.9.12</reflections.version>
<mybatis-plus-boot-starter.version>3.3.1</mybatis-plus-boot-starter.version>
<spring-cloud-openfeign.version>2.2.2.RELEASE</spring-cloud-openfeign.version>
<dynamic-datasource.version>3.1.1</dynamic-datasource.version>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
<jedis.version>3.2.0</jedis.version>
<netflix.version>2.2.2.RELEASE</netflix.version>
<maven-source-plugin.version>3.2.1</maven-source-plugin.version>
<maven-resources-plugin.version>3.1.0</maven-resources-plugin.version>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
<maven-javadoc-plugin.version>3.1.1</maven-javadoc-plugin.version>
<common-base.version>1.0.0</common-base.version>
<common-base-document.version>1.0.1</common-base-document.version>
<spring-web.version>5.2.7.RELEASE</spring-web.version>
</properties>

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>${maven-source-plugin.version}</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

 

好了,micro-app的pom已经完成,大家跟着作者继续编写parent的pom:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>${spring-boot.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>${spring-boot.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>${mybatis.version}</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>${mybatis.version}</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
    <!-- alibaba start -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>${druid.version}</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>${fastjson.version}</version>
    </dependency>
    <!-- alibaba end -->
    <!-- apache commons start -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${commons-lang3.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-collections4</artifactId>
        <version>${commons-collections4.version}</version>
    </dependency>
    <!-- apache commons end -->
    <!-- 对象属性复制 https://mapstruct.org/ -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${mapstruct.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity</artifactId>
        <version>${velocity.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <version>${spring-boot.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        <version>${spring-boot.version}</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>${jedis.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        <version>${netflix.version}</version>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<build>
    <resources>
        <!-- 资源文件配置 -->
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>config/**</exclude>
            </excludes>
        </resource>

        <!-- 过滤配置文件到config目录 -->
        <resource>
            <directory>src/main/resources/config</directory>
            <filtering>true</filtering>
            <targetPath>config</targetPath>
            <includes>
                <include>application.yml</include>
                <include>application-${profileActive}.yml</include>
                <include>banner.txt</include>
                <include>*.xml</include>
                <include>*.properties</include>
            </includes>
        </resource>

    </resources>

    <plugins>
        <!-- 由于没有直接继承spring-boot-starter-parent,此处修添加主类和设置repackage -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${spring-boot.version}</version>
            <configuration>
                <layout>ZIP</layout>
                <!--使用外部配置文件,jar包里没有资源文件-->
                <addResources>true</addResources>
                <outputDirectory>${project.build.directory}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>${maven-resources-plugin.version}</version>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler-plugin.version}</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>${mapstruct.version}</version>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>${lombok.version}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>

        <!-- 打包时跳过测试 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
            <configuration>
                <skipTests>true</skipTests>
                <testFailureIgnore>true</testFailureIgnore>
            </configuration>
        </plugin>

        <!-- 打包插件 -->
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <finalName>${project.build.finalName}-server</finalName>
                <descriptors>
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>${maven-javadoc-plugin.version}</version>
            <configuration>
                <encoding>UTF-8</encoding>
                <skip>true</skip>
                <additionalOptions>
                    <additionalOption>-Xdoclint:none</additionalOption>
                </additionalOptions>
            </configuration>
            <executions>
                <execution>
                    <id>attach-javadocs</id>
                    <phase>install</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </execution>
            </executions>
        </plugin>

    </plugins>

</build>

<!--MAVEN打包选择运行环境-->
<!-- 1:local(默认) 本地 2:dev:开发环境 3:test:测试环境 5.prod:生产环境 -->
<profiles>
    <profile>
        <id>local</id>
        <properties>
            <profileActive>local</profileActive>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>dev</id>
        <properties>
            <profileActive>dev</profileActive>
        </properties>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <profileActive>test</profileActive>
        </properties>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <profileActive>prod</profileActive>
        </properties>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
    </profile>
</profiles>

其中有作者使用过的一些第三方工具和打包插件

maven-assembly-plugin(等下会讲如何使用)以及maven打包环境的选择,默认是

local(本地环境),其中有:

1:local(默认) 本地 2:dev:开发环境 3:test:测试环境 5.prod:生产环境

供选择,当然可自己追加。

 

继续追加common的pom:

 

<dependencies>

 

    <dependency>
        <groupId>org.fusesource.jansi</groupId>
        <artifactId>jansi</artifactId>
        <version>${jansi.version}</version>
    </dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger-annotations.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<!-- mybatis-plus begin -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
<!-- mybatis-plus end -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${commons-collections.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>${commons-collections4.version}</version>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>${reflections.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.1.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
<scope>compile</scope>
</dependency>
</dependencies>

同样都是作者常用的第三方工具包。

 

同时common增加工具类,删除resources(用不上),如下图:

图片

上面的工具类我会把源码共享出来,大家不用着急。

刚才上面有提到打包插件maven-assembly-plugin,那具体怎么用呢?请看如下:

图片

A微服务和B微服务和parent都增加assembly.xml,A和B的assembly.xml一样,并且和parent的assembly.xml不一样,大家注意下。

那到底为什么要用这个插件呢?

目前作者使用这个插件主要是打出来的包不是jar形式,而是tar.gz的包,包中包含了jar包以及下面咱们继续要增加的内容:

图片

只给微服务下的src增加即可,里面包含了启动,关闭,重启项目,同时支持linux以及windows。那具体怎么用呢?后续我会慢慢道来,bin中的内容这里就不贴了,稍后会把源码共享出来,咱们先继续往下走:

上面说了,parent就是把需要共享的包提出来,那提出来给什么用呢?当然是每一个api微服务了,所以每个api服务都需要继承parent:

图片

A和B的api一样。

同时也增加平常使用的jar包:(A和B都加)

图片

<dependencies>
    <dependency>
        <groupId>com.laifeiyang.dev</groupId>
        <artifactId>micro-common</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${spring-boot.version}</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>${dynamic-datasource.version}</version>
    </dependency>

</dependencies>

 

 

好了,到此基本上一个项目的架构就搭起来了,是不是还缺少什么呢?微服务的启动方式是什么?

呢?是的,是main启动,所以在每个微服务里必须增加启动类

 

图片

A和B一样。

 

在增加配置文件:B同A一样,配置这里就不贴了,源码中有。

图片

 

至此最简单规范无业务的微服务就已经搭建起来了。

 

打包效果:B同A一样

图片

 

启动效果:B同A一样

图片

 

对了,如果大家要打包不同的环境,一定要注意打包的方式:

图片

package -P test   测试环境

package -P prod  生产环境

package -P dev  开发环境

package -P local 或 package 或 install   本地环境

 

由于规范比较多,类也比较多,所以这里就不给大家展示所有的类了,如果大家有兴趣可进行源码的获取,并且会继续更新哦,目前作者会一直持续更新到整个架构序列技能点全部共享出来。

 

获取源码:https://github.com/feeyanna/FlyingCoding.git

 

详细请关注作者订阅号查看相关内容:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值