091.dubbo 的框架原理
节点角色说明:
Provider: 暴露服务的服务提供方(service)。
Consumer: 调用远程服务的服务消费方(controller)。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推
送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,
如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计
数据到监控中心。
092.dubbo 的注册中心
Dubbo 的注册中心有好多种,包括 Multicast、Zookeeper、Redis、Simple 等。Dubbo 官方推荐使用 Zookeeper 注 册中心,我所使用过的也只是 Zookeeper 注册中心。
093.dubbo 的使用步骤
dubbo 是无入侵式的 RPC 框架,无须更改代码,只需要添加依赖,修改配置文件即可使用:
1、pom.xml 中添加 dubbo 依赖
2、在配置文件中配置
<dubbo:applicaiton name=””>:应用名称
<dubbo:registroy protocol=”” address=””>:协议名称、服务地址,ip 地址端口号
<dubbo:service /> :发布服务
<dubbo:reference/>:调用服务
094.dubbo 注册中心启动后,服务提供者和服务消费通信后,注册中心挂了会不会对 dubbo 有影响
不会的,因为 dubbo 的注册中心,使用的是 zookeeper,只是提供目录服务,将发布的服务信息存储在 dubbo 目录中,服务消费者根据声明的调用服务,去注册中心查找服务,找不到后会重试三次,如果服务都无法调用再报异常,但是有的时候系统是分布式服务,就会可能重试多次,一旦服务提供者和服务消费者通讯后,则不再需要注册中心,通过服务的 URL 地址也可以调用服务。所以,只要通信过,即使注册中心宕机了,原来通信的服务依然可以使用,没有影响,但是新发布的服务则无法被发布到服务目录中。
095.什么是 zookeeper
ZooKeeper 是一个开放源码的分布式协调服务中间件,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。
zookKeeper=文件系统+监听系统
096.为什么用 zookeeper
我们使用 zookeeper 主要是因为他的服务注册及服务发现功能,主要是用于 dubbo 的注册中心。当时我们在用 dubbo 时,官方推荐的 zookeeper 作为注册中心,但是现在貌似都在提去 zookeeper 化,甚至于阿里都开始不再提倡使用 zookeeper,自己也是开源了 nacos 动态配置文件中心,允许线上动态切换配置文件,以及服务发现和服务注册功能。
我大概了解了下,分布式系统的三大指标 CAP,zookeeper 主要是 CP,要求强一致性,但是 springcloud、nacos 都是 AP,要求可用性,即使注册中心除了问题也不会影响到服务,所以现在好多公司都在将 RPC 通讯有原来的
springboot+dubbo 再向 springboot+springcloud 过度。
097.zookeeper的集群的大多数原则
在集群模式下,建议至少部署3个zk进程,或者部署奇数个zk进程。如果只部署2个zk进程,当其中一个zk进程挂掉后,剩下的一个进程并不能形成大于1/2集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半
zookeeper容错是指,当宕掉几个zookeeper服务器之后,剩下的个数必须大于宕掉的个数,也就是剩下的服务数必须大于n/2,zookeeper才可以继续使用,无论奇偶数都可以选举leader。5台机器最多宕掉2台,还可以继续使用,因为剩下3台大于5/2
098.zookeeper的选举机制:
zookeeper的选举机制:当集群创建成功之后,zookeeper集群中的所有节点会进行投票选举,选举出主节点(leader)选举的原则就是1/2原则。主节点选举成功之后,主从(follower)节点会进行心跳检测,主节点会开辟线程和从节点之间进行数据同步。主节点主要负责数据写入,从节点负责读取数据。
099.你是怎么设计数据库的?
设计数据库首先要遵循三大范式要求:原子性、依赖性、关联性
1.原子性是指数据库表的每一列都是不可分割的原子数据项
2.依赖性是指实体的属性完全依赖于主关键字。
3.关联性是指任何非主属性不依赖于其它非主属性
对于数据库设计来说,不仅仅要考虑范式要求,为了节省查询效率,允许适当的有一些冗余字段。
100. 常见的主流数据库
关系型数据是面向对象的设计,每一张表都是用来描述一类事物的,每一列都是用来描述事物的属性的,每一行都是一条记录、一个对象。以下是常用的:
1、MySQL:开源数据库,已被 Oracle 收购,6.0 后版本开始收费
2、Oracle:甲骨文公司的核心产品
3、SQL Server:微软公司出品,一般与 C#、.net 编程语言结合使用
4、DB2 :IBM 出品的关系型数据库
更多java面试题,在我主页java面试分栏,请点赞支持一下奥