SpringCloud学习
相关笔记:狂神说SpringCloud学习笔记-KuangStudy-文章
这文章总结的很全面:(194条消息) SpringCloud与Dubbo的区别_IsToRestart的博客-CSDN博客
服务注册与发现,负载均衡,远程服务调用的关系?
注册中心:多个(分布式集群)
服务提供者:多个
消费者向注册中心获取服务提供者列表(通过服务名查询),通过ribbon(本地)选择合适的服务提供者实现负载均衡。
客户端记录多个注册中心地址从而保证可用性。注册中心有多个服务提供者,从而实现负载均衡和高可用。
服务注册与发现的作用?
负载均衡?
- 微服务名字 【ribbon】
- 接口和注解 【feign】(可用作微服务间通信)
Ribbon是什么?
- Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。
- 简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。Ribbon 的客户端组件提供一系列完整的配置项,如:连接超时、重试等。简单的说,就是在配置文件中列出 LoadBalancer (简称LB:负载均衡) 后面所有的及其,Ribbon 会自动的帮助你基于某种规则 (如简单轮询,随机连接等等) 去连接这些机器。我们也容易使用 Ribbon 实现自定义的负载均衡算法!
Feign能干什么?
- Feign旨在使编写Java Http客户端变得更容易
- 前面在使用Ribbon + RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一个客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步的封装,由他来帮助我们定义和实现依赖服务接口的定义,在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它 (类似以前Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。
Feign默认集成了Ribbon
- 利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
负载均衡算法:
1、轮询法
2、随机法
3、源地址哈希法
4、加权轮询法
5、加权随机法
6、最⼩连接数法
Zookeeper
史上最全的Zookeeper原理详解(万字长文)_雷恩Layne的博客-CSDN博客
- 层次命名空间: ZooKeeper 组织数据以类似于文件系统的层次命名空间结构,每个节点被称为 “znode”。这些 znode 可以包含数据和子节点,从而形成了一个层次结构。这种结构使得可以在整个分布式系统中创建有层次结构的数据节点。
- 原子性操作: ZooKeeper 支持原子性的读写操作,即要么操作全部成功,要么全部失败。这确保了分布式系统中的一致性和可靠性。
- 数据发布/订阅机制: 客户端可以监听 znode 的变化,一旦 znode 内容发生改变,ZooKeeper 会通知监听该节点的客户端。这种机制可以用于实现配置管理和状态变化的通知。
- 有序性: ZooKeeper 提供有序性保证,可以为 znode 添加序列号。这在实现分布式队列等场景中非常有用。
- 分布式锁: ZooKeeper 提供了基于临时有序节点的分布式锁机制。多个客户端可以创建相同路径下的临时有序节点,其中最小的节点获得锁,其他客户端通过监听上一个节点的删除事件来判断是否获取了锁。
- 集群架构: ZooKeeper 本身就是一个分布式应用,通常以集群形式运行,其中包括多个 ZooKeeper 服务器。它使用 Paxos 算法来实现数据一致性和容错性,确保在服务器故障时也能保持系统可用性。
- 高性能: ZooKeeper 的设计目标之一是提供高性能和低延迟,它采用内存数据库和快速存储引擎等技术来实现这一点。
Dubbo
Dubbo是如何完成服务导出的?
- ⾸先Dubbo会将程序员所使⽤的@DubboService注解或@Service注解进⾏解析得到程序员所定义的
服务参数,包括定义的服务名、服务接⼝、服务超时时间、服务协议等等,得到⼀个
ServiceBean。
- 然后调⽤ServiceBean的export⽅法进⾏服务导出
- 然后将服务信息注册到注册中⼼,如果有多个协议,多个注册中⼼,那就将服务按单个协议,单个
注册中⼼进⾏注册
- 将服务信息注册到注册中⼼后,还会绑定⼀些监听器,监听动态配置中⼼的变更
- 还会根据服务协议启动对应的Web服务器或⽹络框架,⽐如Tomcat、Netty等
Dubbo是如何完成服务引⼊的?
- 当程序员使⽤@Reference注解来引⼊⼀个服务时,Dubbo会将注解和服务的信息解析出来,得到
当前所引⽤的服务名、服务接⼝是什么
- 然后从注册中⼼进⾏查询服务信息,得到服务的提供者信息,并存在消费端的服务⽬录中
- 并绑定⼀些监听器⽤来监听动态配置中⼼的变更
- 然后根据查询得到的服务提供者信息⽣成⼀个服务接⼝的代理对象,并放⼊Spring容器中作为Bean
评论
GitalkTwikoo