Redis
Redis一、缓存1、什么是缓存缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码(例如:
12345例1:Static final ConcurrentHashMap<K,V> map = new ConcurrentHashMap<>(); 本地用于高并发例2:static final Cache<K,V> USER_CACHE = CacheBuilder.newBuilder().build(); 用于redis等缓存例3:Static final Map<K,V> map = new HashMap(); 本地缓存
由于其被Static修饰,所以随着类的加载而被加载到内存之中,作为本地缓存,由于其又被final修饰,所以其引用(例3:map)和对象(例3:new HashMap())之间的关系是固定的,不能改变,因此不用担心赋值(=)导致缓存失效;
2、为什么用缓存一句话:因为速度快,好用
缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓 ...
Dubbo
Dubbo一、架构演进单体架构演进为微服务架构
1、单体架构为了提高系统的吞吐量,单体架构中的垂直升级和水平拓展,存在几个问题
提高的性能是有限的
成本过高,没办法针对某一个具体的模块做性能的提升,所有的模块都是在一起的
更新和维护的成本非常高,对于系统中要修改或增加的功能,整个发布的流程非常麻烦。
某一个模块出现了Bug,会影响整个系统
2、垂直应用架构根据业务的边界,对单体应用进行垂直拆分,将一个系统拆分成多个服务,比如一个管理系统,可以拆分为权限系统、业务系统、数据系统等。
垂直应用存在的问题:
每个独立部署的服务之间,公共的部分需要部署多分。那么对公共部分的修改、部署、更新都需要重复的操作,带来比较大的成本
为了解决这个问题,演进出分布式应用架构。
3、分布式应用架构在这个阶段里,将服务内部共用的模块抽取出来,部署成一个独立的服务,那么需要解决服务之间的高效通信问题。
但是分布式应用架构 阶段会存在新的问题:
服务越来越多,服务如何被发现
服务越来越多,服务如何被治理
服务之间如何实现高效通信
4、微服务架构微服务架构主要解决的几个问题:
服务的注册与发现:这么多服务 ...
nacos注册中心原理
一、nacos注册中心原理注册流程
整个注册中心的注册和发现流程主要有三个方面来完成:服务的提供方(简称server)、服务的消费者(client)、注册中心(nacos)。
server和nacos的交互过程:
server需要通过nacos官方的OpenAPi提供的接口来发起服务注册请求,随后server会定时向nacos发送心跳来进行心跳检测,对于使用者来说这一步可以采用ScheduleExecutorService创建定时任务来完成。nacos会异步的处理注册请求和心跳任务。
nacos心跳机制
nacos和client之间采用推拉结合的交互模式,一方面client可以通过定时任务每隔10s向nacos发起查询请求,如果服务列表改变nacos就返回新列表,另一方面当本地服务实例发生变化时(即server实例注册成功或心跳停止中断链接),nacos会主动通过UDP协议推送到client,udp协议非常快,不需要保持长链接。而注册中心的场景中client数量往往多于server,如果每一次服务更新,nacos要和成千上万的服务消费者去建立Tcp请求的话性能肯定是不行的。而如果UD ...
zookeeper
一、Zookeeper1、什么是ZookeeperZookeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程,Zookeeper通过其简单的架构和API解决了这个问题。Zookeeper能让开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。
2、Zookeeper的应用场景
在分布式系统中,需要有zookeeper作为分布式协调组件,协调分布系统中的状态
分布式锁
zk在实现分布式锁上,可以做到强一致性,关于分布式锁,在ZAB协议中介绍
无状态化的实现
二、搭建Zookeeper服务器1、zoo.conf配置文件说明1234567891011121314151617# zookeeper时间配置中的基本单位 (毫秒)tickTime=2000# 允许follower初始化连接到leader最⼤时⻓,它表示tickTime时间倍数即:initLimit*tickTimeinitLimit=10# 允许follower与leader数据同步最⼤时⻓,它表示tickTime时间倍数syncLimit=5#zookepe ...
activiti7进阶
Activiti7进阶一.流程实例流程实例(
ProcessInstance)代表流程定义的执行实例。
一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。
例如:用户或程序按照流程定义内容发起一个流程,这就是一个流程实例。
流程定义和流程实例的图解:
启动流程实例 并添加Businesskey(业务标识)
流程定义部署在activiti后,就可以在系统中通过activiti去管理该流程的执行,执行流程表示流程的一次执行。
比如部署系统出差流程后,如果某用户要申请出差这时就需要执行这个流程,如果另外一个用户也要申请出差则也需要执行该流程,每个执行互不影响,每个执行是单独的流程实例。
启动流程实例时,指定的businesskey,就会在act_ru_execution #流程实例的执行表中存储businesskey。
Businesskey:业务标识,通常为业务表的主键,业务标识和流程实例一一对应。业务标识来源于业务系统。存储业务标识就是根据业务标识来关联查询业务系统的数据。
比如:出差流程启动一个流程实例,就可以将出差单的id作为业务标识存储到ac ...
activiti7入门
Activiti7工作流引擎一.准备工作1.1创建一个activiti的maven工程1.2.idea下载插件
1.3.pom.xml配置123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency& ...
美团动态线程池实现原理
美团动态线程池实现原理背景:动态线程池,指的是线程池的参数可以动态修改并生效,比如corePoolSize、maximumPoolSize等。
在工作中,线程池的核心线程数和最大线程数等参数是很难估计和固,如果能在应用过程中动态进行调整,就很有必要了。
前置条件1.直接基于SpringBoot
2.支持Nacos配置中心配置
核心配置项:
1234dtp: enable: true core-pool-size: 10 maximum-pool-size: 100
创建dtp-spring-boot-stater模块和user模块
在dtp-spring-boot-stater引入nacos配置坐标
12345<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.12</version></de ...
自定义springboot stater
自定义SpringBoot staterstater的启动原理
stater-pom引入autoconfigure包
autoconfigure包中的配置使用META-INFO/spring.factories中的“org.springframework.boot.autoconfigure.EnableAutoConfiguration”的值,使得项目启动时加载指定的自动配置类
这里的autoconfigure指的是我们通过can-spring-boot-stater依赖的can-spring-boot-stater-autoconfigure
自定义的stater步骤1.创建can-spring-boot-stater删除多余的配置和文件夹,目录如下:
pom文件引入can-spring-boot-stater-autoconfigure的坐标
12345<dependency> <groupId>com.can</groupId> <artifactId>can-spring-boot-stater-autoc ...
责任链模式
责任链模式模式定义:
为请求创建了一个接收者对象的链。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455public class ChainOfResponsibility { public static void main(String[] args) { AbstractHandler handler1 = new ConcreteHandler1(); AbstractHandler handler2 = new ConcreteHandler2(); handler1.setNext(handler2); handler1.handleRequest("login"); }}abstract class AbstractHandler { protected AbstractHand ...
观察者模式
观察着模式模式定义:
定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖着都会收到通知并更新。
应用场景:
当更改一个对象的状态可能需要更改其他对象,并且实际的对象集事先未知或动态更改时,请使用观察者模式。
优点:
1.符合开闭原则
2.可以在运行时建立对象之间的关系