掌握之分布式-1.Dubbo
本章介绍分布式架构的底层技术。主要说明面试过程中可能被问到的技术点。
第一节 DubboDuboo
服务治理
Zookeeper
Dubbo是一个分布式、高性能、透明化的RPC(远程服务调用)服务框架, 提供服务自动注册、自动发现等高效服务治理方案,可以和Spring无缝集成。
2. Dubbo的由来当网站流量很小时,可以把所有功能都部署在一个项目中,叫单体应用框架。
随着流量的增大,应用拆分必不可少,此时会出现多个垂直应用,在美格尔应用中处理各自的业务逻辑。
当垂直应用越来越多,应用之间的交互不可避免,将核心业务抽离出来,作为独立的服务,逐渐形成稳定的服务中心。此时,用于提高业务复用和整合的 分布式服务框架 RPC 是关键。
当服务越来越多,容量的评估、小服务资源的浪费等问题逐渐显现,此时需要增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高集群利用率的 资源调度和治理中心 SOA 是关键。
3. Dubbo的主要特点透明化的远程方法调用,没有API侵入软负载均衡及容错机制,降低成本,拒绝单点服务自动注册与发现,不再需要写死服务提供者地址,注册中心基于接口名查询服务提供者的IP地址,并能够平滑的添加或删除服务提供者4. Dubbo的核心组件Provider
,暴露服务的服务提供方Consumer
,调用远程服务的服务消费者Registry
,服务注册与发现的服务中心Monitor
,统计服务的调用次数和调用时间的监控中心Container
,服务运行容器下面来解释上述的两张图:
服务容器启动、加载、运行服务提供者服务提供者在启动时,向注册中心注册自己提供的服务服务消费者在启动时,向注册中心订阅自己所需的服务,并将获得的地址列表进行缓存。如果没有订阅到自己想订阅的服务,它会不断尝试订阅注册中心返回服务提供者地址列表给消费者。当新的服务注册到注册中心后,注册中心会基于长连接将这些服务通过notify到消费者服务消费者从缓存的提供者地址列表中,基于软负载均衡算法,选一台进行服务调用(此处有容错机制)服务提供者和消费者,在各自的内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心5. Dubbo的核心配置ServiceBean
dubbo:reference引用配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。对应ReferenceBean
dubbo:protocol协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。对应ProtocolConfig
dubbo:application应用配置,用于配置当前应用信息,不管应用是服务提供方还是消费方 。对应ApplicationConfig
dubbo:module模块配置,用于配置当前模块信息,可选。对应ModuleConfig
dubbo:registry注册中心配置。对应RegistryConfig
dubbo:monitor监控中心配置。对应MonitorConfig
dubbo:provider提供者配置,当没有配置ProtocolConfig
或ServiceBean
时,采用该配置项,可选。对应ProviderConfig
dubbo:consumer消费方配置,当没有配置ReferenceBean
时,采用该配置项,可选。对应ConsumerConfig
dubbo:method方法配置dubbo:argument参数配置6. Dubbo支持的协议hessian(默认)、dubbo(不建议)、fastjson、Java自带序列化
8. 支持的通信框架默认是Netty的NIO通信,还支持mina、Grizzly、Http等
9. 支持的集群容错机制读操作建议使用Failover
失败自动切换,默认重试两次
写操作建议使用Failfast
快速失败,调用一次失败就报错
服务暴露:在容器启动时,按照Spring的加载流程初始化BeanDefinition,把服务提供者解析成ServiceBean
。然后调用export()
方法进行暴露。(暴露过程相当长,以后慢慢看吧)
ServiceBean
拿到对外提供服务的实际类ref(如HelloWorldImpl)通过ProxyFactory
的getInvoker()
方法使用ref生成一个AbstractProxyInvoker
实例。到这一步就完成了到Invoker的转换将Invoker
转换为Exporter
,这个根据不同的协议会有不同的实现Dubbo的实现:发生在DubboProtocol
的export()
,主要是打开socket侦听服务,并接收客户端发来的各种请求RMI的实现:发生在RmiProtocol
的export()
服务消费,分为消费端的初始化和服务引用过程。
初始化:
把服务引用的信息封装成URL,并注册到zk中心监听注册中心服务的上下线连接服务提供端,创建NettyClient
对象将这些信息包装成DubboInvoker
消费端的调用链,创建消费端Invoker实例的服务代理并返回服务引用:
经过负载均衡策略,调用提供者选择其中一个服务的URL与提供者netty建立连接,使用ProxyFactory创建远程代理或本地通信的Invoker,并将Invoker发送到netty提供端服务提供端接到该Invoker请求后,找到对应的本地Invoker,处理获取异步、同步处理结果异步调用,不需要立即拿到返回值,使用ExchangeClient.send()
同步调用,需要立即拿到返回值,使用ExchangeClient.request()
,返回一个ResponseFuture
,一直阻塞到拿到返回值ReferenceBean
的init()
方法调用Protocal
的ref()
方法生成Invoker
实例将Invoker
实例转换成客户端需要的接口类声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。