1.微服务架构要解决的问题
最大的问题:网络是不可靠的。
1.1 客户端如何访问多个服务?
解决方案:服务聚合到API网关,聚合服务
1.2 服务与服务之间如何通信?
同步通信:Http(Apache Http Client)、RPC(Dubbo支持Java、Apache Thrift、gRPC)
异步通信:消息队列,如:kafka、RabbitMQ、RocketMQ
1.3 多个服务如何管理?
实现高可用、高并发和高性能的微服务,即保证一直可以用,存在副本。服务治理(服务注册),即服务上下线,管理服务的IP地址和端口。
基于客户端的服务注册与发现:Apache Zookeeper;
基于服务端的服务注册与发现:Netflix Eureka。
1.4 服务挂了怎么办?
服务宕机或者异常而挂机时,常见的解决方案是:
- 重试机制
- 服务熔断
- 服务降级
- 服务限流
2. 常见的分布式解决方案对比
Spring Boot + Spring Cloud | Spring Boot + Dubbo + Zookeeper |
---|---|
组件多,功能完备 | 组件少 |
Http通信 | RPC通信 |
3. 分布式协调技术
分布式协调技术主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序地去访问某种临界资源,防止造成“脏数据”的后果。核心是实现分布式锁,Zookeeper是一个分布式锁的实现。
3.1 分布式锁应该具备哪些条件?
一个方法在同一时间只能被一个机器的一个线程执行
高可用地获得锁和释放锁
高性能地获得锁和释放锁
具备可重入性(较难)
具备锁失效机制,防止死锁
具备非阻塞锁特性,既没有获取到锁就直接返回获取失败
3.2 分布式锁有哪些实现?
- Memcached:利用其add命令,该命令为原子操作,只有在key不存在的情况下才能add成功,也就意味着线程获得到了锁;
- Redis:利用其setnx命令,该命令也为原子操作,只有在key不存在的情况下,才能set成功。
- Zookeeper:利用Zookeeper的顺序临时节点,来实现分布式锁和等待队列,其设计初衷就是为了实现分布式锁服务;
- Chubby:谷歌实现的粗粒度分布式锁微服务,底层利用了Paxos一致性算法。