你未了解的dubbo分布式服务框架

本文深入探讨了Dubbo/Dubbox分布式服务框架,包括它们的简介、核心架构、服务注册、监控、远程通信和信息交换。Dubbox提供了REST支持、序列化优化等增强功能。Dubbo的核心架构分为10层,强调服务定义、服务注册和监控。通过注册中心(如Zookeeper)和监控中心实现服务管理和运维。文章还介绍了如何获取和本地部署Dubbo服务,以及使用管理控制台进行服务管理。
摘要由CSDN通过智能技术生成

你未了解的dubbo分布式服务框架

一.Dubbo/Dubbox简介

1.1 DUBBO是一个分布式服务治理框架,致力于提供高性能和透明化的RPC远程服务调用方案,可以和 Spring框架无缝集成,是阿里巴巴SOA服务化治理方案的核心框架,每天为2000+个服务提供3000000000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点,同时,国内有大量的大型平台都是基于Dubbo的分布式服务治理架构完成服务的分布式访问。 Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
1.2Dubbo主要解决了以下问题

  1. 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
  2. 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
  3. 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?
    为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。 其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。
    1.3Dubbox
    Dubbo开源过后,当当网根据自身的需求,为Dubbo实现了一些新的功能,并将其命名为Dubbox(即Dubbo eXtensions)。
    主要的新功能包括:
    1.3.1支持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){}
    1.3.2User

    1
    xxxx

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

1.4Dubbo核心架构

ubbo框架设计一共划分了10个层:服务接口层(Service)、配置层(Config)、服务代理层(Proxy)、服务注册层(Registry)、集群层(Cluster)、监控层(Monitor)、远程调用层(Protocol)、信息交换层(Exchange)、网络传输层(Transport)和数据序列化层(Serialize)。
而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口。

1.5Dubbo核心要点

1.5.1服务定义
服务是围绕服务提供方和服务消费方的,服务提供方实现服务,而服务消费方调用服务。
1.5.2 服务注册
对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。
通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo提供的注册中心有如下几种类型可供选择:
Multicast(多播/组播)注册中心(开发测试用)、Zookeeper注册中心(生产环境用官方推荐)、Redis注册中心、Simple注册中心
1.5.3 服务监控
无论是服务提供方,还是服务消费方,他们都需要对服务调用的实际状态进行有效的监控,从而改进服务质量。
1.5.4 远程通信与信息交换
远程通信需要指定通信双方所约定的协议,在保证通信双方理解协议语义的基础上,还要保证高效、稳定的消息传输。Dubbo继承了当前主流的网络通信框架,主要包括如下几个:
Mina、Netty、Grizzly
1.5.5 服务调用
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。

  1. 服务提供者在启动时,向注册中心注册自己提供的服务。
  2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

1.6Dubbo的获取(官网hello world)

1.6.1官方Maven仓库
阿里巴巴已将Dubbo已发布到Maven中央仓库中:
http://central.maven.org/maven2/com/alibaba/dubbo。

<project>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
    </dependencies>
</project>

1.6.2 dubbox/dubbo2.8.4a(spring4.1.2)(当当网)
最新版dubbox集成spring4提供的扩展版本下载地址:

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

二.Dubbo本地服务化实现

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

2.2.服务提供者实现

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

  1. 创建公共项目工程:普通的Maven工程,提供utils、DO、接口的代码。
    pom.xml 无任何依赖

  2. 创建服务提供者项目:普通的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

     <dependency>
     	<groupId>org.springframework</groupId>
     	<artifactId>spring-test</artifactId>
     	<version>4.3.16.RELEASE</version>
     </dependency>
    

dubbo-provider.xml

<?xml version="1.0" encoding="UTF-8"?>

<dubbo:application name="dubbo-test-provider" owner="sampson"></dubbo:application>

<dubbo:protocol name="dubbo" port="20880" ></dubbo:protocol>

