自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 收藏
  • 关注

转载 DDD 系列(一)Domain Primitive

Domain Primitive前言Domain Primitive案例1(注册)实现方式一接口的清晰度数据验证和错误提示业务代码的清晰度可测试性解决方案接口的清晰度数据验证和错误处理代码清晰度可测试性评估总结案例2(转账)总结前言首先,DDD不是一套结构体系,而是一种代码与业务统一的架构思想,所以很多人对DDD的看法都会有偏差。比如说,领域内贫血模型模型(实体类只有字段)得益于一些ORM的框架崛起,并且传统的三层架构(Business、Data Access、Database)在一定程度上与DDD概念

2021-12-13 22:35:52 493

原创 CPU、内存过高排查

对于互联网公司,线上CPU、内存飙升的问题很常见(比如流量突然飙升)而作为程序员,基本上都是一下作为排查的步骤常规操作执行top命令,查看到底是哪个进程占用的CPU过高 可以看到java进程的PID为11391查看java进程所有线程占用CPU的情况top -Hp < PID >此时的PID为线程的ID线程ID转换16进制,堆栈信息展示的是十六进制的,所以需要把线程id转换成16进制printf %x 11405查看堆栈信息jstack < 进程号 > |

2021-12-10 01:21:03 861

原创 Spring cloud入门-OAuth 2.0(四)授权之基于JWT完成单点登录

授权之基于JWT完成单点登录摘要单点登录简介创建oauth2-client网页单点服务验证服务调用验证摘要Spring Cloud Security 为构建安全的SpringBoot应用提供了一系列解决方案,结合Oauth2可以实现单点登录功能,本文将对其单点登录用法进行详细介绍。单点登录简介单点登录简称SSO,只的是当有多个系统需要登录时,用户只需要登录一个系统就无须登录其他的系统创建oauth2-client这里新建一个oauth2-client作为客服端,使用oauth2-jwt-ser

2021-11-02 23:47:56 1260 1

原创 Spring cloud入门-OAuth 2.0(三)JWT集成

