必威体育Betway必威体育官网
当前位置:首页 > IT技术

论传统系统架构模式与Dubbo/Dubbox的区别

时间:2019-10-26 23:15:40来源:IT技术作者:seo实验室小编阅读:77次「手机版」
 

dubbox

传统系统架构

  • 传统应用系统中,我们主要使用了三层架构

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

1:数据访问层:主要是对非原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据库的操作,而不是数据,具体为业务逻辑层或表示层提供数据服务。

2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建

3:界面层:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。

  • 传统系统架构的不足之处

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

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

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

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

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

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

    基于上述问题 引出了新概念微服务

    微服务即为:

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

  • 微服务的优势

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

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

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

存在的问题:

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

解决方案:

建立统一的日志管理系统可能是目前解决这一问题的最好方案。

Dubbo/dubbox

DUBBO是一个分布式服务治理框架,致力于提供高性能和透明化的RPC远程服务调用方案,可以和 spring框架无缝集成,是阿里巴巴SOA服务化治理方案的核心框架.

Dubbox

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

dubbox和dubbo 2.x是兼容的,没有改变dubbo的任何已有的功能和配置方式(除了升级了Spring之类的版本)

  • Dubbo主要解决了以下问题:
  • 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器
  • 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系这时,这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。
  • 服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标

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

  • dubbo的核心要点:

    服务定义

    服务注册

    服务监控

    远程通信与信息交互

    服务调用

  • Dubbo的获取(官网hello world)

    阿里巴巴已将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>

Dubbo管理控制台

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

  • Dubbo-admin部署及配置

    ① 解压 dubbo-admin-2.8.4a.war 到任意的目录下。

    ② 复制一份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-admin作用

    进行查看,禁用、加权等操作

dubbo的监控中心

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

特点:

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

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

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

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

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

com.alibaba.dubbo.monitor.Monitor

监控小结:

监控中心是监控整个dubbo服务运行的健康情况,同时可为dubbo的服务的调用负载提供数据支撑。

dubbo本地服务化实例

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

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

pom.xml 无任何依赖

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

pom.xml

<dependencies>
				<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.2</version>
		</dependency>
		<dependency>
			<groupId>dubbo-api</groupId>
			<artifactId>dubbo-api</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
         <dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
</dependency>

		<!-- junit测试包 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

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

		
	</dependencies>

dubbo-provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

	<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" />
</beans>

启动服务监听器

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

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

    pom.xml

<dependencies>
	<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.2</version>
		</dependency>
<dependency>
			<groupId>dubbo-api</groupId>
			<artifactId>dubbo-api</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
   <dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
</dependency>
	</dependencies>

dubbo-consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd 
	http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context.xsd">

	<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" />
</beans>

MAven编译打包:

Pom.xml

<groupId>cn.itsource.service</groupId>
	<artifactId>service-user</artifactId>
	<version>${service-user.version}</version>
	<packaging>jar</packaging>
		
	<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>

dubbo服务jar包运行

Cmd窗口:

① 定位到jar包所在目录

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

文章最后发布于: 2018-11-06 23:33:54

相关阅读

<br>和<br />得区别

<br>是在以前得写法,那时候没有具体得规范,也可以实现功能。现在规范了标签,加封闭符号。就有了<br/>。虽然说是向下兼容。但是html5

.html()和.text()及.val()的区别

.html()和.text()及.val()的区别 .html() .html():获取集合中第一个匹配元素的HTML内容。这个函数不能用于XML文档。但可以用于

Unix时间戳和Java中的时间戳的区别

前言 最近在使用阿里的日志服务时,遇到了一些Java中Timestamp的坑,所以特意做了了解并整理了一下。在这之前首先得介绍一下Unix时间

cellspacing和cellpadding的区别

cellspacing和cellpadding的区别 1.cellspacing表示各单元格之间的空隙2.cellpadding表示单元格内容与单元格边界之间的距离上代

GUID和UUID、CLSID、IID 区别及联系

本文链接:https://blog.csdn.net/zhongguoren666/article/details/6711396当初微软设计com规范的时候,有两种选择来保证用户的设计

分享到:

栏目导航

推荐阅读

热门阅读