<!-- 局域网广播注册中心 -->
<dubbo:registry address="multicast://239.5.6.7:1234" />

<!-- 配置式发布 -->
<bean id="userService" class="cn.itsource.dubbo.provider.service.UserServiceImpl"></bean>
<dubbo:service interface="cn.itsource.dubbo.core.service.IUserService" ref="userService"></dubbo:service>
<!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
<dubbo:annotation package="cn.itsource.dubbo.provider.service" />
启动服务监听
String configLocation = "classpath*:/dubbo-provider.xml";

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

2.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

<?xml version="1.0" encoding="UTF-8"?>

<dubbo:application name="dubbo-test-consumer"></dubbo:application>

<!-- 局域网广播注册中心 -->
<dubbo:registry address="multicast://239.5.6.7:1234" />
	
<!-- 配置式调用服务 -->
<!-- <dubbo:reference id="helloService" interface="cn.itsource.dubbo.core.service.IHelloService"></dubbo:reference> -->

<!-- 注解式调用服务 -->
<!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
<dubbo:annotation package="cn.itsource.dubbo.consumer" />

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);
	}
}

2.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

2.5.Dubbo服务打包
2.5.1.Dubbo服务的运行方式有三种
1、使用Servlet容器(不用)
利用Tomcat、Jetty等WEB容器启动Dubbo服务。
缺点:增加管理配置的复杂性,不必要地使用http端口,浪费内存资源
2、Java的Main方法(不建议,本地调试可以用)
基于Spring框架,写一个Java类并提供Main方法启动。
缺点:无法使用Dubbo的一些高级特性,服务的管理需要自己额外提供实现
3、Dubbo框架Main方法
Dubbo框架本身提供了服务运行支持方法,基于com.alibaba.dubbo.container.Main
简单高效地运行服务
很好地支持Dubbo服务的发布、关停(ShutdownHook)
2.5.2.Maven编译打包

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

<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<!-- 打包jar详细配置 -->
<build>
	<!-- jar包名字 -->
	<finalName>provder</finalName>
	<!-- 打包资源配置,如配置文件 -->
	<resources>
		<resource>
			<targetPath>${project.build.directory}/classes</targetPath>
			<directory>src/main/resources</directory>
			<filtering>true</filtering>
			<includes>
				<include>**/*.xml</include>
				<include>**/*.properties</include>
			</includes>
		</resource>
		<!-- 结合com.alibaba.dubbo.container.Main 
		官方文档:dubbo会自动在classes/META-INF/spring下去加载spring的配置文件
		因此打包时需要将spring配置文件复制到该目录
		-->
		<resource>
			<targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
			<directory>src/main/resources</directory>
			<filtering>true</filtering>
			<includes>
				<include>applicationContext.xml</include>
			</includes>
		</resource>
	</resources>
	
	<pluginManagement>
		<plugins>
			<!-- 解决Maven插件在Eclipse内执行了一系列的生命周期引起冲突 -->
			<plugin>
				<groupId>org.eclipse.m2e</groupId>
				<artifactId>lifecycle-mapping</artifactId>
				<version>1.0.0</version>
				<configuration>
					<lifecycleMappingMetadata>
						<pluginExecutions>
							<pluginExecution>
								<pluginExecutionFilter>
									<groupId>org.apache.maven.plugins</groupId>
									<artifactId>maven-dependency-plugin</artifactId>
									<versionRange>[2.0,)</versionRange>
									<goals>
										<goal>copy-dependencies</goal>
									</goals>
								</pluginExecutionFilter>
								<action>
									<ignore />
								</action>
							</pluginExecution>
						</pluginExecutions>
					</lifecycleMappingMetadata>
				</configuration>
			</plugin>
		</plugins>
	</pluginManagement>
	<plugins>
		<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<configuration>
				<classesDirectory>target/classes/</classesDirectory>
				<archive>
					<manifest>
						<mainClass>com.alibaba.dubbo.container.Main</mainClass>
						<!-- 重要:打包时 MANIFEST.MF文件不记录的时间戳版本 -->
						<useUniqueVersions>false</useUniqueVersions>
						<addClasspath>true</addClasspath>
						<classpathPrefix>lib/</classpathPrefix>
					</manifest>
					<manifestEntries>
						<Class-Path>.</Class-Path>
					</manifestEntries>
				</archive>
			</configuration>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-dependency-plugin</artifactId>
			<executions>
				<execution>
					<id>copy-dependencies</id>
					<phase>package</phase>
					<goals>
						<goal>copy-dependencies</goal>
					</goals>
					<configuration>
						<type>jar</type>
						<includeTypes>jar</includeTypes>
						<useUniqueVersions>false</useUniqueVersions>
						<outputDirectory>
							${project.build.directory}/lib
						</outputDirectory>
					</configuration>
				</execution>
			</executions>
		</plugin>
	</plugins>

