Dubbo分布式服务

一,传统系统架构模式

      1.什么是传统系统的架构模式

传统应用系统中(如:P2P网贷系统),我们主要使用了三层架构

即 表示层、业务层和数据访问层

传统Web应用程序客户端(浏览器)发起请求,由业务层执行业务逻辑,执行业务的过程中又通过数据库查询/处理业务相关的数据,最后在完成业务后将数据结合视图展示给用户。

      2.传统应用架构的不足

但是,在这种体系架构下的系统有几个问题。所有代码(表示层,业务层和数据访问层)在同一个项目中维护。虽然逻辑上我们也使用了一些外部扩展服务,如消息服务和数据访问的服务,但最终还是部署在一个应用中

单系统的架构模式,在系统业务庞大的情况下,有很多的不足之处:

1.所有项目都会使用相同的一个代码库,每一个团队成员(UI\前端\程序猿)都会提交维护代码库的内容,当内容逐渐增多,效率就变得低下。

2.如果采取多模块开发模式,模块间相互依赖,极小的改动都会引起其它开发环境同步更新,如果有已上线运行的产品,那么发布也是个很大的工作量。

3.单系统的架构模式,虽然采用了三层架构来区分不同层的责任与任务,但是从实际的操作中来看,难免存在责任交叉,因此某些地方的改动可能会带来其它层的同步变动,失去了分层的独立性。

4.有很多团队分为开发团队和运营支持团队,开发团队只负责开发,在完成后交于运营团队管理,虽然运营团队能很好地处理一些日常问题,但遇到系统危机问题时,也不得不求助于开发团队。

5.当业务逐渐增长,单系统可能被拆解为多个独立的子系统,但系统间是存在一定业务关联的,这时解决基础服务公用的问题就势在必行,需要开发者将通用服务独立发布以便于其它系统调用。

       3.微服务(soa)

基于以上问题,微服务的概念就被提出来了。

微服务的理念就是,将产品或项目分解为众多独立的服务,这些服务独立地部署,并且不依赖于其它服务。

可能有些开发者会想,三层架构的模式本身不就已经分解了么? 这可能是大家对微服务的一个认识误区,微服务不是去垂直分解实现过程,如实现某个服务需要用到的JMS、UI和数据库访问,而是按照功能进行分解。一个完整的功能本身就包含了UI、业务、日志、数据访问等一系列内容。

例如:我们的即将升级课程中的B2C商城平台,包含商品及库存模块、订单模块、支付模块、物流模块、购物车模块、商城站点模块等,那么,我们可以将不同模块分别部署,每个团队可以独立负责各自模块的开发运维与升级。

因此,微服务没有集中的数据库,每个模块都具有自己的存储系统,可能是MySQL,也可能是Redis,技术选型可以根据模块的特点来选择

 

微服务的优势

① 单系统只用一种开发语言,但微服务每个服务独立,每个服务可以看成一个项目,因此每个服务可以选择最合适服务特色的技术开发。

② 开发集中在一个服务,业务和代码量都不大,开发人员能很好地把握代码

③ 服务间进行调用时,可以通过API来进行通讯,如REST(HTTP),也可以使用分布式服务管理框架如Dubbo(rpc) 、SpringCloud(HTTP)等。

 

微服务的问题

因为每个功能都是独立的服务,因此在一个较大的项目中,监测管理这些服务变得复杂,如果某个服务出现故障,那么调试跟踪比单系统更复杂,因为日志分布在不同的系统中,所以调试起来需要花费更多精力,因此,建立统一的日志管理系统可能是目前解决这一问题的最好方案。

       4.系统应用架构演变

随着应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

Dubbo分布式服务_第1张图片

  • 单一应用架构
    • 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
    • 此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
  • 垂直应用架构
    • 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
    • 此时,用于加速前端页面开发的 Web框架(MVC)/三层架构 是关键。
  • 分布式服务架构
    • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
    • 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
  • 流动计算架构 分析用户行为
    • 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。

此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。

二,Dubbo/Dubbox简介

       1.什么是Dubbo/Dubbox

DUBBO是一个分布式服务治理框架,致力于提供高性能和透明化的RPC远程服务调用方案,可以和 Spring框架无缝集成,是阿里巴巴SOA服务化治理方案的核心框架,每天为2000+个服务提供3000000000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点,同时,国内有大量的大型平台都是基于Dubbo的分布式服务治理架构完成服务的分布式访问。

Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

Dubbo主要解决了以下问题:

