第一个分布式项目总结(1)——dubbo的那些事

自从面试被问了dubbo原理之后…。
以加深知识深度为目标,总结项目,加深认识。
项目介绍:
宜速教务,看名字就知道这一个教务系统。时间的话,从今年寒假末期就开始做,本人第一个应用了分布式的项目。
前端:Bootstrap模板…有点小丑。
后端:SOA架构,SSM框架、。
项目背景:大一选课时候就很愁…能不能抢到课极大取决于页面能不能访问,每到选课时候404总是那么亲切,有限的时间,巨大的数据量,服务器不堪重负,选课拼的不仅仅是网速,还是运气,多少学生熬夜抢课,网吧抢课,都败在了服务器宕机这无解的问题上,采用性能更加强大的服务器,又将导致成本大大提高,一个能以相对较低的成本应对高并发访问的教务系统就那么吸引人。

2019.02 - 2019.04 宜速教务 Java后台开发
使用技术:SSM+Maven+MySql+Redis+Solr+Nginx
在传统教务系统上,解决学生选课高并发所导致的服务器宕机问题
1.采用SOA架构的分布式作品;
2.利用Nginx进行对tomcat集群的反向代理和负载均衡;
3.采用Redis进行数据缓存,并存储session信息解决tomcat集群节点过多时产生的session风暴问题;
4.利用Solr实现课程索引功能,能有效处理中文分词问题,并且进一步减轻MySQL数据库的压力。

既然是SOA架构,那就应该面向服务,先上架构图(大佬们别喷)
第一个分布式项目总结(1)——dubbo的那些事_第1张图片
通过将其分隔成 5个系统进行服务分离。物理层面上在部署时其相对应的表现层和服务层也将分布部署在不同的PC级服务器上(只有PC机当服务器…)
而表现层对服务层的调用SOAP效率低,restful首先这种风格接触的少而且听说服务多的话调用关系混乱需要治理服务,就使用了dubbo组件(SpringClod开始项目的时候不会)。
我理解的dubbo
百度词条上对Dubbo这么说的

Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成

按我说呢Dubbo就是对服务资源进行调度和治理的分布式服务框架。把服务都上他这注册,谁要用谁就在他这调用,至于怎么掉的Dubbo给你解决。
放张Dubbo的图:第一个分布式项目总结(1)——dubbo的那些事_第2张图片
Container:服务容器,负责启动,加载,运行服务提供者。
Provider:暴露服务方称之为“服务提供者”。
Consumer:调用远程服务方称之为“服务消费者”。
Registry:服务注册与发现的中心目录服务称之为“服务注册中心”。
Monitor:统计服务的调用次数和调用时间的日志服务称之为“服务监控中心”。
从图中就可以很明确看出其结构和流程。
0.将服务装载容器中,然后准备注册服务。解析服务。

1)、基于dubbo.jar内的Meta-inf/spring.handlers配置,spring在遇到dubbo名称空间时,会回调DubboNamespaceHandler类。
2)、所有的dubbo标签,都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将XML标签解析为Bean对象。生产者或者消费者初始化的时候,会将Bean对象转会为url格式,将所有Bean属性转成url的参数。 然后将URL传给Protocol扩展点,基于扩展点的Adaptive机制,根据URL的协议头,进行不同协议的服务暴露和引用。

1.服务提供者在启动时,向注册中心注册。即向注册中心暴露服务,dubbo推荐使用zk作为注册中心,也就是向zk暴露。

说两句注册中心,负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。

2.服务消费者在启动时,向注册中心订阅自己所需的服务。
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4.服务消费者,从提供者地址列表中,通过软负载均衡,选一台提供者进行调用,如果调用失败,再选另一台调用(默认尝试3次)。
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
从流程中就可以知道Monitor(监控中心)这东西挂掉与否其实不当误dubbo的使用。(在项目中我的Monitor…就有很长一段时间都不好使…)

说起来挺长的其实dubbo用起来还是很简单的,这东西能和Spring整合。我们在实际使用只需要在相应的配置文件中指出服务层暴露的服务是啥,表现层需要调用的服务是啥即可,直接上代码,别忘了在头添加命名空间。
服务层:


	<dubbo:application name="eas-manager" />
	<dubbo:registry protocol="zookeeper"
		address="你的zk地址" />
	
	<dubbo:protocol name="dubbo" port="20880" />
	
	<dubbo:service interface="cn.eas.service.CourseService" ref="courseServiceImpl" />

表现层:


	<dubbo:application name="eas-manager-web"/>
	<dubbo:registry protocol="zookeeper" address="你的zk地址"/>	
	<dubbo:reference interface="cn.eas.service.CourseService" id="courseService" />

用起来不难…

你可能感兴趣的:(项目总结)