</build>

<dependencies>
</dependencies>

2.5.3.dubbo服务jar包运行
Cmd窗口:
1. 定位到jar包所在目录
2. 输入命令并回车执行:java -jar xxxxx.jar
三.Dubbo管理控制台
3.1.什么是管理控制台
Dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费者进行管理,但 管控台是否正常对 Dubbo 服务没有影响,管控台也不需要高可用,因此可以单节点部署。
控制台主要包含: 提供者、 路由 规则 、 动态配置、 访问控制、 权重调节、 负载均衡、 负责人等管理功能,dubbo admin默认使用消息注册中心类型为:zookeeper。
在实际的项目中非常的有用,尤其是在dubbo服务提供数量逐渐加大的情况下,通过Dubbo管理控制台能够很好的被我们所用,从而让我们更好的使用Dubbo提供的服务。
3.2.Dubbo-admin部署及配置
1.解压到任意的目录下。
2. 复制一份tomcat作为dubbo管理控制台的服务器,并修改对应的端口和Context信息。
3. 配置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
  1. 启动管理控制台
    bin/startup.bat

  2. 浏览器访问管理控制台:http://127.0.0.1:端口
    默认用户名及密码: root/root guest/guest
    四.Dubbo监控中心
    4.1.什么是监控中心
    Dubbo发布代码中,自带了一个简易的监控中心实现。对于一般的小业务这个监控中心应该能够满足需求,对于那些大业务量的大公司一般都会有自己的监控中心,更加丰富的功能如常用的报警短信通知等等。
    监控中心负责为服务的监控运维采集各维度的数据,统计各服务的调用次数、时间等,统计先在服务端和消费端内存中汇总,每隔一分钟发送到监控中心服务器,并以报表的形式展现。
    4.2.监控中心的作用及特点
    监控中心是独立于服务和管理控制台的,在整个dubbo服务治理环节不是必须的,用户可根据实际情况选择性安装。
    监控中心如果出现异常(宕机),并不会影响Provider和Consumer之间的服务调用,但会丢失故障期间的监控数据,再生产环境不会有任何风险。
    监控中心可以自定义扩展开发,满足一下需求:

  3. 个性化运维:服务的健康情况、服务压力及性能分析、告警通知
    2.扩展接口:

    com.alibaba.dubbo.monitor.MonitorFactory
    com.alibaba.dubbo.monitor.Monitor

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

  1. 解压到任意文件夹目录。
  2. 更改conf目录下的配置文件dubbo.properties。
  3. 启动监控中心
    bin/start.bat
  4. 查看监控中心服务并访问监控中心
    监控中心本身也是一个dubbo服务,因此,如果监控中心成功启动,会在dubbo管理控制中心注册监控服务。
    监控中心访问地址:http://localhost:8078
    5.服务提供者和消费者连接监控中心配置

监控中心配置
监控中心协议,如果为protocol=“registry”,表示从注册中心发现监控中心地址,否则直连监控中心
<dubbo:monitor protocol=“registry”/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值