Dubbo分布式服务_第2张图片

在大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡。

1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。

此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。

并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。

2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。

这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。

3) 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?

为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。

其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。

 

Dubbox

Dubbo开源过后,当当网根据自身的需求,为Dubbo实现了一些新的功能,并将其命名为Dubbox(即Dubbo eXtensions)。

 

主要的新功能包括:

  • 支持REST风格远程调用(HTTP + JSON/XML)

@RequestMapping(value=“/users/{id}”,method=Method.GET)

@ResponseBody

public List findUser(@PathVariable Long id){}

 

@RequestMapping(value=“/users”,,method=Method.POST)

@ResponseBody

public Result addUser(User user){}

 

User

1

xxxx

 

  • 支持基于Kryo和FST的Java高效序列化实现
  • 支持基于嵌入式Tomcat的HTTP remoting体系
  • 升级Spring:将dubbo中Spring由2.x升级到目前最常用的3.x版本,减少项目中版本冲突带来的麻烦。
  • 升级ZooKeeper客户端:将dubbo中的zookeeper客户端升级到最新的版本,以修正老版本中包含的bug。
  • dubbox和dubbo 2.x是兼容的,没有改变dubbo的任何已有的功能和配置方式(除了升级了Spring之类的版本)。

    2.Dubbo核心架构

总体架构

Dubbo分布式服务_第3张图片

Dubbo框架设计一共划分了10个层:

服务接口层(Service)、配置层(Config)、服务代理层(Proxy)、服务注册层(Registry)、集群层(Cluster)、监控层(Monitor)、远程调用层(Protocol)、信息交换层(Exchange)、网络传输层(Transport)和数据序列化层(Serialize)。

而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口。

​​​​​​​    3.Dubbo核心要点

服务定义

服务是围绕服务提供方和服务消费方的,服务提供方实现服务,而服务消费方调用服务。

服务注册

对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。

通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo提供的注册中心有如下几种类型可供选择:

Multicast(多播/组播)注册中心开发测试用Zookeeper注册中心生产环境用官方推荐、Redis注册中心、Simple注册中心

服务监控

无论是服务提供方,还是服务消费方,他们都需要对服务调用的实际状态进行有效的监控,从而改进服务质量。

远程通信与信息交换

远程通信需要指定通信双方所约定的协议,在保证通信双方理解协议语义的基础上,还要保证高效、稳定的消息传输。Dubbo继承了当前主流的网络通信框架,主要包括如下几个:

Mina、Netty、Grizzly

服务调用

Dubbo分布式服务_第4张图片

节点角色说明:

Provider: 暴露服务的服务提供方

Consumer: 调用远程服务的服务消费方。

Registry: 服务注册与发现的注册中心

Monitor: 统计服务的调用次调和调用时间的监控中心

Container: 服务运行容器

调用关系说明:

0. 服务容器负责启动,加载,运行服务提供者。

1. 服务提供者在启动时,向注册中心注册自己提供的服务。

2. 服务消费者在启动时,向注册中心订阅自己所需的服务。

3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

      ​​​​​​​4.Dubbo的获取(官网hello world)

① 官方Maven仓库

阿里巴巴已将Dubbo已发布到Maven中央仓库中:

http://central.maven.org/maven2/com/alibaba/dubbo。

    

        

            com.alibaba

            dubbo

            2.6.2

        

    

 

② dubbox/dubbo2.8.4a(spring4.1.2)(当当网)

最新版dubbox集成spring4提供的扩展版本下载地址:

https://github.com/hutai123/dubbox

Dubbo及Dubbox均是基于Maven进行项目管理与构建,源码包下载后导入eclipse进行编译打包即可将dubbox放入本地仓库。

课件资料中已下载该源码包dubbox-master.zip.

应源码时代课程升级要求,Spring版本已整体升至Spring4,所以需要对dubbox的spring版本进行升级,升级过程需要注意以下问题:

编译打包过程如果出现netty测试错误,请在Maven中使用

mvn clean install -Dmaven.test.skip=true

跳过测试。

资料中有升级编译后的管理中心(dubbo-admin-2.8.4a)

和监控中心(dubbo-monitor-simple-2.8.4a-assembly.tar.gz)部署包

相关的jar包请参考使用老师提供的maven仓库。

三,Dubbo本地服务化实现

 

​​​​​​​1.Dubbo服务化架构包含的内容

