1.Dubbo源码解析:网络通信
2.java后端主流框架?
3.国内有哪些好的源码java开源电子商城系统?
4.dubbo十层架构?
Dubbo源码解析:网络通信
在之前的章节中,我们探讨了消费者如何通过内置的源码负载均衡找到服务提供者以及服务暴露的原理。本节重点关注的源码是消费者如何通过网络与提供者进行远程调用的详细过程,涉及Dubbo框架的源码网络通信机制。
网络通信主要在Dubbo的源码Remoting模块中实现,Dubbo支持多种协议,源码3389端口开启源码包括自定义的源码Dubbo协议、RMI、源码Hessian、源码HTTP、源码WebService、源码Thrift、源码REST、源码gRPC、源码Memcached和Redis等,源码每种协议有其特点。例如,Dubbo协议利用NIO异步通信,适合处理大量并发小数据量的场景,而RMI采用阻塞式短连接,适合Java RMI应用。
序列化在通信中起着至关重要的作用,Dubbo支持多种序列化方式,如Hessian2、Java、Fastjson等,其中Hessian2是默认选择。近年来,高效序列化技术如Kryo和FST不断涌现,它们的性能优于Hessian2,可通过配置引入以优化性能。
数据在网络传输中需要解决粘包拆包问题,Dubbo通过定义私有RPC协议,消息头包含魔数、类型和长度等信息,以确保数据的正确接收。在消费者发送请求时,首先会生成一个封装了方法和参数的Request对象,经过编码后通过Netty发送。提供方则通过Netty接收请求,解码后执行服务逻辑并返回Response对象。
双向通信中,服务提供方和消费方都通过心跳机制来检查连接状态,客户端和服务端都设有定时任务,确保数据的及时交互。在异步调用中,Dubbo通过CompletableFuture实现从异步到同步的转换,并处理并发调用时的数据一致性问题。
java后端主流框架?
现在企业开发时,Java所用到的主流框架有哪些?
做了十多年的Java开发,和大家介绍一下我最近一两年用的比较多的Java框架(包括软件、中间件)。
Spring:从刚开始工作的时候就在用;是一个J2EE框架,提供了对IOC的良好支持,也提供了对AOP技术非常好的封装;
SpringMVC:也是Spring的一个子项目,实现了MVC设计模式,目标是解耦;
MyBatis、Hibernate:两个都是ORM框架,现在Hibernate用的少了;也有用到SpringDataJPA,这个可以看做是更高级的封装,可以通过方法的命名,实现SQL语句;
可以看到,上面就是SSM框架,现在还是比较流行的。
Maven:新老项目都是ssh开源源码基于Maven构建,它是一个项目管理工具,主要功能有:项目构建;Jar包的依赖管理;版本管理;持续集成等等等等;
JUint:单元测试工具;也是老朋友了;测试框架还有不少,比如SpringTest,JMock等等。
Shiro、SpringSecurity:关于安全认证的框架,用于用户身份认证,权限授权、加密、会话管理等;
CxforAxis:老项目WebService用的比较多一些;历史问题,还是要了解一下;
Quartz:定时服务框架,一般都是单机应用;
Elastic-job:分布式定时服务框架,当当出品;
log4j、logback:各种日志工具;现在会有一些日志采集分析的框架,比如ELK;
Ehcache:缓存框架,也都是用于单机项目;
Redis:说道缓存,现在更多的使用Memcached、Redis;当然Redis也不局限于缓存;
SpringBoot:用于搞定其他框架的一个框架,主要是提供了各种启动器、简化了各种配置、方便和其他框架集脊渗成、开发者能够快速上手。
Dubbo:一个微服务框架,阿里出品;
SpringCloud:另外一套微服务框架,这个就多了,例如:Config(配置管理中心)、NetflixEureka(服务注册、服务发现)、Hystrix(断路器,这个官方好像已经不建议使用了,又闷册有新的了)、Feign(声明式服务调用组件)、Ribbon(客户端负载均衡)、Zuul(网关)、Bus(消息总线)等等。
DubboorSpringCloud:这个看公司的技术栈,用到哪个学哪个,都没有用到,建议学SpringCloud。
RestfulAPI、RPC:不同风格的服务;
Swagger:RestfulAPI自动生成工具;
消息队列:常用RabbitMQ和Kafka,一种保存消息的容器,也用于系统间解耦;
MongoDB:BSON(类似JSON)格式的内存数据库;
Zookeeper:一个分布式协调服务;
Nginx:或其他负载均衡软件;
Docker:容器技术。
我将持续分享Java开发、架构设计、蚂野宏程序员职业发展等方面的见解,希望能得到你的关注。
java有什么常用开源的框架(java开发主流框架是什么)java常用开源框架如下:
1.SpringFrameworkJava开源JEE框架
Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的InversionofControl容器。然而,这仅仅是完整图景中的一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。
2.WebWorkJava开源Web开发框架
WebWork是由组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EEWeb框架。
3.StrutsJava开源Web开发框架
Struts是一个基于SunJ2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(messageresources)整合到一个统一的框架中
4.HibernateJava开源持久层框架
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的delphi 网页源码6对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合
5.QuartzJava开源调度框架
Quartz是开源组织在Jobscheling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。
6.VelocityJava开源模板引擎
Velocity是一个基于java的模板引擎(templateengine)。它允许任何人仅仅简单的使用模板语言(templatelanguage)来引用由java代码定义的对象。当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提帆派供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。
7.IBATISJava开源持久层框架
使用ibatis提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象,这一层与通过Hibernate实现ORM而言基本一致,而对于具体的数态镇贺据操作,Hibernate会自动生成SQL语句,而ibatis则要求开发者编写具体的SQL语句。相对Hibernate等“全自动”ORM机制而言,ibatis以SQL开发的工作量和数据库移植性上的让旅哗步,为系统设计提供了更大的自由空间。作为“全自动”ORM实现的一种有益补充,ibatis的出现显得别具意义。
java框架有哪些(java的三大框架是什么)
java框架实在是太多了,网上一抄一大陵液纯段,根本就了解不到什么。我还是以我的经验来说一下j2ee的框架。
1.首先力推struts2框架,这是最经典的框架(可以说没有“之一”)。可以帮你快速搭建出一个MVC模型出来。(注:struts1已经很少用了,且问题也很多,强烈推荐使用struts2).
2.Spring框架,这是排行第二的框架(我个人排得,非权威),这个框架出彩的地方就在于它的“依赖注入”和“控制反转”。简单的说,就是在程序运行的时候才将参数注入到容器里。
3.持久层框架选Hibernate和Ibatis。Hibernate自动化能力强,开发大型应用可以节约开发时间,ibatis小巧简洁,埋闹灵活。
4.Jquery是继prototype之后又一个优秀的Javacript框架,封装了很多javascript方法尺咐,是开发jsp用的框架,目前很流行
一般开发,都是使用Struts2SpringHibernate(ibatis)整合,前端用jquery或者其他类似框架。对于简单的系统,有时用SpringMVC一个框架即可。
java学习的主流框架有哪些?Java的框架主要有:SpringMVC、Spring、Mybatis、Dubbo、Maven、RabbitMQ、Log4j、Ehcache、Redis、5日跌幅源码Shiro。不过这十个我们不需要都学会,只要学会其中四五个比较常用的就可以。
第一个,SpringMVC。
SpringMVC是一种基于Java地实现了WebMVC设计模式仔没的请求驱动类型的轻量级Web框架,主要是帮助我们简化日常的Web开发;
第二个,Mybatis。
MyBatis是支持普通SQL查询,存储过程和高级帆告映射的优秀持久层框架;
第三个,Spring。
Spring深得企业的青睐;
第四个,Maven。
越来越多的开发人员开始使用maven。
掌握以上四种框架,你在找工作的时候就会比较吃香。
不过想把这四种框架学会也不容易。不了解Java的人可能看得都一头雾水更别说学习了。
这是因为想要学习Java框架还要从Java的基础部分学起。而从基础部分自学到Java框架,花费的时间就长了。
所以建议大家报班学Java,培训班不止能帮助你快速掌握理论知识,还念轿纳有实战项目助你巩固所学。
Java目前主流框架都有哪些?1,SpringMVC
在中国有一种说法“生姜仍旧又辛辣”,所以虽然SpringMVC已经发布了十多年,但它仍然强大有力,并且处于领先地位,具有绝对优势。在拥抱完整的MVC框架之后,Spring已经发展并且现在是面向Internet的应用程序的综合Java框架,为软件工程师提供了一个功能强大的工具包,用于Web应用程序开发和安全项目的应用程序配置。
2,Hibernate
虽然Hibemate不在RebelLabs的排行榜上,但它仍然是一个值得一提的Java框架。这种映射Java框架使用连续数据库访问操作而不是高级对象处理来解决对象和关系不匹配的问题。每个企业应用程序都不同,因此Hibernate附带了一个强大的功能集,可以帮助后端开发人员微调数据访问层。
3,Struts2
为了更详细地解释现代软件工程师广泛使用的Java框架,QianfengWuhanJavaTraining的老师介绍了Struts2,它是ApacheStruts1的后续版本。Struts2用于构建当代JavaEEWeb应用程序。ApacheSoftwareFoundation为开发人员提供了广泛的工具,用于创建企业级面向Web的应用程序,优化开发过程,甚至是后期维护,包括最终的优化过程和后期维护。
4、JSF
作为JavaEE的一部分,Oracle支持JavaServerFaces。虽然这不是快速Java开发的最佳框架,但很容易开始使用Oracle的大量文档。如果你不离开JavaEE环境粗做陆,JSF没有外部依赖,但它非常强大,它有一个丰富的库岩顷和工具(包括一个易于创建用户界面的工具集),无论你的应用程序有多复杂,它可以支持。
5、Grails
这种特殊的如何安装系统源码Web框架被认为是一种动态工具,可胡配以提高工程师的工作效率。它具有唯一的API实际,合理的默认值和约定的配置示例。与Java的无缝集成使其成为全球许多程序员的最佳选择。
6、GoogleWebToolkit
GWT是一个免费的Java框架,允许用户创建和优化复杂的基于Web的应用程序。GWT的软件开发工具包提供了核心JavaAPI和小部件,可以在构建之后编译到JavaScript应用程序中。
国内有哪些好的java开源电子商城系统?
国内知名的开源电子商城系统丰富多样,其中几个颇受欢迎的有: 1. 分布式B2C商城 xbin-store 这是一个模仿国内知名B2C网站设计的分布式商城系统,基于Spring Boot、Dubbo、MVC、MyBatis、Druid、Solr、Redis等技术构建,旨在提供一个高效、稳定、功能丰富的B2C电商解决方案。 2. Zscat-me 该项目是一个基于Spring Boot和Dubbo的全栈商城项目,集成了SSO登录、API网关、流量控制、自动CRUD、自动缓存、读写分离、分布式缓存、分布式定时任务、分布式锁、消息队列、事件机制、OAuth2.0登录、全文搜索、Qiniu文件服务、Dubbo集成等功能,提供了一个功能全面的电商平台。 3. 猫宁Morning公益商城 猫宁Morning公益商城是中国首个将传统公益商城互联网化的平台,具备B2C模式下的商城功能,包括注册、登录、商品浏览、购物车、订单管理、支付、评价、论坛等功能,同时后台提供用户管理、商品管理、订单管理、公告资讯管理等服务。 4. BDShop商城系统 BDShop是基于Spring Boot和Node.js的B2C电子商城系统,采用了前后端分离架构,旨在实现高效、灵活的电商解决方案。 5. Javashop-B2C 单店商城 Javashop-B2C基于Java技术构建,采用EOP(Enation Open Platform)框架,提供库存管理、订单流程、统计功能、支付方式等功能,易于扩展和定制,适合搭建稳定高效的B2C电商平台。 6. 小V铺微信开源商城 小V铺是完全免费的开源商城项目,支持HTML5+CSS3技术,提供商城源码、API和前端组件库,用户可以轻松定制和扩展,支持微信公众号、手机浏览器和朋友圈购物,功能全面,适用于一站式电商解决方案。dubbo十层架构?
Dubbo简介
Dubbo是Alibaba开源的分布式服务框架,它按照分层的方式来架构,使用这种方式可以使各层解耦。
Dubbo在调用远程的服务的时候再本地有一个接口,就想调用本地方法一样去调用,底层实现好参数传输和远程服务运行结果传回之后的返回。
Dubbo的特点:
(1)它主要使用高效的网络框架和序列化框架,让分布式服务之间调用效率更高。
(2)采用注册中心管理众多的服务接口地址,当你想调用服务的时候只需要跟注册中心询问谈歼瞎即可,不像使用WebService一样每个服务都得记录好接口调用方式。
(3)监控中心时实现服务方和调用方之间运行状态的监控,还能控制服务的优先级、权限、权重、上下线等,让整个庞大的分布式服务系统的维护和治理比较方便。
(4)高可用,如果有服务挂了,注册中心就会从服务列表去掉该节点,客户端会像注册中心请求另一台可用的服务节点重新调用。同时注册中心也能实现高可用(ZooKeeper)。
(5)负载均衡,采用软负载均衡算法实现对多个相同服务的节点的请求负载均衡。
Dubbo需要四大基本组件:Rigistry,Monitor,Provider,Consumer。
1、含空监控中心的配置文件-dubbo.properties文件
(1)容器改改,监控中心是在jetty和spring环境下运行,依赖于注册中心,日志系统是log4j
dubbo.container=log4j,spring,registry,jetty(2)监控服务的名称,监控系统对整个Dubbo服务系统来说也是一个服务
dubbo.application.name=simple-monitor(3)服务的所有者,这是Dubbbo的服务的功能,可以指定服务的负责人
dubbo.application.owner=coselding(4)注册中心的地址,配置后监控中心就能通过注册中心获取当前可用的服务列表及其状态,在页面向你汇报Dubbo中的服务运行情况。
dubbo.registr.address=multicast://{ ip}:{ port}//广播dubbo.registr.address=zookeeper://{ ip}:{ port}//zookeper
dubbo.registr.address=redis://{ ip}:{ port}//redis
dubbo.registr.address=dubbo://{ ip}:{ port}//dubbo
(5)dubbo协议端口号
dubbo.protocol.port=(6)jetty工作端口号
dubbo.jetty.port=(7)工作目录,用于存放监控中心的数据
dubbo.jetty.directory=${ user.home}/monitor(8)监控中心报表存放目录
dubbo.charts.directory=${ dubbo.jetty.directory}/charts
(9)监控中心数据资料目录
dubbo.statistics.directory=${ user.home}/monitor/statistics
()监控中心日志文件路径
dubbo.log4j.file=logs/dubbo-monitor-simple.log
()监控中心日志记录级别
dubbo.log4j.level=WARN
2、Dubbo提供负载均衡方式
(1)Random,随机,按权重配置随机概率,调用量越大分布越均匀,默认方式。
(2)RounRobin,轮询,按权重设置轮询比例,如果存在比较慢的机器容易在这台机器上请求阻塞较多。
(3)LeastActive,最少活跃调用数,不支持权重,只能根据自动识别的活跃数分配,不能灵活调配。
(4)ConsistenHash,一致性hash,对相同参数的请求路由到一个服务提供者上,如果有类似灰度发布需求可采用。
3、Dubbo过滤器
Dubbo初始化过程加载ClassPath下的META-INF/dubbo/internal/,META-INF/dubbo/,META-INF/services/三个路径下的com.alibaba.dubbo.rpc.Filter文件。文件内容:
Name=FullClassName,这些类必须实现Filter接口。自定义Filter类:
配置文件在配置过滤器,consumer.xml中:
Dubbo对过滤器的加载过程:
先加载三个路径下的com.alibaba.dubbo.rpc.Filter文件里面的键值对,key为过滤器名称,value为过滤器的类的全限定名(这个类必须实现Dubbo中的Filter接口)。自定义的类中@Active注解是过滤器设定的全局基本属性。Spring在加载consumer.xml文件时,通过dubbo:consumerfilter="xxx"id="xxx"retrries="0"这个配置指定消费者端要加载的过滤器,通过filter属性指定过滤器名称。@Activate注解-自动激活,group属性是表示匹配了对应的角色才被加载,value表示表明过滤条件,不写则表示所有条件都会被加载,写了则只有dubboURL中包含该参数名且参数值不为空才被加载,这个参数会以dubbo协议的一个参数K-V对传到Provider。
4、Dubbo的Provider配置
5、Dubbo的Consumer配置
1、Dubbo是什么?
Dubbo是阿里巴巴开源的基于Java的高性能RPC分布式框架。
2、为什么使用Dubbo?
很多公司都在使用,经过很多线上的考验,内部使用了Netty,Zookeeper,保证了高性能可用性。
使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可以提高业务复用灵活性扩展,使前端应用能快速的响应对边的市场需求。分布式架构可以承受更大规模的并发流量。
Dubbo的服务治理图:
3、Dubbo和SpringCloud的区别
两个没有关联,但是非要说区别,有如下几点:
(1)通信方式不同,Dubbo使用RPC通信,SpringCloud使用HTTPRestful方式
(2)组成部分不同
4、Dubbo支持的协议
dubbo://?(推荐);rmi://;hessian://;.weidian.dubbo.IMyDemo"version="1.0"id="myDemo"url="dubbo://.0.0.1:/"/dubbo:reference
、Dubbo多协议
Dubbo允许配置多协议,在不同服务器上支持不同协议,或者同一服务支持多种协议。
、当一个服务有多种实现时怎么做?
当一个接口有多种是现实,可以用group属性来分组,服务提供方和消费方都指定同一个group即可。
、兼容旧版本
使用版本号过度,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。
、Dubbo可以缓存吗?
Dubbo提供声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量。
、Dubbo服务之间的调用时阻塞的吗?
默认是同步等待结果阻塞的,支持异步调用。Dubbo是基于NIO的非阻塞实现并行调用的,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个Future对象。
、Dubbo不支持分布式事务
、Dubbo必须依赖的包
Dubbo必须依赖JDK,其他为可选。
、Dubbo使用过程中的问题
Dubbo的设计目的是为了满足高并发小数据量的rpc请求,在大数据量下性能表现不是很好,建议使用rmi或.alibaba.boot/groupId
artifactIddubbo-spring-boot-starter/artifactIdversion0.1.0/version/dependency
!----
dependency
groupIdcom.tec/groupIdartifactIdzkclient/artifactIdversion0./version/dependency
(2)配置dubbo
##Dubbo服务提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://.0.0.1:
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=
spring.dubbo.scan=org.spring.springboot.dubbo
##Dubbo服务消费者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://.0.0.1:
spring.dubbo.scan=org.spring.springboot.dubbo
Dubbo分布式服务框架介绍随着业务的发展、用户量的增长、系统并发访问需求越来越大,系统数量增多,调用依赖关系也变得复杂,为了确保系统高可用、高并发的要求,系统的架构也从单体时代慢慢迁移至服务SOA时代,根据不同服务对系统资源的要求不同,我们可以更合理的配置系统资源,使系统资源利用率最大化。而Dubbo则是SOA服务化治理方案的一个核心框架。
Dubbo作为阿里巴巴内部的SOA服务化治理方案的核心框架,在年时已经每天为+个服务提供3,,,+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。Dubbo自年开源后,已被许多肢启知非阿里系公司使用,其中既有当当网、网易考拉等互联网公司,也有中国人寿、青岛海尔等传统企业。
Dubbo是一个高性能服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,使得应用可通过高性能RPC实现服务的输出和输入功能,和Spring框架可以无缝集成。
作为一个分布式服务框架,以及SOA治理方案,Dubbo其功能主要包括:
Dubbo最大的特点是按照分层架构思维构建应用服务,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
Dubbo包含远程通讯、服务集群和服务发现与注册三个核心部分。提供透明化的远程方法调用,实现像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。同时具备软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。可以实现服旁则务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
Dubbo服务组件调用关秕说明:
Dubbo框架设计一共划分了个层,而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为历消双方都用到的接口。
下面,结合Dubbo官方文档,我们分别理解一下框架分层架构中,各个层次的设计要点:
从上图可以看出,Dubbo对于服务提供方和服务消费方,从框架的层中分别提供了各自需要关心和扩展的接口,构建整个服务生态系统(服务提供方和服务消费方本身就是一个以服务为中心的)。
根据官方提供的,对于上述各层之间关系的描述,如下所示:
说说Dubbo的分层?
从?的范围来说,dubbo分为三层,
business业务逻辑层由我们?来提供接?和实现还有?些配置信息;
RPC层就是真正的RPC调?的核?层,封装整个RPC的调?过程、负载均衡、集群容错、代理,
remoting则是对?络传输协议和数据转换的封装。划分到更细的层?,就是图中的层模式,整个分层依赖由上?下,除开business业务逻辑之外,其他的?层都是SPI机制。
如何更好地学习dubbo源代码一、Dubbo整体架构
1、Dubbo与Spring的整合
Dubbo在使用上可以做到非常简单,不管是Provider还是Consumer都可以通过Spring的配置文件进行配置,配置完之后,就可以像使用
springbean一样进行服务暴露和调用了,完全看不到dubbo
api的存在。这是因为dubbo使用了spring提供的可扩展Schema自定义配置支持。在spring配置文件中,可以像、这样进行配置。
META-INF下的spring.handlers文件中指定了dubbo的xml解析类:DubboNamespaceHandler。像前面的被解
析成ServiceConfig,被解析成ReferenceConfig等等。
2、jdkspi扩展
由于Dubbo是开源框架,必须要提供很多的可扩展点。Dubbo是通过扩展jdk
spi机制来实现可扩展的。具体来说,就是在META-INF目录下,放置文件名为接口全称,文件中为key、value键值对,value为具体实现类
的全类名,key为标志值。由于dubbo使用了url总线的设计,即很多参数通过URL对象来传递,在实际中,具唯睁体要用到哪个值,可以通过url中的参
数值来指定。
Dubbo对spi的扩展是通过ExtensionLoader来实现的,查看ExtensionLoader的源码,可以看到Dubbo对jdkspi做了三个方面的扩展:
(1)jdkspi仅仅通过接口类名获取所有实现,而ExtensionLoader则通过接口类名和key值获取一个实现;
(2)Adaptive实现,就是生成一个代理类,这样搭燃就可以根据实际调用时的一些参数动态决定要调用的类了。
(3)自动包装实现,这种实现的类一般是自动激活的,常用于包装类,比如Protocol的两个实现类:ProtocolFilterWrapper、ProtocolListenerWrapper。
3、url总线设计
Dubbo为了使得各层解耦,采用了url总线的设计。我们通常的设计会把层与层之间的交互参数做成Model,这样层与层之间沟通成本比较大,扩展起来
也比较麻烦。因此,Dubbo把各层之间的通信都采用url的形式。比如,注册中心启动时,参数的url为:
registry://0.0.0.0:?codec=registrytransporter=netty
这就表示当前是注册中知山虚心,绑定到所有ip,端口是,解析器类型是registry,使用的底层网络通信框架是netty。
二、Dubbo启动过程
Dubbo分为注册中心、服务提供者(provider)、服务消费者(consumer)三个部分。
1、注册中心启动过程
注册中心的启动过程,主要看两个类:RegistrySynchronizer、RegistryReceiver,两个类的初始化方法都是start。
RegistrySynchronizer的start方法:
(1)把所有配置信息load到内存;
(2)把当前注册中心信息保存到数据库;
(3)启动5个定时器。
5个定时器的功能是:
(1)AutoRedirectTask,自动重定向定时器。默认1小时运行1次。如果当前注册中心的连接数高于平均值的1.2倍,则将多出来的连接数重定向到其他注册中心上,以达到注册中心集群的连接数均衡。
(2)DirtyCheckTask,脏数据检查定时器。作用是:分别检查缓存provider、数据库provider、缓存consumer、数据库
consumer的数据,清除脏数据;清理不存活的provider和consumer数据;对于缓存中的存在的provider或consumer而数
据库不存在,重新注册和订阅。
(3)ChangedClearTask,changes变更表的定时清理任务。作用是读取changes表,清除过期数据。
(4)AlivedCheckTask,注册中心存活状态定时检查,会定时更新registries表的expire字段,用以判断注册中心的存活状态。如果有新的注册中心,发送同步消息,将当前所有注册中心的地址通知到所有客户端。
(5)ChangedCheckTask,变更检查定时器。检查changes表的变更,检查类型包括:参数覆盖变更、路由变更、服务消费者变更、权重变更、负载均衡变更。
RegistryReceiver的start方法:启动注册中心服务。默认使用netty框架,绑定本机的端口。最后启动服务的过