Bootstrap

基于jdk17,mysql8,redis7,spring boot3,spring cloud Alibaba ,nacos,openfigen,resilience4j等搭建的微服务框架

概要

本篇文章基于jdk17,mysql8,redis7,spring boot3,spring cloud Alibaba
2023.0.1,nacos,openfigen,resilience4j,LoadBalance,gateway搭建的微服务框架,本章不会又太多的废话,直接上干活!

夫工程

如果不会创建夫工程的话,请查阅其他文章
在这里插入图片描述

夫工程 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.4</version>
        <relativePath/>
    </parent>

    <groupId>com.huiHang</groupId>
    <artifactId>hh-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>hh-parent</name>
    <description>hh-parent</description>
    <packaging>pom</packaging>
    <properties>
        <!--项目版本信息-->
        <java.version>17</java.version>
        <file.encoding>UTF-8</file.encoding>
        <!-- Maven及插件配置 -->
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <maven.compiler.encoding>${file.encoding}</maven.compiler.encoding>
        <maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
        <maven-surefire-plugin.version>3.2.5</maven-surefire-plugin.version>
        <flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
        <spring-boot-maven-plugin.version>${spring-boot.version}</spring-boot-maven-plugin.version>
        <!-- 项目编码配置 -->
        <!-- 项目依赖仲裁信息 -->
        <spring-boot.version>3.2.4</spring-boot.version>
        <spring-cloud.version>2023.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2023.0.1.2</spring-cloud-alibaba.version>
        <spring-cloud-starter-bootstrap>4.2.0</spring-cloud-starter-bootstrap>
        <djl.version>0.28.0</djl.version>
        <sa-token.version>1.38.0</sa-token.version>
        <!--数据库与缓存-->
        <mysql-connector-java>8.0.33</mysql-connector-java>
        <mybatis-plus-spring-boot3-starter>3.5.7</mybatis-plus-spring-boot3-starter>
        <redisson.version>3.30.0</redisson.version>
        <caffeine.version>3.1.8</caffeine.version>
        <jetcache.version>2.7.6</jetcache.version>
        <kryo>5.3.0</kryo>
        <jedis>5.2.0</jedis>

        <!-- 工具包 -->
        <transmittable-thread-local.version>2.14.5</transmittable-thread-local.version>
        <hutool.version>5.8.28</hutool.version>
        <mapstruct.version>1.5.5.Final</mapstruct.version>
        <hanlp.version>portable-1.8.4</hanlp.version>
        <easyexcel.version>3.3.4</easyexcel.version>
        <!-- 接口文档工具包-->
        <springdoc-openapi-starter-webmvc-ui>2.6.0</springdoc-openapi-starter-webmvc-ui>
        <lombok>1.18.20</lombok>
        <junit>4.12</junit>



    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok}</version>
            <scope>provided</scope>
        </dependency>
        <!-- 写在此处的依赖都会传递到子模块中 -->
    </dependencies>

    <dependencyManagement>
        <dependencies>


            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit}</version>
                <scope>test</scope>
            </dependency>

            <!-- SpringBoot的依赖配置-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloud的依赖配置-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloudAlibaba的依赖配置-->
            <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>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bootstrap</artifactId>
                <version>${spring-cloud-starter-bootstrap}</version>
            </dependency>


            <!-- Sa-token 权限认证框架 -->
            <dependency>
                <groupId>cn.dev33</groupId>
                <artifactId>sa-token-dependencies</artifactId>
                <version>${sa-token.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Deep Java Library Java深度学习框架-->
            <dependency>
                <groupId>ai.djl</groupId>
                <artifactId>bom</artifactId>
                <version>${djl.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 数据库与缓存 -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
                <version>${mybatis-plus-spring-boot3-starter}</version>
            </dependency>
            <dependency>
                <groupId>org.redisson</groupId>
                <artifactId>redisson-spring-boot-starter</artifactId>
                <version>${redisson.version}</version>
            </dependency>

            <dependency>
                <groupId>com.esotericsoftware</groupId>
                <artifactId>kryo</artifactId>
                <version>${kryo}</version>
            </dependency>

            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>${jedis}</version>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql-connector-java}</version>
            </dependency>


            <dependency>
                <!-- JetCache 缓存框架 -->
                <groupId>com.alicp.jetcache</groupId>
                <artifactId>jetcache-bom</artifactId>
                <version>${jetcache.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <!-- HuTool 工具库-->
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>${hutool.version}</version>
            </dependency>
            <dependency>
                <!-- HuTool 工具库扩展-->
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-extra</artifactId>
                <version>${hutool.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct</artifactId>
                <version>${mapstruct.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${mapstruct.version}</version>
            </dependency>
            <dependency>
                <!-- 汉字转拼音依赖库 -->
                <groupId>com.hankcs</groupId>
                <artifactId>hanlp</artifactId>
                <version>${hanlp.version}</version>
            </dependency>
            <dependency>
                <!-- Excel处理工具 -->
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>${easyexcel.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springdoc</groupId>
                <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
                <version>${springdoc-openapi-starter-webmvc-ui}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <!-- flatten-maven-plugin 插件,用于统一发布版本 -->
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>flatten-maven-plugin</artifactId>
                    <version>${flatten-maven-plugin.version}</version>
                </plugin>
                <plugin>
                    <!-- maven-compiler-plugin 插件,用于编译 -->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven-compiler-plugin.version}</version>
                </plugin>
                <plugin>
                    <!-- maven-surefire-plugin 插件,用于运行单元测试-->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>${maven-surefire-plugin.version}</version>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.2.4</version>
                <configuration>
                    <skip>true</skip>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>flatten-maven-plugin</artifactId>
                <configuration>
                    <updatePomFile>true</updatePomFile>
                    <flattenMode>resolveCiFriendliesOnly</flattenMode>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

微服务代码

所有的代码都打成压缩包了,可自行下载

nacos 配置

server:
  port: 1012

spring:
  data:
    redis:
      host: 
      port: 6379
      password: wu_xs_redis
      database: 15
      ssl:
        enabled: false
  redis:
    lettuce:
      pool:
        max-active: 64     # 最大活跃连接数
        max-idle: 24       # 最大空闲连接数
        min-idle: 1        # 最小空闲连接数
        max-wait: -1ms     # 当没有可用连接时,等待的时间;-1 表示无限期等待
  datasource:
    username: root
    password: wu_xs_mysql
    #?serverTimezone=UTC解决时区的报错
    url: jdbc:mysql://:3306/mail_auth?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource
  cloud:
    openfeign:
      client:
        config:
          default:
            #连接超时时间
            connect-timeout: 30
            #读取超时时间
            read-timeout: 30
      httpclient:
        hc5:
          enabled: true
      compression:
        request:
          enabled: true
          min-request-size: 2048 #最小触发压缩的大小
          mime-types: text/xml,application/xml,application/json #触发压缩数据类型
        response:
          enabled: true
      # 开启circuitbreaker和分组激活 spring.cloud.openfeign.circuitbreaker.enabled
      circuitbreaker:
        enabled: true
        group:
          enabled: true #没开分组永远不用分组的配置。精确优先、分组次之(开了分组)、默认最后
    discovery:
      client:
        simple:
          instances:
            mail-auth:
              - uri: http://localhost:1012
              - uri: http://localhost:1013    
# Resilience4j CircuitBreaker 按照次数:COUNT_BASED 的例子
#  6次访问中当执行方法的失败率达到50%CircuitBreaker将进入开启OPEN状态(保险丝跳闸断电)拒绝所有请求。
#  等待5秒后,CircuitBreaker 将自动从开启OPEN状态过渡到半开HALF_OPEN状态,允许一些请求通过以测试服务是否恢复正常。
#  如还是异常CircuitBreaker 将重新进入开启OPEN状态;如正常将进入关闭CLOSE闭合状态恢复正常处理请求。
resilience4j:
  timelimiter:
    configs:
      default:
        timeout-duration: 30 #神坑的位置,timelimiter 默认限制远程1s,超于1s就超时异常,配置了降级,就走降级逻辑
  circuitbreaker:
    configs:
      default:
        failureRateThreshold: 50 #设置50%的调用失败时打开断路器,超过失败请求百分⽐CircuitBreaker变为OPEN状态。
        slowCallDurationThreshold: 2s #慢调用时间阈值,高于这个阈值的视为慢调用并增加慢调用比例。
        slowCallRateThreshold: 30 #慢调用百分比峰值,断路器把调用时间⼤于slowCallDurationThreshold,视为慢调用,当慢调用比例高于阈值,断路器打开,并开启服务降级
        slidingWindowType: TIME_BASED # 滑动窗口的类型
        slidingWindowSize: 2 #滑动窗口的大小配置,配置TIME_BASED表示2秒
        minimumNumberOfCalls: 2 #断路器计算失败率或慢调用率之前所需的最小样本(每个滑动窗口周期)。
        permittedNumberOfCallsInHalfOpenState: 2 #半开状态允许的最大请求数,默认值为10。
        waitDurationInOpenState: 5s #从OPENHALF_OPEN状态需要等待的时间
        recordExceptions:
          - java.lang.Exception
    instances:
      mail-auth:
        baseConfig: default  
# application.yml
mybatis-plus:
  global-config:
    db-config:
      id-type: auto
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:/mapper/*.mapper.xml

简单介绍一下架构

  1. JDK 17:

    • JDK(Java Development Kit)是用于开发Java应用程序的软件开发工具包。JDK 17 是一个长期支持版本(LTS),它包含了最新的Java语言特性、性能改进和安全更新。
  2. MySQL 8:

    • MySQL 是一个开源的关系型数据库管理系统(RDBMS)。MySQL 8 提供了新的功能,比如窗口函数、公共表表达式、JSON扩展等,并且在性能和安全性上有所提升。
  3. Redis 7:

    • Redis 是一个开源的内存数据结构存储,用作数据库、缓存和消息中间件。Redis 7 增加了对分区的支持,增强了集群管理,以及提供了更好的安全性选项如用户权限管理。
  4. Spring Boot 3:

    • Spring Boot 是一个基于Spring框架的快速开发平台,旨在简化新Spring应用的初始搭建及开发过程。版本3带来了对Jakarta EE 9+的支持,这是由于Java EE向Jakarta EE的迁移导致的包名变化。
  5. Spring Cloud Alibaba 2023.0.1:

    • 这是阿里巴巴提供的微服务解决方案的一部分,集成了诸如Nacos、Sentinel、RocketMQ等阿里云产品,帮助开发者更容易地构建分布式系统。
  6. Nacos:

    • Nacos 致力于帮助开发者发现、配置和服务管理。它是一个易于使用的动态服务发现、配置管理和服务管理平台。
  7. OpenFeign:

    • OpenFeign 是一个声明式的Web Service客户端,让编写HTTP API客户端变得更容易。它与Spring Cloud集成良好,允许使用简单的接口和注解来定义服务之间的通信。
  8. Resilience4j:

    • Resilience4j 是一个轻量级的容错库,专注于熔断器模式(Circuit Breaker)、速率限制(Rate Limiter)、重试(Retry)、限流(Bulkhead)等功能,以提高微服务架构的弹性。
  9. LoadBalance:

    • 负载均衡是网络流量分配给多个后端服务器的过程,以确保没有单个服务器过载。在Spring Cloud环境中,负载均衡可以由Ribbon或Spring Cloud LoadBalancer实现。
  10. Gateway:

    • 在微服务架构中,API网关作为所有客户端请求的单一入口点。Spring Cloud Gateway 提供了一种简单而有效的方式来路由到API端点并提供横切关注点,如身份验证、监控/指标、SSL终止等。

总而言之言而总之,这话又说回来不是没有道理的你说对不对,你说我觉得对你就觉得我说的有道理,既然都出新技术了不用白不用你说对不对。
性能是jdk8 那一套的2倍以上了,资源消耗也是比以前少更多了。

此文章对征战多年的老牛🐎友好,对于新牛🐎 这篇文章不适合您。
此文章的内容是最初搭建的,内容并不是很全面,并且我还对代码进行了删减。
最新版本后续我会在git e e 上面进行开源

;