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/>。虽然说是向下兼容。但是html5
.html()和.text()及.val()的区别 .html() .html():获取集合中第一个匹配元素的HTML内容。这个函数不能用于XML文档。但可以用于
前言 最近在使用阿里的日志服务时,遇到了一些Java中Timestamp的坑,所以特意做了了解并整理了一下。在这之前首先得介绍一下Unix时间
cellspacing和cellpadding的区别 1.cellspacing表示各单元格之间的空隙2.cellpadding表示单元格内容与单元格边界之间的距离上代
本文链接:https://blog.csdn.net/zhongguoren666/article/details/6711396当初微软设计com规范的时候,有两种选择来保证用户的设计