Spring Boot WebFlux Quick Start
Spring Boot 2.0spring.io 官网有句醒目的话是:
1BUILD ANYTHING WITH SPRING BOOT
Spring Boot (Boot 顾名思义,是引导的意思)框架是用于简化 Spring 应用从搭建到开发的过程。应用开箱即用,只要通过一个指令,包括命令行 java-jar 、 SpringApplication 应用启动类 、 Spring Boot Maven 插件等,就可以启动应用了。另外,Spring Boot 强调只需要很少的配置文件,所以在开发生产级 Spring 应用中,让开发变得更加高效和简易。目前,Spring Boot 版本是 2.x 版本。Spring Boot 包括 WebFlux。
Spring Boot 2.0 WebFlux了解 WebFlux ,首先了解下什么是 Reactive Streams。Reactive Streams 是 JVM 中面向流的库标准和规范:
处理可能无限数量的元素
按顺序处理
组件之间异步传递
强制性非阻塞背压(Backpressure)
Backpressure(背压)
背压是一种 ...
使用 LocalDateTime 而不是 Date
在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗
通过阅读本篇文章你将了解到:
为什么需要LocalDate、LocalTime、LocalDateTime【java8新提供的类】
java8新的时间API的使用方式,包括创建、格式化、解析、计算、修改
为什么需要LocalDate、LocalTime、LocalDateTime
Date如果不格式化,打印出的日期可读性差
1Tue Sep 10 09:34:04 CST 2019
使用SimpleDateFormat对时间进行格式化,但SimpleDateFormat是线程不安全的SimpleDateFormat的format方法最终调用代码:
1234567891011121314151617181920212223242526272829303132private StringBuffer format(Date date, StringBuffer toAppendTo, Field ...
SpringBoot+MDC实现全链路调用日志跟踪
MDC介绍简介:MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据
API说明:
clear() => 移除所有MDC
get (String key) => 获取当前线程MDC中指定key的值
getContext() => 获取当前线程MDC的MDC
put(String key, Object o) => 往当前线程的MDC中存入指定的键值对
remove(String key) => 删除当前线程MDC中指定的键值对
优点:
代码简洁,日志风格统一,不需要在log打印中手动拼写traceId,即 ...
Springboot启动扩展点超详细总结
1.背景Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Springboot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们只要引用了一个依赖,几乎是零配置就能完成一个功能的装配。
我非常喜欢这种自动装配的机制,所以在自己开发中间件和公共依赖工具的时候也会用到这个特性。让使用者以最小的代价接入。想要把自动装配玩的转,就必须要了解spring对于bean的构造生命周期以及各个扩展接口。当然了解了bean的各个生命周期也能促进我们加深对spring的理解。业务代码也能合理利用这些扩展点写出更加漂亮的代码。
在网上搜索spring扩展点,发现很少有博文说的很全的,只有一些常用的扩展点的说明。
所以在这篇文章里,我总结了几乎Spring & Springboot所有的扩展接口,以及各个扩展点的使用场景。并且整理出了一个bean在spring内部从被加载到最后初始化完成所有可扩展点的顺序调用图。从而我们也能窥探到bean是如何一步步加载到spring容器中的。
2.可扩展的接口启动调用顺序图以下 ...
高并发之降级和熔断
为什么会有这个话题
服务之间的依赖关系导致
当用户请求 A、P、H、I 四个服务获取数据时,在正常流量下系统稳定运行,如果某天系统进来大量流量,其中服务 I 出现 CPU、内存占用过高等问题,结果导致服务 I 出现延迟、响应过慢,随着请求的持续增加,服务 I 承受不住压力导致内部错误或资源耗尽,一直不响应,此时更糟糕的是其他服务对 I 有依赖,那么这些依赖 I 的服务一直等待 I 的响应,也会出现请求堆积、资源占用,慢慢扩散到所有微服务,引发雪崩效应。
¶ 基本的容错模式
主动超时:Http请求主动设置一个超时时间,超时就直接返回,不会造成服务堆积
限流:限制最大并发数
熔断:当错误数超过阈值时快速失败,不调用后端服务,同时隔一定时间放几个请求去重试后端服务是否能正常调用,如果成功则关闭熔断状态,失败则继续快速失败,直接返回。(此处有个重试,重试就是弹性恢复的能力)
隔离:把每个依赖或调用的服务都隔离开来,防止级联失败引起整体服务不可用
降级:服务失败或异常后,返回指定的默认信息
¶ 服务降级由于爆炸性的流量冲击,对一些服务进行有策略的放弃,以此缓解系统压力,保证目前主要业务的 ...
SpringBoot 多种读取配置文件中参数的方式
. 一、简介
. 1、SpringBoot 中常用读取配置方法
. 2、@Value 和 @ConfigurationProperties 的区别
. 二、使用 @Value 读取配置
. 1、@Value 读取配置参数
. 2、@Value 给参数设定值
. 3、@Value 读取系统属性
. 4、@Value 读取 Bean 的属性
. 5、@Value 使用 SpEL 表达式
. 6、@Value 读取 Resource 资源文件
. 三、使用 @ConfigurationProperties 读取配置
. 1、@ConfigurationProperties 读取配置参数到 String 类型
. 2、@ConfigurationProperties 读取 List 类型参数
. 3、@ConfigurationProperties 读取 Map 类型参数
. 4、@ConfigurationProperties 读取 Time 类型参数
. 5、@ConfigurationProperties 读取 DataSize 类型参数
. 6、@ConfigurationProper ...
Redis优化
Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头雾水。
很多时候,Redis出现访问延迟变大,都与我们的使用不当或运维不合理导致的。
这篇文章我们就来分析一下Redis在使用过程中,经常会遇到的延迟问题以及如何定位和分析。
使用复杂度高的命令如果在使用Redis时,发现访问延迟突然增大,如何进行排查?
首先,第一步,建议你去查看一下Redis的慢日志。Redis提供了慢日志命令的统计功能,我们通过以下设置,就可以查看有哪些命令在执行时延迟比较大。
首先设置Redis的慢日志阈值,只有超过阈值的命令才会被记录,这里的单位是微秒,例如设置慢日志的阈值为5毫秒,同时设置只保留最近1000条慢日志记录:
1# 命令执行超过5毫秒记录慢日志CONFIG SET slowlog-log-slower-than 5000# 只保留最近1000条慢日志CONFIG SET slowlog-max-len 1000
设置完成之后,所有执行的命令如果 ...
SpringBoot Actuator监控应用
Actuator是什么?
官网:Spring Boot Actuator: Production-ready Features
先从官网摘几句文绉绉的解释:
SpringBoot可以帮助你再将应用程序推向生产环境时对其进行监视和管理。
你可以选择使用http断点或JMX来管理和监视应用程序。
审计【auditing】、健康【health】和指标收集【metrics gathering】可以自动应用到你的应用程序中。
总结一下就是:Actuator就是用来监控你的应用程序的。
快速开始引入依赖12345678910<!--Actuator--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency><!--Spring MVC 自动化配置--><dependency> & ...
mysql缓存池
1、为什么要有缓存池?Mysql 的 innodb 存储引擎是基于磁盘存储的,并且是按照页的方式进行管理的。
在数据库系统中,CPU 速度与磁盘速度之间的差距是非常大的,为了最大可能的弥补之间的差距,提出了缓存池的概念。
所以缓存池,简单来说就是一块「内存区域」,通过内存的速度来弥补磁盘速度较慢,导致对数据库造成性能的影响。
2、缓存池的基本原理
无论是读操作还是写操纵,都是对缓存池进行操作,而不是直接对磁盘进行操纵。
2.1、关于checkpoint机制思考一下这个场景:如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要将缓冲池中页的新版本刷新回磁盘。因为当发生宕机时,完全可以通过重做日志来恢复整个数据库系统中的数据到宕机发生的时刻。
但是这需要两个前提条件:1、缓冲池可以缓存数据库中所有的数据;2、重做日志可以无限增大
因此Checkpoint(检查点)技术就诞生了,目的是解决以下几个问题:1、缩短数据库的恢复时间;2、缓冲池不够用时,将脏页刷新到磁盘;3、重做日志不可用时,刷新脏页。
当数据库发生宕机时,数据库不需要重做所有的日志,因为Checkpoint之前的页都已 ...
SQL语句大全
一、基础
1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server— 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:\mssql7backup\MyNwind_1.dat’— 开始 备份BACKUP DATABASE pubs TO testBack4、说明:创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:A:create table tab_new like tab_old (使用旧表创建新表)B:create table tab_new as select col1,col2… from tab_old definition only5、说明:删除新表drop table tabname6、说明:增加一个列Alter table t ...