对于传统工程而言,分层的依据是按照包来区分,由于在相同的工程中,所以服务的提供和调用可以方便地实现,但是对于分布式服务架构而言,服务的提供者负责服务的具体实现和接口规范,服务的消费者只关心接口规范即可,但无论是服务提供者还是消费者都会涉及到诸如公共工具类、接口、DO、VO等公共代码,因此,一个最简单的DUBBO服务架构模式如下:

Dubbo分布式服务_第5张图片

服务提供者: 提供服务接口的实现,发布服务地址,提供服务。

服务消费者:获取服务地址,使用服务接口调用服务,处理服务调用结果。

公共项目:包含公共配置、DO、VO、工具包等...

 2.​​​​​​​服务提供者实现

项目搭建(Maven项目管理方式):

① 创建公共项目工程:普通的Maven工程,提供utils、DO、接口的代码。

pom.xml 无任何依赖

② 创建服务提供者项目:普通的Maven工程(依赖Dubbo),提供服务实现、服务启动功能。

    pom.xml


				
			com.alibaba
			dubbo
			2.6.2
		
		
			dubbo-api
			dubbo-api
			0.0.1-SNAPSHOT
		
         
    com.github.sgroschupf
    zkclient
    0.1


		

 

	
			junit
			junit
			4.12
			test
		

		
			org.springframework
			spring-test
			4.3.16.RELEASE
		

		
	

dubbo-provider.xml




	
	
	
	
	
	
	
	
	
	

	
	

启动服务监听

String configLocation = "classpath*:/dubbo-provider.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
System.out.println("dubbo-server服务正在监听,按任意键退出");
System.in.read();

​​​​​​​3.服务消费者实现

创建服务消费者项目:普通的Maven工程(依赖Dubbo),完成服务调用功能。

pom.xml


	
			com.alibaba
			dubbo
			2.6.2
		

			dubbo-api
			dubbo-api
			0.0.1-SNAPSHOT
		
   
    com.github.sgroschupf
    zkclient
    0.1

	

dubbo-consumer.xml




	
	
	
	
		
	
	
	
	
	
	

JUnit4调用dubbo服务测试类

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.alibaba.dubbo.config.annotation.Reference;

import cn.itsource.dubbo.core.service.IHelloService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:/dubbo-consumer.xml"})
public class DubboServiceTest {
	@Reference
	private IHelloService helloService;
	
	@Test
	public void testHello(){
String sayHi = helloService.sayHi("老宋");
		System.out.println(sayHi);
	}
}

4.​​​​​​​直连调试模式

服务提供者:

修改注册中心为:N/A模式(不注册)

<dubbo:registry address="N/A" check="false"/> 

服务消费者:

修改注册中心为:N/A模式(不注册)

<dubbo:registry address="N/A" check="false"/>

url 配置属性

<dubbo:reference id="demoService" interface="cn.itsource.dubbo.DemoService"  url="dubbo://localhost:20881" />

 

配置本地调用地址映射:

然后在${user.home}/dubbo-resolve.properties文件中配置对应服务调用的本地地址

${user.home} 一般代表:C:\Users\{你当前登录名}

dubbo-resolve.properties示例

cn.itsource.dubbo.core.service.IUserService=dubbo://localhost:20880

cn.itsource.dubbo.core.service.IHelloService=dubbo://localhost:20880

.....其它服务配置

 

5.Dubbo服务打包

(1)Dubbo服务的运行方式有三种

  1. 使用Servlet容器(不用)

利用Tomcat、Jetty等WEB容器启动Dubbo服务。

缺点:增加管理配置的复杂性,不必要地使用http端口,浪费内存资源

  1. Java的Main方法(不建议,本地调试可以用)

基于Spring框架,写一个Java类并提供Main方法启动。

缺点:无法使用Dubbo的一些高级特性,服务的管理需要自己额外提供实现

  1. Dubbo框架Main方法

Dubbo框架本身提供了服务运行支持方法,基于com.alibaba.dubbo.container.Main

简单高效地运行服务

很好地支持Dubbo服务的发布、关停(ShutdownHook)

​​​​​​​(2)Maven编译打包

