Summarize the knowledge points used in daily development of springboot3.X
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
- 项目分层
- 不同参数请求 post get
- 统一返回结构体封装
- 项目分层、统一接口封装、参数校验、异常处理-
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 可以防止将devtools依赖传递到其他模块中 -->
</dependency>
- todo
- todo
- docker 初始化mysql 命令
docker run -itd --name springboot3_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
- 创建数据库 + 创建表执行脚本
create database springboot3_test;
- docker 初始化postgres 命令
docker run --name springboot3_postgres -p 5432:5432 -e POSTGRES_PASSWORD=123456 postgres
- 创建数据库 + 创建表 执行脚本
create database springboot3_test;
- mybatis + xml + 自动生成代码 + 分页插件(done)
- MyBatis Generator 配置详情参考
- 生成代码命令
mvn mybatis-generator:generate -X -e
- 创建数据库+ 表+ 添加表数据
create database springboot3_test2
create table Book(
id int auto_increment primary key,
author varchar(64) not null comment '作者信息',
name varchar(64) not null comment '书籍名称',
price decimal not null comment '价格',
createTime datetime null comment '上架时间',
description varchar(128) null comment '书籍描述'
);
INSERT INTO Book (id, author, name, price, createTime, description) VALUES (1, '金庸', '笑傲江湖', 13, '2020-12-19 15:26:51', '武侠小说');
INSERT INTO Book (id, author, name, price, createTime, description) VALUES (2, '罗贯中', '三国演义', 14, '2020-12-19 15:28:36', '历史小说');
- 配置 各个数据库数据源 master + slave datasource
- 安装插件 需要配置数据库 后可以执行mvn 命令
- mvn flyway:baseline 执行后 生成 fly_schema_history 数据库表
- mvn flyway:clean 删除表
- mvn flyway:migrate 执行命令
- docker 安装 redis
docker run -itd --name redis-test -p 6379:6379 redis
-
redis 四种序列化方式
-
JDK 序列化方式 (默认)
-
String 序列化方式 (较长使用)
-
JSON 序列化方式 (占用空间太大)
-
XML 序列化方式 (很少使用)
-
Spring Boot 集成 Redis 时,默认使用 JdkSerializationRedisSerializer 进行对象序列化和反序列化。但是, 这种序列化方式有一些问题,例如效率低下,占用内存高等。因此,通常情况下建议使用其他序列化方式。
-
Spring Boot 提供了多种序列化方式,例如 JSON、Jackson、FastJson、Protobuf、Kryo 等。其中, 使用 JSON 序列化的方式是比较常见的选择,因为 JSON 格式的数据在传输和存储上都比较便捷。
-
lettuce和jedis区别 jedis连接Redis服务器是直连模式,当多线程连接下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个连接专用(会严重影响性能)
lettuce 基于netty框架进行与Redis服务器连接,底层设计中采用 StatefulRedisConnection,StatefulRedisConnection自身是线程安全的, 可以保障并发访问安全问题,一个连接可以被多路复用。同时lettuce也支持多连接一起工作。 lettuce 是redis的默认客户端技术
-
添加注解方式 + 分布式锁
- @RedisLock public void xxxMethod() { } -TODO
-
-
搭建 redis哨兵 (使用docker-compose、多个docker自己配置)
-
搭建 redis集群 (使用docker-compose、多个docker自己配置)
-
分别集成 springboot集成
-
redis 各种常用使用 排序、缓存、分布式锁、全局id、用户关注、限流 、计数器、全局session 的使用
-
docker 搭建 portainer (管理 docker 容器) docker run -d -p 9000:9000
--restart=always
-v /var/run/docker.sock:/var/run/docker.sock
--name prtainer-test
docker.io/portainer/portainer
- done
- docker 安装MongoDB
$ docker run -itd --name mongo -p 27017:27017 mongo --auth
-p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。
--auth:需要密码才能访问容器服务。
$ docker exec -it mongo mongo admin
# 创建一个名为 admin,密码为 123456 的用户。
> db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
> db.auth('admin', '123456')
- todo
- todo
- todo
- 上传使用minio 组件,首先docker 安装,步骤如下
- 查询 minio 镜像
- docker search minio
- 下载miniO
- docker pull monio/monio
- 创建挂载文件
- mkdir -p /Users/chenyongke/Downloads/home/minio/config # 配置文件
- mkdir -p /Users/chenyongke/Downloads/home/minio/data # 数据文件
- 启动miniO 容器
docker run --name minio -p 9000:9000 -p 9001:9001 -d --restart=always -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin12345" -v /Users/chenyongke/Downloads/home/minio/data:/data -v /Users/chenyongke/Downloads/home/minio/config:/root/.minio minio/minio server /data --console-address '0.0.0.0:9001'
(
其中
9000:9000
表示将容器内的 MinIO 服务端口映射到本地的 9000 端口-e
参数指定 MinIO 登录凭证(ACCESS_KEY 和 SECRET_KEY);-v
参数指定数据持久化的目录 )
- POI 已经处理
- todo
- docker安装cas 服务器 (待优化)
- 拉取镜像
- docker pull apereo/cas
- 启动容器
- docker run --name cas -p 8443:8443 -p 8442:8080 apereo/cas /bin/sh /cas-overlay/bin/run-cas.sh
- 报错 需要配置证书
- keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 密钥库指令是: changeit
- 拷贝证书: docker cp debug.keystore cas:/etc/cas/thekeystore
- 重新启动容器: docker restart cas
- 查看 密钥库文件格式是否正确
- keytool -list -keystore debug.keystore
- 比较日志不同 log4j log4j2 logback
- 介绍配置日志需要考虑的事项
- 日志路径,日志级别level (debug、info、error)
- 日志配置
- 日志大小、日志保存天数
- 定义日志输出信息
- 根据不同环境设置不同日志级别(dev、test、uat、product)
- spring-logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 日志根目录--> <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/data/logs/springboot-logback-demo"/> <!-- 日志级别 --> <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/> <!-- 标识这个"STDOUT" 将会添加到这个logger --> <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/> <!-- 日志文件名称--> <property name="LOG_PREFIX" value="spring-boot-logback" /> <!-- 日志文件编码--> <property name="LOG_CHARSET" value="UTF-8" /> <!-- 日志文件路径+日期--> <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" /> <!--对日志进行格式化--> <property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/> <!--文件大小,默认10MB--> <property name="MAX_FILE_SIZE" value="50MB" /> <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志--> <property name="MAX_HISTORY" value="10"/> <!--输出到控制台--> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- 输出的日志内容格式化--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_MSG}</pattern> </layout> </appender> <!--输出到文件--> <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender"> </appender> <!-- 定义 ALL 日志的输出方式:--> <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日志文件路径,日志文件名称--> <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File> <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件路径,新的 ALL 日志文件名称,“ i ” 是个变量 --> <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern> <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志--> <MaxHistory>${MAX_HISTORY}</MaxHistory> <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB--> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>${MAX_FILE_SIZE}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 输出的日志内容格式化--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_MSG}</pattern> </layout> </appender> <!-- 定义 ERROR 日志的输出方式:--> <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 下面为配置只输出error级别的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <OnMismatch>DENY</OnMismatch> <OnMatch>ACCEPT</OnMatch> </filter> <!--日志文件路径,日志文件名称--> <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File> <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件路径,新的 ERR 日志文件名称,“ i ” 是个变量 --> <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern> <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志--> <MaxHistory>${MAX_HISTORY}</MaxHistory> <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB--> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>${MAX_FILE_SIZE}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 输出的日志内容格式化--> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>${LOG_MSG}</Pattern> </layout> </appender> <!-- additivity 设为false,则logger内容不附加至root ,配置以配置包下的所有类的日志的打印,级别是 ERROR--> <logger name="org.springframework" level="ERROR" /> <logger name="org.apache.commons" level="ERROR" /> <logger name="org.apache.zookeeper" level="ERROR" /> <logger name="com.alibaba.dubbo.monitor" level="ERROR"/> <logger name="com.alibaba.dubbo.remoting" level="ERROR" /> <!-- ${LOG_ROOT_LEVEL} 日志级别 --> <root level="${LOG_ROOT_LEVEL}"> <!-- 标识这个"${STDOUT}"将会添加到这个logger --> <appender-ref ref="${STDOUT}"/> <!-- FILE_ALL 日志输出添加到 logger --> <appender-ref ref="FILE_ALL"/> <!-- FILE_ERROR 日志输出添加到 logger --> <appender-ref ref="FILE_ERROR"/> </root> </configuration>
- Profile 相关的配置可以参考:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <!-- roll by day --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/springboot-logback-demo.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <!-- dev --> <logger name="org.springframework.web" level="INFO"/> <root level="INFO"> <appender-ref ref="FILE" /> </root> <!-- test or production --> <springProfile name="test,prod"> <logger name="org.springframework.web" level="INFO"/> <logger name="com.pdai.springboot" level="INFO"/> <root level="INFO"> <appender-ref ref="FILE" /> </root> </springProfile> </configuration>
- 介绍配置日志需要考虑的事项