本文是老师培训课程的一些总结~有什么不准确的地方,请各位大神不吝赐教!
SpringCloud分布式开发五大神兽
服务发现: Netflix Eureka
客户端负载均衡:Netflix Ribbon
断路器: Netflix Hystrix
服务网关: Netflix Zuul
分布式配置: Spring cloud Config
分布式CAP理论
C Consistency(一致性)
A Availability(可用性)
P Partition Tolerance(分区容错性)
p是基本要保证的,c与a不能同时满足,在c与a 之前权衡
Redis
部署集群的方式:
- 主从
- 哨兵主从 e.g. setinal(阿里)
- redis 集群 3.0开始
redis VS memcache
-
Redis支持数据的持久化,而Memcache不支持
Redis可以按照配置文件中约定的规则把数据写到硬盘上,即便服务器宕机了,重启服务器后可以把数据重新从硬盘加载入内存,保证了数据的不丢失,持久化。
Memcache没有这样的功能,数据完全存在于内存,服务器宕机,数据完全丢失。
所以可以把一些不重要,经常访问的数据放入Memcache,即使丢了影响也不大。 -
Reids支持多种数据类型
Redis支持String(字符串), List(列表), Hash(哈希), Set(无序集合) 及 Zset(有序集合) 等数据类型。 -
Redis支持主从集群
Redis支持主从集群,而Memcache也支持集群,但集群的能力很弱。
Memcache只有string类型的key和value -
Redis支持会话缓存
cookie里的jsessionId
Eureka
Server - Client架构
特点
- 通过定时任务去拿服务列表。client 要server发心跳,有心跳的代表存货,放到服务列表中
(心跳就是http请求) - 有延时,服务死了还会等下次(默认90s)内无心跳才会才会从服务列表去除。
解决:通过熔断 可利用 hytrix - 通过ribbon负载均衡
- 高可用可通过两台或多台客户端互相注册 互相复制的方式
(discoverClient)
核心代码
- initScheduleTask
- 服务之间调用:registry-fetch-interval
- 是否显示主机ip:prefer-ip-address
- 服务列表中每一个对象是通过双层map存储的 第一层map的key是service name,第二层key是instanceId
Feign
用于微服务之前接口调用,无感知就像调用内部接口,使用方便。Feign是由Netflix开发出来的另外一种实现负载均衡的开源框架,它封装了Ribbon和RestTemplate,实现了WebService的面向接口编程,进一步地降低了项目的耦合度。在主函数上加@EnableFeignClient,请求接口类上加@FeignClient即可使用。通过动态代理实现(jdk invocation proxy)
核心代码:
- FeignClientRegistry
- FeignClientFactoryBean
- BeanFactory
- Invocation Handler
基于http协议
ribbon 实现负载均衡
优点:
- Feign旨在使编程java Http客户端变得更容易。
- 服务调用的时候融合了 Ribbon 技术,所以也支持负载均衡作用。
- 服务调用的时候融合了 Hystrix 技术,所以也支持熔断机制作用