1 Star 0 Fork 0

peak2010 / SpringCloudDemo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

SpringCloudDemo

介绍

SpringCLoud 基本使用和基本原理测试项目

软件架构

软件架构说明

理解说明

1 Eureka服务治理

1,服务提供者
1.1,服务注册:服务提供者在启动的时候通过发送REST请求的方式将自己注册到EurecaServer上,同时带上自身元数据信息。
Eureca Server接收到这个REST请求之后,将元数据的信息储存在一个双层结构的Map中,第一层map的key为服务名,第二层的key为具体服务的实例名。
1.2,服务续约:注册完服务之后,服务提供者会维持一个心跳告诉 EurecaServer :“我是一个活着的健康实例”,从而防止Eureca Server的“剔除任务”从服务列表中排除该实例。
eureka.instance.lease-renewal-interval-in-seconds:心跳任务的调用时间,默认三十秒
eureka.instance.lease-expiration-duration0in-seconds:服务时效时间,默认九十秒

2,服务消费者
2.1,服务消费者启动的时候会发送一个REST请求给注册中心,获取已注册的服务清单。 为了性能考虑,EurecaServer会维护一份只读的服务清单来返回给 客户端,同时该缓存清单会隔三十秒刷新一次
eureka.client.fetch-registry:获取服务,默认为true
eureka.client.registry-fetch-interval-seconds:缓存清单的更新时间,默认三十秒
2.2,消费者获取清单之后,就可以获得服务者的实例名和元数据信息。 Ribbon默认使用轮询的方式调用,从而实现客户端负载均衡
2.3,服务实例进行正常的关闭操作时,会触发一个服务下线的REST请求给Eureca Server,注册中心将该服务状态设置为下线(DOWN),并且把下线事件传播出去。

3,服务注册中心
3.1,服务同步:服务注册中心之间相互注册,服务中心之间转发注册请求服务给集群中的其他服务注册中心,从而实现服务注册中心之间的服务同步;
3.2,失效剔除:Eureka Server在启动的时候会创建一个定时任务,默认每隔60秒将当前清单中超时(默认90秒)没有续约的服务剔除出去;
3.3,自我保护:Eureka Server会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况,EurekaServer会将这些实例保护起来,让其不过期。这样客户端就会访问挂掉的服务,所以要求客户端必须要有容错机制(请求重试,断路器等)
eureka.server.enable-self-preservation=false : 关闭保护机制
关于保护机制的说明:https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html

2 Feign

Feign的一个关键机制就是使用了动态代理。咱们一起来看看下面的图,结合图来分析:
1,首先,如果你对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理
2,接着你要是调用那个接口,本质就是会调用 Feign创建的动态代理,这是核心中的核心
3,Feign的动态代理会根据你在接口上的@RequestMapping等注解,来动态构造出你要请求的服务的地址
4,最后针对这个地址,发起请求、解析响应
Image text Feign原理:https://www.jianshu.com/p/8c7b92b4396c

3 Ribbon

作用是负载均衡,默认使用的最经典的Round Robin轮询算法。
Ribbon是和Feign以及Eureka紧密协作,完成工作的,具体如下:
a,首先Ribbon会从 Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口号。
b,然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器
c,Feign就会针对这台机器,构造并发起请求。
Image text

4 Hystrix

1,Hystrix隔离:Hystrix会搞很多个小小的线程池,比如订单服务请求库存服务是一个线程池,请求仓储服务是一个线程池,请求积分服务是一个线程池。每个线程池里的线程就仅仅用于请求那个服务。
2,Hystrix隔离、熔断和降级的全流程
Image text

5 Zuul

Zuul,也就是微服务网关。这个组件是负责网络路由的,可以做统一的降级、限流、认证授权、安全,等等

总结:
Spring Cloud核心组件,在微服务架构中,分别扮演的角色:
Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务
电商微服务示例
Image text

参考资料

1, https://www.jianshu.com/p/2a89a3b4ef24
2, https://blog.csdn.net/qq_24313635/article/details/84347832

码云特技

  1. 使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md
  2. 码云官方博客 blog.gitee.com
  3. 你可以 https://gitee.com/explore 这个地址来了解码云上的优秀开源项目
  4. GVP 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
  5. 码云官方提供的使用手册 https://gitee.com/help
  6. 码云封面人物是一档用来展示码云会员风采的栏目 https://gitee.com/gitee-stars/

空文件

简介

暂无描述 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/peak2010/SpringCloudDemo.git
git@gitee.com:peak2010/SpringCloudDemo.git
peak2010
SpringCloudDemo
SpringCloudDemo
master

搜索帮助