Pom.xml 
===================================================
cn.itsource.service
	service-user
	${service-user.version}
	jar
		
	
		UTF-8
	

	
	
		
		provder
		
		
			
				${project.build.directory}/classes
				src/main/resources
				true
				
					**/*.xml
					**/*.properties
				
			
			
			
				${project.build.directory}/classes/META-INF/spring
				src/main/resources
				true
				
					applicationContext.xml
				
			
		
		
		
			
				
				
					org.eclipse.m2e
					lifecycle-mapping
					1.0.0
					
						
							
								
									
										org.apache.maven.plugins
										maven-dependency-plugin
										[2.0,)
										
											copy-dependencies
										
									
									
										
									
								
							
						
					
				
			
		
		
			
			
				org.apache.maven.plugins
				maven-jar-plugin
				
					target/classes/
					
						
							com.alibaba.dubbo.container.Main
							
							false
							true
							lib/
						
						
							.
						
					
				
			
			
				org.apache.maven.plugins
				maven-dependency-plugin
				
					
						copy-dependencies
						package
						
							copy-dependencies
						
						
							jar
							jar
							false
							
								${project.build.directory}/lib
							
						
					
				
			
		

	

	
	

 

3.​​​​​​​dubbo服务jar包运行

Cmd窗口:

① 定位到jar包所在目录

② 输入命令并回车执行:java -jar xxxxx.jar

​​​​​​​四,Dubbo管理控制台

1.​​​​​​​什么是管理控制台

Dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费者进行管理,但 管控台是否正常对 Dubbo 服务没有影响,管控台也不需要高可用,因此可以单节点部署。

控制台主要包含: 提供者、 路由   规则 、 动态配置、  访问控制、  权重调节、  负载均衡、  负责人等管理功能,dubbo admin默认使用消息注册中心类型为:zookeeper。

在实际的项目中非常的有用,尤其是在dubbo服务提供数量逐渐加大的情况下,通过Dubbo管理控制台能够很好的被我们所用,从而让我们更好的使用Dubbo提供的服务。

2.​​​​​​​Dubbo-admin部署及配置

① 解压到任意的目录下。

② 复制一份tomcat作为dubbo管理控制台的服务器,并修改对应的端口和Context信息。

③ 配置WEB-INF下dubbo.properties

注意:dubbo.registry.address的值后面有backup代表是集群模式,建议测试取消,保留单机模式。

dubbo.registry.address=zookeeper://127.0.0.1:2181

    dubbo.admin.root.password=root

dubbo.admin.guest.password=guest

④ 启动管理控制台

bin/startup.bat

⑤ 浏览器访问管理控制台:http://127.0.0.1:端口

默认用户名及密码: root/root  guest/guest

Dubbo分布式服务_第6张图片

五,Dubbo监控中心

​​​​​​​1.什么是监控中心

Dubbo发布代码中,自带了一个简易的监控中心实现。对于一般的小业务这个监控中心应该能够满足需求,对于那些大业务量的大公司一般都会有自己的监控中心,更加丰富的功能如常用的报警短信通知等等。

监控中心负责为服务的监控运维采集各维度的数据,统计各服务的调用次数、时间等,统计先在服务端和消费端内存中汇总,每隔一分钟发送到监控中心服务器,并以报表的形式展现。

    1. 监控中心的作用及特点

监控中心是独立于服务和管理控制台的,在整个dubbo服务治理环节不是必须的,用户可根据实际情况选择性安装。

监控中心如果出现异常(宕机),并不会影响Provider和Consumer之间的服务调用,但会丢失故障期间的监控数据生产环境不会有任何风险

监控中心可以自定义扩展开发,满足一下需求:

① 个性化运维:服务的健康情况、服务压力及性能分析、告警通知

② 扩展接口:com.alibaba.dubbo.monitor.MonitorFactory

             com.alibaba.dubbo.monitor.Monitor

​​​​​​​2.简易监控中心(SimpleMonitor)

SimpleMonitor是官方提供的一个基本功能版本的监控中心,本质上监控中心也是一个标准的dubbo服务。SimpleMonitor采用磁盘存储统计信息,请注意安装机器的磁盘限制,如果要集群,建议用mount共享磁盘结合Dubbo管理控制台可以清晰地看到服务的访问次数、成功次数、失败次数等基本数据。

简易监控中心部署及配置

① 解压到任意文件夹目录。

② 更改conf目录下的配置文件dubbo.properties。

Dubbo分布式服务_第7张图片

③ 启动监控中心

bin/start.bat

④ 查看监控中心服务并访问监控中心

监控中心本身也是一个dubbo服务,因此,如果监控中心成功启动,会在dubbo管理控制中心注册监控服务。

监控中心访问地址:http://localhost:8078

Dubbo分布式服务_第8张图片

⑤ 服务提供者和消费者连接监控中心配置

你可能感兴趣的:(Dubbo分布式服务)