java
2020-09-14 22:04:39 0 举报
java随笔,供记载
作者其他创作
大纲/内容
Object 1
仓储服务Eureka Client
Redis
当服务挂掉后,其他服务再次访问该服务时,就会直接走服务降级流程;
user
订单服务Eureka Client
flag = false
③:线程使用内存中的数据
线程池
微服务
select * from user where id = 1
1. 服务注册:eureka2. 网关:gateway3. 服务调用:feign4. 负载均衡:ribbon5. 断路器:hystrix6. 配置文件:config7. 统一总线:bus
服务调用
类加载器
每隔30秒同步
跳转到支付页面
springcloudconfig(配置中心)
将主内存中的数据修改完毕后,释放锁
unlock
工作内存
否
订阅服务
S0(1/10)
Object 2
浏览器发起请求
路由到http://127.0.0.1:10010
栈
watch监控
监控
积分服务Eureka Client
发起请求
feign
load
登录模块的简易结构图
minor GC
①:读取主内存中的数据
订单服务从Eureka服务端获取他所需的微服务的信息,并且每隔30秒同步一次;
局部变量表
服务注册,每隔30秒进行服务续约
java内存中的原子操作:①read:将数据从主内存中读取出来;②load:将数据加载到线程中的工作内存中;③use:线程使用该数据;④assign:将修改后的数据保存到工作内存中;⑤store:将修改后的数据加载到主内存中;⑥write:将原来的数据设置为修改后的数据;⑦lock:给数据上锁,只有本线程才能访问,其他线程无法访问;⑧unlock:释放锁;
命中,则直接返回
库存服务Eureka Client
鉴权服务
方法区(常量,静态变量,类信息)
鉴权模块
线程的生命周期
查询缓存
获得锁
负载均衡
read
网关
优化器(语法优化)
节点的分类:持久节点,持久有序节点,临时节点,临时有序节点
主内存
hystrix服务降级、熔断隔离
微服务1
需求:1. 创建一个订单之后,如果用户立刻支付了这个订单,我们需要将订单状态更新为“已支付”(订单服务)2.扣减相应的商品库存(库存服务)3.通知仓储中心,进行发货(仓储服务)4.给用户的这次购物增加相应的积分(积分服务)一共涉及了订单服务、库存服务、仓储服务、积分服务等;
加载到
程序计数器(方法执行的行数)
等待获取
将token的信息保存到redis中,并设置一个过期时间
当jvm进行GC时,就会发生STW(stop the world),将所有的线程挂起,只进行GC
动态链接
use
发起登录,传递用户名和密码
15
微服务2
survive区
提供不同的数据存储方式
用户登录
服务注册
route
JMM模型(java并发内存模型)
总线(MESI缓存一致性协议)
类
执行引擎
堆
用户是否登录
Eureka服务注册和发现
可见性:当设置了volatile后,总线会开启mesi缓存一致性协议,同时,每个线程都会监听总线的变化,当一个线程修改了数据后,会立即同步到主内存中,当执行store操作经过总线时,其他线程就监听到这个变化,就会将自己工作内存中的同一个数据失效掉,然后读取主内存中的数据,这就保证了可见性;
eureka:服务注册中心;服务如何注册?设置服务的心跳周期,定期向eureka中写入;
当微服务经过3次心跳周期(90s)未向Eureka服务器注册自己的信息,Eureka服务端则会认为该服务已经失效,并将其从注册表中移除;
127.0.0.1:80
api.leyou.com
volatile关键字的作用:当使用了volatile关键字后,总线开启了MESI缓存一致性协议和CPU总线嗅探机制,当一个线程要修改多个线程共享的数据时,其他线程会监听到该变化,并将工作内存中同一数据失效,然后重新从主内存中读取;而线程在修改数据前,会lock将要修改的数据区域 ,只有修改完毕后,才会释放锁;此时,其他线程就能获取到最新的数据。
flag = true
操作数栈
zookeeprzookeepr的分布式锁
本地购物车与后台数据库合并,并删除本地保存的数据;
ribbon
服务降级
其中,GC Roots为栈的本地变量,静态变量,本地方法栈的变量等
用户模块
java内存模型和计算机内存模型十分相似;
响应
GC Roots
生成一个包含用户信息的token,将token保存到cookie中,并发送给前台浏览器
innodb
一条sql语句的执行流程
根据可达性分析算法,找到垃圾对象
nginx服务器
数据库
Eureka中会维护一个注册表,用来保存服务的注册信息
lock
获取锁的条件:临时有序节点的序号最小
① 通过feign调用用户模块的api接口验证用户名和密码是否匹配
注册表
老年代(2/3)
Eureka Server注册中心
assign
springcloud的运行流程图
store
提交用户名和密码
本地注册表
gateway网关
CPU总线嗅探机制
client C
S1(1/10))
④:将修改后的数据保存到工作内存中
调用工具类生成token,并将token保存到cookie中
注册登录模块
服务层
当启动微服务后,微服务向Eureka发送注册信息,然后每隔30秒向Eureka中发送消息(心跳机制)进行服务续约,以保证Eureka不会把服务剔除掉;
002
缓存区(一、二级缓存)
client B
方法出口
Feign服务调用
client A
myisam
⑤:先获取所要修改的内存的锁,之后将数据写入到主内存中
Eden(8/10)
memory
用户服务
字节码执行引擎
write
当老年代被占满,且无法进行GC收集对象时,发生OOM(out of memory)
将域名解析为ip地址
购物车结算付款
当积分服务挂掉之后,不会影响其他服务的正常运行;
⑥修改主内存中的原数据
服务注册:微服务将自己的信息注册到Eureka中,包括服务名称,ip地址,端口号等
将商品添加到后台数据库中
执行器(执行sql)
后台
根据GC Roots对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象标记为非垃圾对象,其余未标记的对象会被当做垃圾会收掉
是
①当Eden区内存占满之后,jvm会开始minor GC,使用可达性分析算法判断Eden区中对象是否有效,若有效,将对象移至S0区,之后,清空Eden区;②当S0区内存占满后,启动GC判断Eden和S0区中的有效对象,将有效对象移至S1区,之后清空Eden和S0区;③每次移动对象,都会修改对象头中gc分代年龄(+1),当年龄达到15时,jvm会将对象移动到老年代中;(对象动态年龄判断:当survive区中的对象的大小大于S0区的一半时,将对象放入到老年代中)④当老年代内存占满之后,会对整个堆内存进行full GC,清除无效对象;问题:当jvm进行GC时,会
create /节点名称 节点值set /节点名称 节点值get /节点名称 【watch】delete /节点名称 节点值
将商品信息添加到Local Storage中
分析器(语法分析)
文件存储层
在store之前获取到lock锁,将flag这片区域锁住
full GC
jvm虚拟机
前台
用户注册
年轻代
多线程的三大特性:可见性,原子性,有序性;其中,volatile关键字保证了可见性和有序性,但不能保证原子性,所以需要synchronized
eureka注册中心
main方法(栈帧)
CPU线程1
添加商品到购物车
003
001
②:将数据加载到工作内存
CPU线程2
调用用户服务,校验用户名和密码
当客户端连入zookeeper中时,会自动生成一个临时有序节点,序号值最小的获取到锁,当客户端操作结束并断开连接后,其临时节点会自动失效;之后的节点监控到锁被释放后,会去尝试获取锁;
flag = false->true
本地方法栈
0 条评论
下一页