概要
本篇文章基于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 #从OPEN到HALF_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
简单介绍一下架构
-
JDK 17:
- JDK(Java Development Kit)是用于开发Java应用程序的软件开发工具包。JDK 17 是一个长期支持版本(LTS),它包含了最新的Java语言特性、性能改进和安全更新。
-
MySQL 8:
- MySQL 是一个开源的关系型数据库管理系统(RDBMS)。MySQL 8 提供了新的功能,比如窗口函数、公共表表达式、JSON扩展等,并且在性能和安全性上有所提升。
-
Redis 7:
- Redis 是一个开源的内存数据结构存储,用作数据库、缓存和消息中间件。Redis 7 增加了对分区的支持,增强了集群管理,以及提供了更好的安全性选项如用户权限管理。
-
Spring Boot 3:
- Spring Boot 是一个基于Spring框架的快速开发平台,旨在简化新Spring应用的初始搭建及开发过程。版本3带来了对Jakarta EE 9+的支持,这是由于Java EE向Jakarta EE的迁移导致的包名变化。
-
Spring Cloud Alibaba 2023.0.1:
- 这是阿里巴巴提供的微服务解决方案的一部分,集成了诸如Nacos、Sentinel、RocketMQ等阿里云产品,帮助开发者更容易地构建分布式系统。
-
Nacos:
- Nacos 致力于帮助开发者发现、配置和服务管理。它是一个易于使用的动态服务发现、配置管理和服务管理平台。
-
OpenFeign:
- OpenFeign 是一个声明式的Web Service客户端,让编写HTTP API客户端变得更容易。它与Spring Cloud集成良好,允许使用简单的接口和注解来定义服务之间的通信。
-
Resilience4j:
- Resilience4j 是一个轻量级的容错库,专注于熔断器模式(Circuit Breaker)、速率限制(Rate Limiter)、重试(Retry)、限流(Bulkhead)等功能,以提高微服务架构的弹性。
-
LoadBalance:
- 负载均衡是网络流量分配给多个后端服务器的过程,以确保没有单个服务器过载。在Spring Cloud环境中,负载均衡可以由Ribbon或Spring Cloud LoadBalancer实现。
-
Gateway:
- 在微服务架构中,API网关作为所有客户端请求的单一入口点。Spring Cloud Gateway 提供了一种简单而有效的方式来路由到API端点并提供横切关注点,如身份验证、监控/指标、SSL终止等。
总而言之言而总之,这话又说回来不是没有道理的你说对不对,你说我觉得对你就觉得我说的有道理,既然都出新技术了不用白不用你说对不对。
性能是jdk8 那一套的2倍以上了,资源消耗也是比以前少更多了。
此文章对征战多年的老牛🐎友好,对于新牛🐎 这篇文章不适合您。
此文章的内容是最初搭建的,内容并不是很全面,并且我还对代码进行了删减。
最新版本后续我会在git e e 上面进行开源