Java技术学习路线
2022-01-13 17:45:15 0 举报
AI智能生成
Java技术学习路线
作者其他创作
大纲/内容
如何做CTO
市场与营销
洞察市场
渠道制胜策略
定价要考虑渠道利益
子主题
了解渠道策略含义及作用
所谓营销渠道,也就是分销渠道,他指产品由生产者向最终消费者或用户流动所经过的途径或缓解,或者说是指企业将产品传递给最终购买者的过程中所使用的各种中间商的集合
减少交易行为就可以节省交易成本
营销渠道策略又称渠道战略,他是整个营销系统的重要组成部分,是规划中的重中之重,他对降低企业成本和提高企业竞争力具有重要意义
学会如何制定企业营销渠道
营销中介机构的类型多种多样
影响渠道建立的因素也很多
渠道具有非常大的惯性
考虑渠道的长度
渠道级数是指产品所经过渠道的环节数目,用渠道的级数表示渠道的长度
短渠道
技术性强的产品需要售前和售后服务水平
保鲜要求高
顾客少,地理上集中
企业规模大,有一定的营销能力
长渠道
单价低,标准化的日用品
顾客多,地理上分散
企业规模小
考虑渠道的宽度
渠道宽度定义:企业在某一市场上并列地使用多少个中间商
渠道制定宽度策略
独家分销
独家分销是指在一定地区,一定时间内只选择一家中间商经销或代理,授予对方独家经营权
如:生产和经营名牌
如:高档消费品
如:技术性强,价格较高的工业用品
优点
中间商经营积极性高
责任心强
缺点
市场覆盖面相对较窄,而且有一定风险
广泛分销
广泛分销又称密集性分销,即使用尽可能多的中间商从事产品的分销,使渠道尽可能的加宽,价格低,购买频率搞得日用消费品,工业用品中的标准件,通用小工具等,多采用此种分销方式
优点
市场覆盖面广,潜在顾客有较多的机会接触到产品
缺点
中间商的经营积极性较低,责任心差
选择性分销
选择性分销,在市场上选择部分中间商经营本企业产品,介于广泛分销和独家分销一种分销形式
如:消费品
如:工业用品,零部件
熟知营销渠道策略
如何管理企业营销渠道
技术提高
jvm调优
jvm体系结构
JVM体系结构
PC寄存器
每个线程都有一个程序计数器,是线程私有的,就是一个指针,指方法区中的方法字节码(用来存储指向的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,计划可以忽略不记
方法区
方法区是被所有线程共享的,所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。简单的说,所有定义的方法的信息都保存在该区域,此区域属于共享区间静态变量+常量+类信息(构造方法/接口定义)+运行时常量池存在方法区中
方法区(Method Area),是各个线程共享的内存区域,它用于存储虚拟机加载的:类信息+普通常量+静态常量+编译器编译后的代码等的,虽然jvm规范将方法区描述为堆的一个逻辑部分,但他却还有一个别名叫做(Non-Heap 非堆),目的就是要和堆分开
对于HotSpot虚拟机,很多开发者习惯将方法区称之为“永久代(Parmanent Gen)”,但严格本质上说两者不同,或者说使用永久代来实现方法区而已,永久代是方法区(相当于一个接口interface)的一个实现,JDK1.7版本中,已经将原本放在永久代的字符串常量池移走
常量池是方法区的一个部分,class文件除了有类的版本,字段,方法,接口等描述信息外,还有一项信息就是常量池,这部分内容将在类加载后进入方法区的运行时常量池中存放
Native Interface 本地接口
本地接口的作用是融合不同的编程语言为Java所用
栈是什么
栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,它的生命周期是跟随线程的生命周期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就over,生命周期和线程一直,是线程私有的。8中基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配
栈存储什么?
本地变量:输入参数和输出参数以及方法内的变量
栈操作:记录出栈,入栈的操作
栈帧数据:包扣文件,方法等
堆
jdk1.7以前一个jvm实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类,方法,常变量放到堆内存中,保存所有的引用类型的真实信息,以方便执行器执行,堆内存分为三部分:
新生区(Young Generation Space)
养老区(Tenure grneration space)
永久区(Permanent Space)
子主题
为什么废弃永久代
由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。理论上取决于32位/64位系统可虚拟的内存大小。可见也不是无限制的,需要配置参数。
实战
子主题
类加载器
双亲委派模型的式作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完全这个加载请求时,子加载器才会尝试自己去加载。
沙箱机制是由基于双亲委派机制上 采取的一种JVM的自我保护机制,假设你要写一个java.lang.String 的类,由于双亲委派机制的原理,此请求会先交给Bootstrap试图进行加载,但是Bootstrap在加载类时首先通过包和类名查找rt.jar中有没有该类,有则优先加载rt.jar包中的类,因此就保证了java的运行机制不会被破坏.
栈->程序=算法+数据结构
程序=框架+业务逻辑
对象创建
对象创建
对象分配内存
指针碰撞
连续分配地址空间,通过指针碰撞的方式分配内存,如图
可能会出现线程安全问题,多线程同时分配空间的时候如果没有做线程安全会导致同一个空间被两个线程同时占有,导致数值错误
空间列表
会有一个分配的历史记录,通过历史记录标记哪些是空余的,如下图:
线程安全问题
线程同步
本地线程分配缓冲(TLAB)
为每一个线程分配一个空间,如下图:
对象的结构
Mark Word
对象的访问定位
使用句柄
句柄:在java中我们在实例化完对象后,在对其进行操作时,用来去操作对象的就叫做句柄。
他代表了当前对象的唯一一个标识,并不能代表当前对象的内存地址。例如:Tree t1 = new Tree();
t1就属于当前新建对象的句柄,它指向新建对象的实例,我们通过他去操作对象。
他代表了当前对象的唯一一个标识,并不能代表当前对象的内存地址。例如:Tree t1 = new Tree();
t1就属于当前新建对象的句柄,它指向新建对象的实例,我们通过他去操作对象。
好处:对象地址变化对栈没有影响
缺点是两侧访问
缺点:是两侧访问
优点:对象地址变化对其没有影响
使用指针
优点:速度快
缺点:变化之后要重新指向
GC调优
垃圾回收
如何判断对象为垃圾对象
引用计数法
在对象中添加一个引用计数器,当有地方引用这个对象的时候,计数器+1,当时失效的时候,计数器-1
-verbose:gc-XX:+PrintGCDetails
引用计数器无法解决双向引用的问题
可达性分析法
作为GCROOt的对象:
虚拟机栈
方法区的类属性所引用的对象
方法区的常量所引用的对象
本地方法栈所引用的对象
如何回收
垃圾回收算法策略:
标记清除
free-list 对象分配的空间列表
复制算法
子主题
1、当Eden区满的时候,会触发第一次minor gc,把还活着的对象拷贝到Survivor From区;当Eden区再次触发minor gc的时候,会扫描Eden区和From区域,对两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域,并将Eden和From区域清空。
2、当后续Eden又发生minor gc的时候,会对Eden和To区域进行垃圾回收,存活的对象复制到From区域,并将Eden和To区域清空。
3、可见部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代
2、当后续Eden又发生minor gc的时候,会对Eden和To区域进行垃圾回收,存活的对象复制到From区域,并将Eden和To区域清空。
3、可见部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代
标记整理
子主题
分代算法
垃圾回收器:
Serial
单线程的垃圾收集器
ParNew
多线程的垃圾收集器
Parallel Scavenge
gc设置太频繁会影响吞吐量
CMS
标记清除收集器,工作在老年代
是一种以获取最短回收停顿时间为目标的收集器
收集算法:采用的是标记-清除算法实现
是一种以获取最短回收停顿时间为目标的收集器
收集算法:采用的是标记-清除算法实现
GMS收集器无法处理浮动垃圾,可能出现”Concurrent mode failure”失败而导致一次Full GC产生。
原因是GMS清除阶段,用户线程还在运行着,所以不断会有新的垃圾产生,而这一部分垃圾是没有办法在这一次清除,只好留到下一次再清理。也是由于GMS并发清除时,用户线程还在运行着,所以要为用户线程保留足够的内存空间。默认设置下,GMS在老年代使用了68%的空间后激活,如果应用中老年代增涨不是很快,可以适当调高该值:-XX:CMSInitiatingOccupancyFraction
若GMS运行期间,预留的空间满足不了应用程序的需求,就会触发一次”Concurrent mode failure”,这时候虚拟机启动备选方案,临时启用SerialOld收集器来重新进行老年代的垃圾收集。如果-XX:CMSInitiatingOccupancyFraction设置过高,很容易导致Concurrent mode failure,反而降低性能
GMS还有一个缺点:由于GMS采用的是标记清除算法,这意味着每次回收可能产生大量的碎片,导致可能找不到足够大的内存区域分配给大对象,这时不得不提前出发一次Full GC
原因是GMS清除阶段,用户线程还在运行着,所以不断会有新的垃圾产生,而这一部分垃圾是没有办法在这一次清除,只好留到下一次再清理。也是由于GMS并发清除时,用户线程还在运行着,所以要为用户线程保留足够的内存空间。默认设置下,GMS在老年代使用了68%的空间后激活,如果应用中老年代增涨不是很快,可以适当调高该值:-XX:CMSInitiatingOccupancyFraction
若GMS运行期间,预留的空间满足不了应用程序的需求,就会触发一次”Concurrent mode failure”,这时候虚拟机启动备选方案,临时启用SerialOld收集器来重新进行老年代的垃圾收集。如果-XX:CMSInitiatingOccupancyFraction设置过高,很容易导致Concurrent mode failure,反而降低性能
GMS还有一个缺点:由于GMS采用的是标记清除算法,这意味着每次回收可能产生大量的碎片,导致可能找不到足够大的内存区域分配给大对象,这时不得不提前出发一次Full GC
子主题
G1
既可以在新生代,也可以再老生带收集
ZGC
逃逸分析与栈上分配
逃逸分析,对象或者变量有没有出方法的范围
栈上分配,依据逃逸分析方法把没有分配的在栈上进行分配
性能调优
Class文件结构
Class文件是一组8位字节码为基础的单位的二进制流,各个数据项目严格按照顺序紧凑的排列在class文件之中,中间没有添加任何分隔符,这使得整个class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在
当遇到需要占用8位字节以上的空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。
class 文件只有两种数据类型:无符号数和表
MYSQL
理解B+tree的索引机制
为什么要用索引
索引能极大的减少存储引擎需要扫描的数据量
索引可以把随机IO变成顺序IO
索引可以帮助我们在进行分组、排序等操作时,避免使用临时表
为什么是B+Tree
二叉树查找
平衡二叉树
所有的节点的高度差不会超过1
子主题
mysql不用平衡二叉树的原因:
它太深了
数据处的(高)深度决定着他的IO操作次数,IO操作耗时大
它太小了
每一个磁盘块(节点/页)保存的数量太小了
没有很好的的利用操作磁盘IO的数据交换特性,也没有利用好磁盘IO的预读能力(空间局部性原理),从而带来频繁的IO操作
IO操作非常耗时
多路平衡查找树,B-Tree
加强版多路平和查找树,B+Tree
支节点不保存数据,所有的数据都放到叶子节点
B+ Tree与B-Tree的区别
B+Tree节点关键字搜索采用闭合区间
B+Tree非叶子节点不保存数据相关信息,只保存关键字和子节点的引用
B+关键字对应的数据保存在叶子节点中
B+叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系
为什么选择B+Tree
子主题
B+Tree索引的体现形式
.myd表定义文件是每个存储引擎都会有的
索引是保存在.MYI文件中
索引补充
列的离散型
离散性越高,索引的选择性越好
最左匹配原则
联合索引
覆盖索引
如果查询列可通过索引节点中的关键字直接返回,则该索引称之为覆盖索引
覆盖索引可以减少数据库IO,将随机IO变为顺序IO,可提高查询性能
列的离散性
列的离散性在索引中是一种很重要的指标。
列的离散性 x = count(distinct col) : count(col)
比例越大,离散性越高,选择性就越好
列的离散性 x = count(distinct col) : count(col)
比例越大,离散性越高,选择性就越好
下面我们看个例子来理解:
name的列的离散性 x1 = 5 : 5 = 1
sex的列的离散性 x2 = 2 : 5 = 0.4
x1>x2,所以sex的列的离散性低,可选择性差。
可选择性差是什么意思呢?比如有如上100W的数据,现在我们要查找sex=男的,那么在索引中我们可选择的范围太大了,因为只有男或者女,查询效率就很低
在mysql查询优化器中,如果列的离散性低的话,可能就不走索引,直接全表扫描
name的列的离散性 x1 = 5 : 5 = 1
sex的列的离散性 x2 = 2 : 5 = 0.4
x1>x2,所以sex的列的离散性低,可选择性差。
可选择性差是什么意思呢?比如有如上100W的数据,现在我们要查找sex=男的,那么在索引中我们可选择的范围太大了,因为只有男或者女,查询效率就很低
在mysql查询优化器中,如果列的离散性低的话,可能就不走索引,直接全表扫描
索引的使用注意事项
能不能用到索引还是要基于列的离散性
MySQL调优
理解mysql的体系结构
各大存储引擎介绍
插拔式存储引擎
1,插拔式的插件方式
2,存储引擎是指定在表之上的,即一个库中的每一个表都可以指定专用的存储引擎
3,不管表采用什么样子的存储引擎,都会在数据区,产生对应的一个frm文件
CSV存储引擎
用的较少,一般会用应用缓存代替,比如Redis
Mysql查询优化
1,mysql 客户端/服务端通信
2,查询缓存
3,查询优化处理
4,查询执行引擎
调用插件式的存储引擎的原子API的功能进行执行计划的执行
5,返回客户端
1、有需要做缓存的,执行缓存操作
2、增量的返回结果
开始生成一条结果时,MySQL就开始往请求方逐步返回数据,好处:MySQL服务器无需保存过多的数据,浪费内存用户体验好,马上就拿到了数据
如何定位慢SQL
业务驱动
测试驱动
慢查询日志
事务
锁
MVCC
基于查询执行路径理解查询机制
分布式
分布式架构应该具备
服务注册与发现
Eureka
服务调用
Netflix oss Ribbon
负载均衡
Netflix oss Ribbon
服务熔断
Hystrix
服务降级
Hystrix
服务消息队列
配置中心管理
spring cloud config
服务网关
zuul
服务监控
全链路追踪
自动化构建
定时任务与调度
分布式服务治理
子主题
从单体架构到微服务
面向服务(SOA)与微服务的区别就是SOA注重重用,微服务注重解耦
1,解耦是降低业务耦合度
2,重用是关心复用
3,微服务强调的是RESTFUl
共同点就是都是服务化思想的最佳实践方向
分布式与微服务的区别
分布式是部署模型
SOA与微服务都属于分布式
SOA是微服务的超集
微服务带来的困扰
运维上的困难
服务治理
负载均衡
服务的管理(服务注册)
服务的稳定性(限流,熔断)
服务的链路监控
简述Service Mesh
微服务治理之Alibaba or Netflix
子主题
分布式消息通信之RabbitMQ
基本介绍
MQ是基于AMQP协议实现的,即Advanced Message Queuing Protocl,一个提供统一消费服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品,不同的开发语言等条件的限制
RabbitMQ的特性
可靠性
灵活的路由
消息集群
高可用
多种协议
多语言客户端
管理界面
插件机制
工作模型
Java API编程
进阶知识
Spring配置方式集成RabbitMQ
分布式消息RocketMQ
分布式缓存之Redis
基础篇
Redis诞生历程
官网:https://redis.io/topics/data-types-intro
定位与特性
数据库与NOSQL
RDBMS
NOSQL
特性与分析
上手
服务安装
客户端安装
Redis数据类型
类型
String
Hash
List
根据插入顺序排序的字符串元素的集合。它们基本上是链表
Set
类似于Sets的排序集合,但每个字符串元素都与一个称为score的浮点值相关联。元素总是按它们的分数排序,因此与Sets不同,可以检索一系列元素
Sorted Set
Hyperloglog
这是一个概率数据结构,用于估计集合的基数。
Geo
可以使用特殊命令像位数组一样处理字符串值:您可以设置和清除单个位,计数所有设置为1的位,找到第一个设置或未设置的位,等等。
Streams
提供抽象日志数据类型的类地图项的仅追加集合。
维度
存储类型
基本操作命令
底层原理
应用场景
1、缓存
2、分布式Session
3、set NX EX 分布式锁
4、incr 全局ID
5、Incr 计数器
6、incr 限流
7、位操作
用0,1标记用户是否在线
高特性与原理篇
高级特性
pub/sub发布订阅
transactions事务
LUA脚本
原理剖析
Redis为什么这么快
内存回收
持久化机制
分布式篇
为什么需要集群
防止故障(可用性)
扩容(水平扩展)
负载(性能)
主从复制
可用性保证:Redis Sentinel
分布式有哪些解决方案
客户端
RedisSharding(jedis)
子主题
代理
Twemproxy-Twitter+LVS+Keepalived
Codis-豌豆荚
查询路由
RedisCluster
实战篇
客户端介绍
Jedis
pipeline
Luttece
Redission
应用
分布式锁实现
pipeline
数据一致性
子主题
高并发
热点数据发现
缓存击穿
缓存穿透
雪崩
zookeeper
ZK是通过一个特殊的文件系统,帮我们系统分布式系统间的协调。
Zookeeper 的数据模型
它很像数据结构当中的树,也很像文件系统的目录
节点特性(持久化,临时节点,有序节点,同级节点必须唯一,临时节点不能存在子节点)
树是由节点所组成,Zookeeper 的数据存储也同样是基于节点,这种节点叫做 Znode
但是,不同于树的节点,Znode 的引用方式是路径引用,类似于文件路径:/汽车/宝马
这样的层级结构,让每一个 Znode 节点拥有唯一的路径,就像命名空间一样对不同信息作出清晰的隔离。
但是,不同于树的节点,Znode 的引用方式是路径引用,类似于文件路径:/汽车/宝马
这样的层级结构,让每一个 Znode 节点拥有唯一的路径,就像命名空间一样对不同信息作出清晰的隔离。
zookeeper的设计思想
1 防止单点故障
集群方案(leader,follower)
2 每个节点的数据一致的
必须要有leader,leader、master、Redis-cluster
3 leader 挂了怎么办
4 如何保证事务的一致性
分布式事务,2PC
leader是整个zookeeper的核心,它起到了主导整个集群的作用,比如事务请求的调度和处理,保证事务处理的顺序性
follower是处理客户端的非事务请求以及请求转发给leader服务器,follower主要处理读请求,如果是写请求,那么这个请求会转发给leader去处理
除了Leader和Follow模式之外,还有第三种模式:Observer模式。
observer是观察者的角色,相当于了解集群中的情况变化并且同步,不参与事务请求的投票
zab协议
Zab协议是为分布式协调服务Zookeeper专门设计的一种 支持崩溃恢复 的 原子广播协议 ,是Zookeeper保证数据一致性的核心算法。Zab借鉴了Paxos算法,但又不像Paxos那样,是一种通用的分布式一致性算法。它是特别为Zookeeper设计的支持崩溃恢复的原子广播协议。
Zab 协议实现的作用
使用一个单一的主进程(Leader)来接收并处理客户端的事务请求(也就是写请求),并采用了Zab的原子广播协议,将服务器数据的状态变更以 事务proposal (事务提议)的形式广播到所有的副本(Follower)进程上去。
保证一个全局的变更序列被顺序引用。
Zookeeper是一个树形结构,很多操作都要先检查才能确定是否可以执行,比如P1的事务t1可能是创建节点"/a",t2可能是创建节点"/a/bb",只有先创建了父节点"/a",才能创建子节点"/a/b"。
为了保证这一点,Zab要保证同一个Leader发起的事务要按顺序被apply,同时还要保证只有先前Leader的事务被apply之后,新选举出来的Leader才能再次发起事务。
Zookeeper是一个树形结构,很多操作都要先检查才能确定是否可以执行,比如P1的事务t1可能是创建节点"/a",t2可能是创建节点"/a/bb",只有先创建了父节点"/a",才能创建子节点"/a/b"。
为了保证这一点,Zab要保证同一个Leader发起的事务要按顺序被apply,同时还要保证只有先前Leader的事务被apply之后,新选举出来的Leader才能再次发起事务。
当主进程出现异常的时候,整个zk集群依旧能正常工作。
崩溃恢复
当leader失去了过半的follower节点的联系
当leader服务挂了,集群就会进入崩溃恢复阶段
数据恢复
1.已经被处理的消息不能丢失,当leader收到合法的数量的follower的ack以后,就会向各个follower广播消息(commit命令),同时自己也会commit这条事务消息。如果follower节点收到commit命令前。leader挂了,会导致部分节点收到commit,部分节点没有收到。那么zab协议需要保证已经被处理的消息不能丢失
2.被丢弃的消息不能再次出现,当leader收到事务请求,并且还未发起事务投票之前,leader挂了
原子广播
zab的设计思想
1.zxid是最大的
2.epoch的概念,每生产一个新的leader,那么新的leader的epoch会+1,zxid是64位的数据,低32位表示消息计数器(自增)、高32位(epoch编号)
Zab协议原理
Zab协议要求每个 Leader 都要经历三个阶段:发现,同步,广播。
发现:要求zookeeper集群必须选举出一个 Leader 进程,同时 Leader 会维护一个 Follower 可用客户端列表。将来客户端可以和这些 Follower节点进行通信。
同步:Leader 要负责将本身的数据与 Follower 完成同步,做到多副本存储。这样也是提现了CAP中的高可用和分区容错。Follower将队列中未处理完的请求消费完成后,写入本地事务日志中。
广播:Leader 可以接受客户端新的事务Proposal请求,将新的Proposal请求广播给所有的 Follower。
Dubbo
为什么要用Dubbo
远程通信背景
技术架构的发展从单体到分布式,是一种顺势而为的架构演进,也是一种被 逼无奈的技术变革。架构的复杂度能够体现公司的业务的复杂度,也能从侧 面体现公司的产品的发展势头是向上的。 和传统的单体架构相比,分布式多了一个远程服务之间的通信,不管是 soa 还是微服务,他们本质上都是对于业务服务的提炼和复用。那么远程服务之 间的调用才是实现分布式的关键因素。 而在远程通信这个领域,其实有很多的技术,比如 Java 的 RMI、WebService、 Hessian、Dubbo、Thrift 等 RPC 框架,现在我们接触得比较多的应该就是 RPC 框架 Dubbo 以及应用协议 Http。其实每一个技术都是在某一个阶段产 生它的价值,随着架构的变化以及需求的变化,技术的解决方案也在变。所 以我们才需要不断的学习
大规模服务化对于服务治理的要求
我认为到目前为止,还只是满足了通信的基础需求,但是当企业开始大规模 的服务化以后,远程通信带来的弊端就越来越明显了。比如说
1. 服务链路变长了,如何实现对服务链路的跟踪和监控呢?
2. 服务的大规模集群使得服务之间需要依赖第三方注册中心来解决服务的
发现和服务的感知问题
3. 服务通信之间的异常,需要有一种保护机制防止一个节点故障引发大规模
的系统故障,所以要有容错机制
4. 服务大规模集群会是的客户端需要引入负载均衡机制实现请求分发
而这些对于服务治理的要求,传统的 RPC 技术在这样的场景中显得有点力 不从心,因此很多企业开始研发自己的 RPC 框架,比如阿里的 HSF、Dubbo; 京东的 JSF 框架、当当的 dubbox、新浪的 motan、蚂蚁金服的 sofa 等等 又技术输出能力的公司,都会研发适合自己场景的 rpc 框架,要么是从 0 到 1 开发,要么是基于现有的思想结合公司业务特色进行改造。而没有技术输 出能力的公司,遇到服务治理的需求时,会优先选择那些比较成熟的开源框
笔记仅仅提供与课后复习,为了达到更好的学习效果,请自己进行梳理,转载请注明《咕泡学院》
架。而 Dubbo 就是其中一个
1. 服务链路变长了,如何实现对服务链路的跟踪和监控呢?
2. 服务的大规模集群使得服务之间需要依赖第三方注册中心来解决服务的
发现和服务的感知问题
3. 服务通信之间的异常,需要有一种保护机制防止一个节点故障引发大规模
的系统故障,所以要有容错机制
4. 服务大规模集群会是的客户端需要引入负载均衡机制实现请求分发
而这些对于服务治理的要求,传统的 RPC 技术在这样的场景中显得有点力 不从心,因此很多企业开始研发自己的 RPC 框架,比如阿里的 HSF、Dubbo; 京东的 JSF 框架、当当的 dubbox、新浪的 motan、蚂蚁金服的 sofa 等等 又技术输出能力的公司,都会研发适合自己场景的 rpc 框架,要么是从 0 到 1 开发,要么是基于现有的思想结合公司业务特色进行改造。而没有技术输 出能力的公司,遇到服务治理的需求时,会优先选择那些比较成熟的开源框
笔记仅仅提供与课后复习,为了达到更好的学习效果,请自己进行梳理,转载请注明《咕泡学院》
架。而 Dubbo 就是其中一个
什么是dubbo
dubbo 主要是一个分布式服务治理解决方案,那么什么是服务治理?服务 治理主要是针对大规模服务化以后,服务之间的路由、负载均衡、容错机制、 服务降级这些问题的解决方案,而 Dubbo 实现的不仅仅是远程服务通信, 并且还解决了服务路由、负载、降级、容错等功能。
dubbo核心
网络通信
序列化
服务治理
负债均衡
链路监控
通信异常容错
分布式事务
分布式事务的解决方案
Atomikos
Jotm
分布式事务一致性
CAP理论,Base
强一致性(ACID)
弱一致性(BASE)
消息队列来辅助
子主题
避免分布式事务方法
最终一致性
最大化重试
支付宝的异步通知,每个订单的异步通知实行分频率发送,15s->3m 10m 30 m 1h 2h 6h 15h
主动查询(调单查询)
子主题
docker
docker脑图
常用的设计模式
策略模式
场景:
针对同一类型问题,有多种处理方式,每一种都能独立解决问题;
算法需要自由切换的场景;
需要屏蔽算法规则的场景;
针对同一类型问题,有多种处理方式,每一种都能独立解决问题;
算法需要自由切换的场景;
需要屏蔽算法规则的场景;
策略模式 使用的就是面向对象的继承和多态机制,从而实现同一行为在不同场景下具备不同实现。
策略模式 本质:分离算法,选择实现
主要解决在有多种算法相似的情况下,使用 if...else 或 switch...case 所带来的复杂性和臃肿性。
优点
算法多样性,且具备自由切换功能;
有效避免多重条件判断,增强了封装性,简化了操作,降低出错概率;
扩展性良好,策略类遵顼 里氏替换原则,可以很方便地进行策略扩展;
缺点
策略类数量增多,且所有策略类都必须对外暴露,以便客户端能进行选择;
算法多样性,且具备自由切换功能;
有效避免多重条件判断,增强了封装性,简化了操作,降低出错概率;
扩展性良好,策略类遵顼 里氏替换原则,可以很方便地进行策略扩展;
缺点
策略类数量增多,且所有策略类都必须对外暴露,以便客户端能进行选择;
观察者模式
工厂模式
简单工厂模式
简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类 的实例,但它不属于 GOF,23 种设计模式
简单工厂适用 于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创 建对象的逻辑不需要关心。
工厂方法模式
工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个 接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。在工厂方法 模式中用户只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符 合开闭原则。
工厂方法模式主要解决产品扩展的问题,在简单工厂中,随着产品链的丰富,如果每个 课程的创建逻辑有区别的话,工厂的职责会变得越来越多,有点像万能工厂,并不便于 维护
工厂方法适用于以下场景:
1、创建对象需要大量重复的代码。 2、客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。 3、一个类通过其子类来指定创建哪个对象。
工厂方法也有缺点:
1、类的个数容易过多,增加复杂度。
2、增加了系统的抽象性和理解难度。
1、创建对象需要大量重复的代码。 2、客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。 3、一个类通过其子类来指定创建哪个对象。
工厂方法也有缺点:
1、类的个数容易过多,增加复杂度。
2、增加了系统的抽象性和理解难度。
抽象工厂模式
抽象工厂模式(Abastract Factory Pattern)是指提供一个创建一系列相关或相互依赖,对象的接口无需指定具体的类
单例模式
解决一个并发访问的时候线程安全问题保证单例的技术方案有很多种:
饿汉式
在实例使用之前,不管你用不用,我都先new出来再说,避免了线程安全问题
懒汉式
注册登记式
枚举式
序列化与反序列化的时候出现多例
子主题
并发编程
Java中如何应用线程
1、Runnable接口
2、继承Thread类(本质上是对Runnable接口的实现)
3、Callable/Future带返回值的线程
4、ThreadPool
多线程应用场景
文件跑批
收益文件
对账文件
BIO模型优化
并发基础
生命周期
线程一共有6中状态
1、NEW;2、RUNNABLE(运行状态);3、BLOCKED;4、WAITING;5、TIMED_WAITING;6、TERMINATED(终止状态);
1、出现锁等待的时候会出现BLOCKED状态;2、TIMED_WAITING带等待时间;3、WAITING 不带等待时间
线程的启动
通过start()的方法
start()方法会调用start0()的本地方法
本地方法会调用操作系统来实现不同的线程创建和启动指令
线程终止
interrupt()线程终止,底层就是用_interrupted标记去判断当前的线程的中断标记然后去处理和自己定义一个volatile成员属性一样,然后再线程里面去判断这个属性是否true还是false一样
可以通过Thread.interrupt()去重置
interruptException 来进行重置
线程安全
synchronized(重量级锁)
synchronized的基本使用
1,修饰实例方法
2,修饰静态方法
3,修饰代码块
synchronized的锁的存储
1,对象在内从中的布局
对象头就是MarkWord
锁
无锁
偏向锁
轻量级锁
重量级锁
当去获得锁的时候如果存在线程竞争会把线程挂起来,等获得锁的线程释放以后再唤醒线程,这就叫重量级锁,性能消耗很大
Spring5核心原理
一切从bean开始
Java Bean是由Applet Bean演变而来
EJB(Enterprise Java beans)
POJO(plain ordinary Java Object 简单的javabean)
spring简化开发四个基本策略
基于pojo的轻量级和最小侵入性编程
通过依赖注入和面向接口松耦合
基于切面和惯性进行声明式编程
通过切面和模板减少样板式代码
DI IOC AOP 之间的关系
DI AOP 依赖于IOC
Spring 5
Spring 命名规则
Spring 实现的基本思路
Context结尾的是入口
定位:用Reader结尾的是定位
加载:BeanDefinition保存类信息,包括OOP关系是加载
注册:Factory、Context 就是把用户所定义的Bean放到IOC容器中也就是个Map
Spring IOC的启动入口
ClassPathXmlApplictionContext 通过main启动
DispatchServlet
FileSystem
Plugin
Lisenter
Spring 依赖注入
maven
子主题
Spring Boot
Spring boot的自动装配机制的原理
Spring Boot的基本认识
服务于框架的框架
什么是约定优于配置
1,maven的目录结构(默认会以jar的方式打包/默认会有resource文件夹)
2,spring-boot-starter-web 内置Tomcat,resource/{template/static}
3,默认application.properties
从Spring常见的注解切入,@Configuration/@ComponentScan
Spring Boot核心之自动装配的原理
Spring中
Spring Cloud 生态
springCloud定义
分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶
图片2
springboot版本选择
Git源码地址
https://github.com/spring-projects/spring-boot/releases/
springboot2.0新特性
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes
通过上面官网发现,Boot官方强烈建议你升级到2.X以上版本
官网看springboot版本
springcloud版本选择
git源码地址
https://github.com/spring-projects/spring-cloud
官网
https://spring.io/projects/spring-cloud
spring cloud中文文档
https://www.bookstack.cn/read/spring-cloud-docs/docs-index.md
官网看cloud版本
springcloud和springboot之间的依赖关系如何看
https://spring.io/projects/spring-cloud#overview
依赖
springcloud部分组件停更替换方案
服务注册中心
Eureka停止更新
Eureka采用cs的设计架构,EurekaServer 作为服务注册功能的服务器,他是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server 来监控系统中的各个微服务是否正常运行。在服务注册与发现中,有一个注册中心。当服务启动的时候会把当前自己服务器的信息比如服务地址通讯地址等以别名的方式注册到注册中心上。另一方面(消费者|提供服务者),以该别名的法式注册中心上获取实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在注册中心,因为使用注册中心管理服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC远程框架中都会有一个注册中心(存放服务地址相关信息)
Eureka包含两个组件:Eureka server 和 Eureka Client
Eureka Server 提供服务注册服务
各个微服务节点通过配置启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以再界面上直接观看到
各个微服务节点通过配置启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以再界面上直接观看到
EurekaClien通过注册中心进行访问
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮训(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会服务注册表中把这个节点服务移除(默认90s)
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮训(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会服务注册表中把这个节点服务移除(默认90s)
Zookeeper
Eureka停止更新了怎么办
SpringCloud整合Zookeeper替代Eureka
Consul
Nacos 推荐(经过了百万的流量考验)
服务调用
Ribbon
LoadBalancer
Feign
OpenFign
服务降级
Hystrix(不在更新)
resilience4j(国外在用,国内很少)
sentienl(推荐)
服务网关
Zuul(不在使用了)
gateway
服务配置
Config不推荐使用
Nacos
服务总线
Bus
Nacos
SpringCloud 服务治理
Eureka(服务注册中心) Consul/etcd/zookeeper
负载均衡(Ribbon,Feign)
配置中心(Config)
熔断(Hystrix)
SpringCloud 是一种标准
spring是 万能的粘合剂
Spring中大部分的组件都是做整合
JDK 8新特性
子主题
项目管理
一页纸项目管理表格(one page project manager)OPPM
一种工具
一份报告
项目的核心要素
如何做(how)
项目的中心
需要完成的工作的细节
做什么(what)
为什么要做(why)
何时完成(when)
度量上与实际上何时完成
时间线可能是弹性的
花费(how much)
硬性成本:咨询/机器成本
软性成本:雇佣成本
谁做项目(who)
谁负责哪些任务
谁应该得到哪些嘉奖
谁需要帮助
大数据
0 条评论
下一页