OAuth 2.0之(三)JWT集成JWT简介JWT组成创建oauth2-jwt-server模块使用jwt 存储扩展JWT中存储的内容解析JWT中的内容刷新令牌使用Redis 存储令牌JWT简介JWT是JSON WEB TOKEN的简写,它是基于 RFC 7519 标准定义的一种可以安全传输的的JSON对象,由于使用了数字签名,所以是可信任和安全的。JWT组成JWT组成有三部分HeaderPayloadSignatureHeader 中存在签名的生成算法,比如{ "alg": "

2021-10-23 15:38:54 839

原创 Spring cloud入门-OAuth 2.0(二)

OAuth 2.0的使用创建oauth2-serverUserServiceAuthorizationServerConfigResourceServerConfigSpringSecurityUserController授权模式的使用获取code获取assce_token密码模式的使用创建oauth2-server依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId&

2021-10-17 23:11:32 336

原创 Spring cloud入门-OAuth 2.0(一)

OAuth 2.0RFC 6749四种授权模式授权码(authorization-code)隐藏式(implicit)密码式凭证式(client credentials)OAuth是目前最流行的授权机制,用来授权第三方应用,获取用户数据,凭借token令牌,在第三方应用进行操作。RFC 6749RFC 6749详细介绍了OAuth是什么首先OAuth引入了一个授权层,用来实现OAuth 的核心就是向第三方应用颁发令牌通常来说有以下几种角色Resource owner(资源拥有者) 拥有该角色的最

2021-10-17 14:33:19 517

原创 Spring Cloud入门-Gateway网关

Spring Cloud入门-Gateway网关摘要简介相关概念二级目录三级目录摘要SpringCloud Gateway为SpringBoot 应用提供了API网关支持,有强大的路由和过滤功能简介Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等。SpringCloud Gat

2021-10-16 16:30:07 191

转载 Spring Cloud入门-了解Spring Cloud(一)

了解Spring Cloud什么是Spring CloudSpring Cloud 的发展背景设计初衷优缺点Spring Cloud 系统架构主要项目Spring Cloud ConfigSpring Cloud NetflixSpring Cloud BusSpring Cloud ConsulSpring Cloud SecuritySpring Cloud SleuthSpring Cloud StreamSpring Cloud TaskSpring Cloud ZookeeperSpring Cl

2021-07-25 14:16:14 116

原创 Java8实战之(九)用Optional取代null

用Optional取代null本章内容Optional类入门应用 Optional 的ࠖ几种模式创建Optional对象使用map 从Optional 对象中提取和转换值本章内容null 引用引发的问题,以及为什么要用Null 引用从null 到Optional,以null安全的方式重写你的域模型不要使用if else处理NullPointerException读取Optional中的几种可能的方法作为Java 程序员曾经遭受过NullPointerException,来看看下面例子pac

2021-07-05 23:54:03 1639

原创 MySQL之(四)整理部分原理

MySQL之(四)整理原理Mysql 的基础架构Mysql 的基础架构

2021-06-15 22:28:39 96

原创 MySQL之(三)SQL性能优化

MySQL之(三)SQL性能优化SQL查询慢的原因SQL执行加载顺序7 种JOIN笛卡尔积INNER JOINLEFT JOINRIGHT JOINLEFT JOIN WITHOUT COMMON PARTRIGHT JOIN WITHOUT COMMON PARTFULL JOINFULL JOIN WITHOUT COMMON PART索引SQL查询慢的原因查询语句写的烂索引失效(单值、复合)关联查询太多join(设计缺陷或者不得以的需求)服务器调优以及各个参数设置(缓冲、线程数等)SQ

2021-04-12 21:51:14 163

原创 MySQL之(二)事物原理

数据库事物数据库事物SQL标准定义了四种隔离级别实战演示读未提交Read UnCommitted读提交Read CommittedRepeatable Read 可重复读数据库事物什么是事物?事物是一个不可分割的数据库操作序列,也是数据库并发的基本单位,其执行的结果是使数据库从一种状态变成另外一种一致性状态,是逻辑上的一组操作。要么全部执行,要么全部不执行什么是数据库的四大特性ACID原子性:事物执行的最小单位,不允许分割。事物的原子性确保动作要么全部完成、要么全部不起作用。例如转账,A转账B1

2021-04-05 20:21:49 137

原创 多线程与高并发(八)线程池与源码阅读

取31

2021-03-29 00:27:20 216

原创 多线程与高并发(七)线程池

线程池今天这节课我们通过之前讲个面试题把基础知识复习一遍,然后再一点一点来看两个线程,第一个线程从1到26,第二个线程从A到Z,交替顺序输出

2021-03-10 00:04:48 243

原创 多线程与高并发之(六)并发容器

并发容器并发容器HashTable三级目录并发容器第一类Collection,也叫做集合集合的意思就是说这个容器是什么结构,你都可以把一个元素一个元素的往里面添加。从数据结构的角度来说,这个存储的数据结构也就两种连续存储的数组Array,和非连续存储的一个指向另外一个的链表,但是逻辑结构就很多了。Collection又分成了3大类,分别为Set,List,Queue,Queue队列接口就是为了高并发准备的,Set不会有重复的元素。队列最主要的原因就是实现了任务的状态和获取,叫做阻塞队列,其中有一个

2021-03-04 00:13:31 155 1

原创 多线程与高并发之(五)AQS源码约阅读与强软弱虚4种引用以及ThreadLocal原理与源码

AQS源码约阅读与强软弱虚4种引用以及ThreadLocal原理与源码AQS源码分析二级目录三级目录AQS源码分析AQS核心是什么,就是一个state,这个代表的意思由其子类决定,我们先来讲一下ReentranLock,刚才state为0,当你获得锁之后,它就变成了1,释放的时候变成0,这个state值得基础之上,它的下面还带有一个队列,是AQS自己内部所维护的队列,队列所维护的是一个node节点,node节点是AQS的内部类,最重要的是,它保留了一个Thread一个线程,所以这个队列是线程队列,而且还

2021-02-21 20:22:50 206

原创 多线程与高并发之(四)LockSupport、淘宝面试题与源码阅读方法论

LockSupport、淘宝面试题与源码阅读方法论二级目录三级目录二级目录三级目录

2021-01-31 17:52:53 176

原创 多线程与高并发之(三)Atomic类和线程同步新机制

Atomic类和线程同步新机制ReentrantLock三级目录这章我们来继续将Amotic的问题,然后将除了synchronized之外的锁。事实上,无锁化操作比synchronized效率更高。下面写个程序分别说明synchronize 和longAdder,Amoticpackage com.learn.thread.three;import java.util.concurrent.atomic.AtomicLong;import java.util.concurrent.atomic.

2021-01-03 18:34:24 297

原创 Java8实战之(五)用流收集数据

5.1 收集器简介5.1.1 收集器用作高级规约5.1.2 预定义收集器5.2 归约与汇总5.2.1 查找流中的最大值和最小值5.2.2 汇总5.2.3 连接字符串5.2.4 广义的归约汇总5.3 分组5.3.1 多级分组5.3.2 按子组收集数据5.4 分组5.4.1 分区的优势5.4.2 将数字按质数和非质数分区5.5 收集器接口5.5.1 理解Collecto...

2020-12-10 22:27:36 165

原创 多线程与高并发之(二)volatile与CAS

volatitle与CASvolatitle保证线程的可见性禁止指令重新排序(volatile的第一层含义)单例模式(volatile的第二层含义)volatitlevolatile关键字,使一个变量在多个线程可见A,B线程公用一个变量,java默认A是线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道使用volatile关键字,将会强制所有的线程去堆内存中读取变量的值,会让所有线程都会读到变量的修改值。但是volatile并不能保证多线程操作变量最终的一致性,它不能替代sync

2020-12-08 00:07:03 198

原创 多线程与高并发之(一)线程的基本概念

线程的基本概念基本概念创建线程的几种方式认识几个线程的方法sleepYieldJoin线程状态基本概念什么叫进程?什么叫进程?进程: 假设你的硬盘上有一个“英雄联盟”的程序,这就是一个程序,是一种静态的概念,当你打开它,弹出一个界面输入账号密码,这个时候就叫做一个进程,进程相对程序来说是一种动态的概念。线程: 作为一个进程里面最小的执行单元就叫做一个线程,简单的说就是一个程序里不同的执行路径叫做线程。package com.learn.thread.first;import java.util

2020-12-06 17:55:25 143 1

原创 MySQL之(一)索引及其原理

MySQL之(一)索引及其原理索引的本质索引的数据结构二级目录三级目录索引的本质索引是帮助Mysql高效获取数据的排好序的数据结构,其作用是相当于书本的目录,为了快速查找内容。索引的数据结构二叉树(当节点索引元素是连续的,会退化成链表,不会减少查找次数,索引失效,不适合做数据结构)红黑树 (层级太多,由于树的广度不高,高度很高,所以同时查询的次数较多,不适合做索引)Hash索引()B-Tree()B+Tree(非叶子节点不存储data,只存储索引,因此可以存更多的索引。)二级目录

2020-11-22 21:15:36 113 1

原创 Java8实战之(八)CompletableFuture: 组合式异步编程

CompletableFuture: 组合式异步编程本章内容Future接口future 接口的局限性使用CompletableFuture构建异步应用实现异步API异常处理ֵ使用工厂方法supplyAsync创建CompletableFuture让你的代码免受阻塞之苦ֵ用 CompletableFuture 发起异步请求寻找更好的解决方案使用定制的执行器对多个异步任务进行流水线操作实现折扣服务本章内容创建异步计算、并获取最终的结果使用非阻塞操作提升吞吐量设计和实现异步API如何以异步的方式使用

2020-11-15 23:35:48 413

原创 综合中间件Redisson典型应用场景之高性能点赞

综合中间件Redisson典型应用场景之高性能点赞整体业务流程分析业务流程介绍和分析业务模块划分和数据库设计点赞\取消点赞\排行榜\模块实战整体业务流程分析对于互联网应用而言,对于一些热点新闻、文章或者博客,每次的出现都会有大量的用户进行点赞评论,对于后端程序员来说,这是一种高并发的用户请求。本节将以“点赞”为案例进行分析,对于之前掌握的redisson进行实战。业务流程介绍和分析点赞 当用户点赞博客时,系统首先会去查询用户是否已经点赞过,如果有,直接返回成功,如果没有就会在数据库中插入一条状态为1

2020-10-26 00:06:52 1053 2

原创 综合中间件Redisson(三)分布式锁实战

综合中间件Redisson(三)分布式锁实战重温分布式锁分布式锁之一次性锁分布式锁之可重入锁三级目录重温分布式锁前面的文章说过,分布式锁的出现是为了解决跨JVM,多台服务器共享一个资源的问题,避免并发出现数据不安全,数据不一致的问题。本章我们讲述的分布式锁是使用Redisson实现的,其提供了分布式锁的功能组件,可以用来弥补基于 Redis的原子性操作的缺陷,下面分析基于Redis实现分布式锁的不足之处。比如,如果redis负责存储分布式锁的节点发生了宕机的情况 ,但是该锁又是处于被锁住的状态,这种

2020-10-08 22:45:50 346 2

原创 综合中间件Redisson(二)常见功能组件实战(后续队列)

Redisson(二)常见功能组件实战(后续队列)队列Queue实战生产者发送消息进队列消费者消费消息死信队列队列Queue实战基于Redis的分布式队列可以分为双端队列 ,阻塞队列(Blocking Queue),有界阻塞队列(Bounded Blocking Queue),阻塞双端队列(Blocking Deque),阻塞公平队列(Blocking Fair Queue),阻塞公平双端队列(Blocking Fair Deque)不管是什么队列,其底层核心的执行逻辑仍旧是基于发布-订阅的主题来实现

2020-10-05 22:11:28 841

原创 综合中间件Redisson(二)常见功能组件实战

Redisson常见功能组件实战布隆过滤器二级目录三级目录前面已经Springboot整合了Redisson的项目,下面将以布隆过滤器,发布-订阅主题,特有的延迟队列布隆过滤器前面已经说过了,布隆过滤器的底层算法主要有两大部分第一部分精心设计并构造K个哈希函数,以及构造长度为N的位数组,设置初始值为0第二部分判断一个元素是否在集合中,同样把这个元素经过K个哈希函数,得出K个哈希值,判断对应的下标是否都为1,如果是,则元素大概率是存在的,如果不是,就一定不在集合中。好在Redisson提供了

2020-10-04 10:57:25 1192

原创 综合中间件Redisson(一)概述

综合中间件Redisson概述简介与作用功能特性典型应用场景之布隆过滤器与主题典型应用场景之介绍延迟队列与分布式锁Springboot整合RedissonRedisson是架设在Redis基础上实现Java驻内存数据网格的综合中间件。之所以被称为“综合中间件”,是因为Redisson所提供的功能特性以及实际项目中所起的作用远远多于原生的redis。作为一款诸多高性能特性的中间件,其设计初衷是促进实施者对Redis的关注进行分离,让实施者更多的精力在业务过程中开发。本章将整合核心配置文件以及自定义注入B

2020-09-17 00:20:39 462

原创 分布式锁实战(五)典型应用场景之书籍抢购

书籍抢购整体业务流程分析数据库设计在实际的生产环境中,也确实可以看到分布式锁的身影,本节将以实际项目中典型业务场景“书籍抢购模块”为案例,巩固之前的知识整体业务流程分析上图中,不难发现,核心流程有三个1.判读用户是否抢购过该商品2.商品库存是否充足3.更新书籍的库存并插入用户的抢购记录中因此,又可以分成以下两大块数据库设计CREATE TABLE `book_stock` ( `id` int(11) NOT NULL, `book_no` int(11) DEFAULT NU

2020-09-14 14:11:57 167

原创 分布式锁实战(四)基于ZooKeeper实现分布式锁

基于ZooKeeper实现分布式锁Zookeeper的简洁与作用Zookeeper分布式锁的实现流程和原理Springboot整合Zookeeper本章基于ZooKeeper的临时节点和Watcher机制实现分布式锁,包括其实现流程与底层的执行原理,并以前文所用的的用户重复提交注册信息 为案例,配以实际的代码进行实战Zookeeper的简洁与作用Zookeeper是雅虎设计的用于开发一个通用的,无单点问题的分布式协调框架,采用统一的协调管理方式更好管理各个子系统,从而让开发者将更多的精力集中在业务管理

2020-09-12 22:53:11 147

原创 分布式锁实战(三)基于Redis的分布式锁

基于Redis的分布式锁Redis复习分布式锁的实现流程和原理基于Redis实战实现分布式锁数据库设计除了之前我们数据层面的锁,业界上还包括基于Redis的原子操作实现分布式锁。以及Zoopkeeper的临时节点,和Watcher机制实现分布式锁。本章将讲述Redis的原子性操作实现分布式锁Redis复习在之前抢红包的模块中,其实setnx就是原子性操作,并且它是以key-value存储的数据结构,具有丰富的数据类型,并且应用场景非常适合高并发分布式锁的实现流程和原理上述得出结论3个核心1

2020-09-12 00:08:11 184

原创 分布式锁实战(二)基于数据库实现分布式锁

基于数据库实现分布式锁乐观锁乐观锁实战数据库设计悲观锁实战乐观锁乐观锁是一种佛系(乐观的)锁,在操作数据的时候永远数据不会被其他线程共享,但是在数据持久化的时候,检查数据是否正常通常采用一个版本号version的机制实现1.取出数据的时候,顺便取出版本号version2.数据持久化的时候,将version作为存储条件,更新成功后version+13.而其他线程如果获取同样的数据进行操作,在持久化的时候由于version已经不是之前获取的那个值了,所以更新失败。sql语法如下update ta

2020-09-11 15:00:18 308

原创 springboot 整合多数据源手动切换

配置文件如下server.port = 11000#热部署spring.devtools.restart.enabled=truespring.aop.auto=true# DB Configuration#指定数据1库驱动spring.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver#数据库1jdbc连接url地址,serverTimezone设置数据库时区东八区spring.datasource.db1.jdbc-u

2020-09-09 22:31:31 709

原创 分布式锁实战(一)概述

分布式锁实战分布式锁的概念锁机制分布式锁登场基于数据库级别的乐观锁基于数据库级别的悲观锁基于Redis的原子操作基于Zookeeper的互斥排它锁如今的企业级互联网大都存在“集群”,将一个子系统多实例化,经过负载均衡分摊用户的请求,这种集群式的部署,给企业级应用带来性能和效率上的提升,但是也带来了不少问题,如高并发场景下多个线程同时访问、操作共享资源的时候,出现了数据不一致的现象,比如商品入库,出现了超卖,针对这种情况,业界普遍采用的是分布式锁加以解决本章开始将将探索分布式锁的相关要点。分布式锁的概念

2020-09-08 17:41:03 138

原创 如何处理将不必要的字段给前端

在写SQL映射的时候,我们总是会查出一些字段做操作,然后返回给前端是它的映射实体对象,但是前端会看到那些不想要的字段,这时候可以采用以下三种方法第一种优化SQL,不要查没必要的字段,但是一般都需要查,所以这种方法是最傻的第二种实体类加上@JsonInclude(JsonInclude.Include.NON_NULL)(这种比较实用)第三种采用全局配置在application.yml或者properties中设置propertiesspring.jackson.default-prope

2020-09-06 14:36:43 963

原创 RabbitMQ实战之(六)死信队列实战

死信队列死信队列概述死信队列间接和作用典型的应用场景介绍代码实战死信队列专有名词介绍死信队列消息模型队列和交换机初始化死信队列的接收和发送死信队列概述延迟、延迟指定业务的逻辑,在实际生活中比较常见,比如超时未处理订单关闭,本章以商城平台订单为支付超时,掌握如何在死信队列模型的消息延迟发送。在之前的消息模型中,都有一个共同的特点,就是消息一到队列,就立马被消费者消费了,所以死信队列的初衷就是为了解决这个问题,希望能延迟一定的时间给消费者处理。死信队列间接和作用传统的业务处理是使用定时器轮训的方式处理

2020-09-05 23:50:27 407

原创 RabbitMQ实战之(五)用户操作成功写日志

本章以用户登录成功写日志,总结前述知识点,这里采用以下AOP切面编程用户登录成功写日志整体业务流程分析数据库设计交换机队列声明整体业务流程分析主要分为两大模块,“用户登录模块”,“日志模块”,两大模块相互独立,互不干扰,日志模块应当异步于登录模块执行数据库设计CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id', user_name varchar(255) NOT NULL COMMENT '用户名',

2020-09-05 21:50:32 469

原创 Rabbit实战之(四)消息确认消费机制

消息确认消费机制消息高可用和确认消费常见消息确认模式介绍基于自动模式消费确认基于手动模式确认消息高可用和确认消费RabbitMQ在实际使用过程中,如果配置或使用不当,则会出现令人头疼的问题,下面列举三个不知道发送的消息是否成功,生产者将消息发送出去,但是如果消息模型不存在,队列不存在,就是发送失败的,这一点作为生产者要知道解决方案RabbitMQ会要求生产者在发送完信息后,进行发送确认,当成功就代表消息成功的发送出去,在配置文件中 @Bean public RabbitTempla

2020-09-05 00:09:45 709

原创 RabbitMQ之(三)多种消息模型实战

多种消息模型基于FanoutExchange的消息模型实战基于DirectExchange的消息模型实战基于TopicExchange的消息模型实战在RabbitMQ的核心组件交换机中有4种典型的消息模式,即HeadersExchange,FanoutExchange,DirectExchange ,TopicExchange的四种模式,生产环境中,常用后面三种。本节将讲述下面几种基于FanoutExchange的消息模型实战FanoutExchange具有广播的作用,当消息进入这个中转站的时候,

2020-09-04 20:27:25 267

原创 RabbitMq实战之(二)springboot整合RabbitMQ

RabbitMQ相关组件SpringBoot整合RabbitMQ自定义配置Bean相关组件RabbitMQ发送消息和接收消息其他发送和接收消息方式实战相关组件生产者:用于发送消息消费者:用于监听、接收、消费和处理消息消息:可以看做是实际数据,在底层架构中是通过二进制的数据进行保存的队列:指的是消息的暂存区和存储区,可以看做是一个中转站,消息经过这个中转站,便到了消费者手中。交换机:同样也是消息的中转站,用于首次接收和分发消息,其中包括Fanout,Direct和Topic,Headers路由:

2020-09-04 15:38:34 169

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除