springcloud的⼯作原理
springcloud由以下⼏个核⼼组件构成:
Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka
Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,
从⽽知道其他服务在哪⾥
Ribbon:服务器发起请求的时候,基于Ribbon做负载均衡,从⼀个服
务的多台机器中选择⼀台
Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求
URL地址,发起请求
Hystrix:发起请求是通过Hystrix的线程池来⾛的,不同的服务⾛不同
的线程池,实现了不同服务调⽤的隔离,避免了服务雪崩的问题
Zuul:如果前端、移动端要调⽤后端系统,统⼀从Zuul⽹关进⼊,由
Zuul⽹关转发请求给对应的服务
jvm
第1步:虚拟机遇到一个new指令,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用的类是否已经被加载&解析&初始化。
第2步:如果类已经被加载那么进行第3步;如果没有进行加载,那么就就需要先进行类的加载。
第3步:类加载检查通过之后,接下来进行新生对象的内存分配。
第4步:对象生成需要的内存大小在类加载完成后便可完全确定,为对象分配空间等同于把一块确定大小的内存从 Java 堆中划分出来
第5步:内存大小的划分分为两种情况:第一种情况:JM 的内存是规整的,所有的使用的内存都放到一边,空闲的内存在另外一边,中间放一个指针作为分界点的指示器。那么这时候分配内存就比较简单,只要讲指针向空闲空间那边挪动一段与对象大小相同的距离。这种就是“指针碰撞”。
第二种情况:JVM 的内存不是规整的也就是说已使用的内存与未使用的内存相互交错。 这时候就没办法利用指正碰撞了。这时候我们就需要维护一张表,用于记录那些内存可用,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新到记录表上。
第6步:空间申请完成之后,JM 需要将内存的空间都初始化为0值。如果使用 TLAB,就可以在 TLAB 分配的时候就可以进行该工作。
第7步: JVM 对对象进行必要的设置。例如,这个对象是哪个类的实例、对象的哈希码、GC 年代等信息。
第8步:完成了上面的步骤之后 从 JM 来看一个对象基本上完成了,但从 Java 程序代码绝对来看,对象创建才刚刚开始,需要执行方法,按照程序中设定的初始化操作初始化,这时候一个真正的程序对象生成了。