关于分布式服务框架Dubbo的调研报告
Dubbo架构分析文档

SOA服务化架构1.1.传统架构传统架构图存在的问题:1、功能耦合度高2、系统维护成本高3、如果并发量大,无法解决高并发的问题体统架构负载均衡传统架构负载均衡图存在的问题:1、系统无法有效进行水平扩展(集群不能针对功能模块)2、用户存在重复登录的问题,需要session共享来解决,是以session广播的形式,比较消耗资源,宽带如果要达到10000并发需要20台服务器做tomcat集群。
当tomcat集群中节点数量增加,服务能力先增加后下降。
3、所以集群中节点数量不能太多,一般也就5个左右。
1.2.分布式架构分布式架构图集群:相当于同一个工程代码拷贝多份部署到多台服务器,每台服务器单独独立部署运行。
分布式架构:把系统按照模块拆分成多个子系统;多个子系统相互协作才能完成业务流程系统之间需要进行通信。
优点:1、把模块拆分,使用接口通信,降低模块之间的耦合度。
2、把项目拆分成若干个子项目,不同的团队负责不同的子项目。
3、增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。
4、可以灵活的进行分布式部署。
缺点:1、系统之间交互需要使用远程通信,需要开发接口,增加工作量。
2、各个模块有一些通用的业务逻辑无法公用。
1.3.基于SOA架构SOA:Service Oriented Architecture面向服务的架构。
也就是把工程都拆分成服务层工程、表现层工程。
服务层中包含业务逻辑,只需要对外提供服务即可。
表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
工程都可以独立部署。
SOA机构图1.4.L ESSO基于SOA架构架构说明:整个架构基于Spring、SpringMVC、MyBatis、RESful分布式敏捷开发系统架构,提供整套公共的微服务模块:日志分析、配置中心、文件服务、内容服务、消息服务等。
业务系统根据自身的业务需要进行开发服务API并结合公共服务进行拓展。
建立统一的权限管理服务(UPMS)确保入口统一。
技术架构方案

技术架构方案第1篇技术架构方案一、背景随着信息化建设的不断深入,我国各行业对技术架构的需求日益增长。
为满足业务发展需求,提高系统稳定性、安全性和可扩展性,本项目将围绕业务目标,结合现有技术资源,制定一套合法合规的技术架构方案。
二、目标1. 满足业务需求,提高系统性能和用户体验。
2. 确保系统稳定、安全、可扩展,降低运维成本。
3. 合法合规,遵循国家和行业标准。
4. 提高开发效率,降低开发成本。
三、技术选型1. 开发语言与框架- 后端:采用Java语言,Spring Boot框架进行开发。
- 前端:采用Vue.js框架,Element UI组件库进行开发。
2. 数据库- 关系型数据库:采用MySQL数据库。
- 非关系型数据库:采用Redis数据库。
3. 中间件- 消息队列:采用RabbitMQ。
- 分布式缓存:采用Redis。
- 分布式服务框架:采用Dubbo。
4. 容器技术- 采用Docker容器技术,实现应用轻量化部署。
5. 云计算- 采用阿里云服务,包括但不限于ECS、RDS、OSS等。
四、系统架构1. 整体架构本方案采用前后端分离的架构模式,后端负责数据处理,前端负责界面展示。
系统架构分为以下几个层次:- 用户层:提供用户操作界面,包括Web端和移动端。
- 前端层:负责接收用户请求,与后端进行数据交互,展示数据。
- 后端层:负责处理业务逻辑,提供数据接口。
- 数据库层:存储系统数据。
- 中间件层:提供消息队列、缓存、分布式服务等支持。
2. 网络架构采用分布式部署,网络架构分为以下三个部分:- 用户访问网络:用户通过互联网访问系统。
- 内部业务网络:内部服务器、数据库、中间件等设备互联。
- 管理网络:用于系统运维管理。
3. 安全架构遵循国家相关法律法规,建立完善的安全架构:- 身份认证:采用用户名密码、手机验证码等方式进行身份认证。
- 权限控制:实现用户、角色、菜单等多维度的权限控制。
- 数据加密:采用SSL加密技术,保证数据传输安全。
grpc dubbo webservice 简书

高性能RPC框架的比较与分析一、介绍随着互联网技术的快速发展,大量的分布式系统被应用在各个领域,而RPC框架作为分布式系统中最核心的基础设施之一,也变得越来越重要。
在选择合适的RPC框架时,性能是一个至关重要的指标。
目前市面上有很多优秀的RPC框架,其中grpc、dubbo和webservice 都是较为知名的。
在本文中,将对这三种RPC框架进行比较与分析,从而为大家选择合适的RPC框架提供一些建议。
二、 grpc1. 简介grpc是由Google开发的高性能、跨语言的RPC框架,基于HTTP/2协议,支持多种语言,包括Java、C++、Python等。
grpc的特点是高效、高性能,适用于大规模系统的微服务架构。
2. 特点(1)性能高:grpc基于HTTP/2协议,支持双向流、流控、多路复用等特性,因此具有很高的性能。
(2)丰富的功能:grpc提供了丰富的功能,例如流式处理、拦截器、认证等,使得开发者可以很方便地实现各种复杂的业务逻辑。
3. 使用场景grpc适用于大规模的分布式系统,特别是微服务架构的场景。
由于其高性能及丰富的功能特性,grpc在大型公司或者互联网企业中得到了广泛的应用。
三、 dubbo1. 简介dubbo是阿里巴巴开源的高性能、轻量级的RPC框架,支持多种协议,包括dubbo协议、rmi协议、hessian协议等,能够适配各种情况下的RPC调用。
2. 特点(1)轻量级:dubbo是一个轻量级的RPC框架,核心功能简单、易用。
(2)丰富的生态圈:dubbo生态圈非常丰富,社区活跃度高,有着大量的插件和扩展,能够满足各种不同的需求。
3. 使用场景dubbo适用于各种规模的分布式系统,特别是中小型公司或者初创企业。
由于其轻量级及丰富的生态圈,dubbo在国内得到了广泛的应用。
四、 webservice1. 简介webservice是一种基于XML、SOAP和HTTP等协议的轻量级网络服务协议,能够在不同评台和语言之间进行通信。
系统架构改造申请

系统架构改造申请尊敬的领导:您好!随着公司业务的不断发展和用户需求的日益增长,我们现有的系统架构在性能、可扩展性和稳定性等方面逐渐暴露出一些问题。
为了更好地支持公司的业务发展,提高系统的运行效率和服务质量,我特此向您提出系统架构改造的申请。
一、现有系统架构的问题1、性能瓶颈目前,系统在处理高并发请求时,响应时间明显延长,尤其是在业务高峰期,如每月的结算日和促销活动期间,系统经常出现卡顿甚至崩溃的情况,严重影响了用户体验和业务的正常开展。
经过分析,我们发现数据库的读写操作是主要的性能瓶颈,大量的查询和更新操作导致数据库服务器负载过高。
2、可扩展性不足随着业务的不断拓展,我们需要频繁地添加新的功能和模块。
然而,现有的系统架构在设计上缺乏灵活性,使得新功能的集成变得困难且耗时。
每次添加新功能都需要对现有代码进行大规模的修改,这不仅增加了开发成本,还引入了更多的风险。
3、稳定性问题系统在运行过程中经常出现一些不可预测的故障,如内存泄漏、线程死锁等。
这些故障虽然可以通过临时的修复措施解决,但从根本上影响了系统的稳定性。
而且,由于系统架构的复杂性,故障排查和修复的难度较大,往往需要花费大量的时间和精力。
二、系统架构改造的目标1、提高系统性能通过优化数据库设计、引入缓存机制、采用分布式架构等手段,提高系统的并发处理能力,将响应时间缩短至合理范围内,确保系统在高负载情况下依然能够稳定运行。
2、增强可扩展性采用微服务架构,将系统拆分成多个独立的服务模块,每个模块可以独立开发、部署和扩展。
这样可以大大提高新功能的集成效率,降低系统的维护成本。
3、提高系统稳定性建立完善的监控体系,实时监测系统的运行状态,及时发现并解决潜在的问题。
同时,加强代码质量控制,引入自动化测试和代码审查机制,提高系统的可靠性。
三、系统架构改造的方案1、技术选型(1)数据库方面,考虑将现有的关系型数据库替换为更适合高并发场景的 NoSQL 数据库,如 MongoDB 或 Redis。
农业信息化服务平台建设方案

农业信息化服务平台建设方案第一章引言 (3)1.1 项目背景 (3)1.1.1 国际背景 (3)1.1.2 国内背景 (3)1.2 项目目标 (3)1.2.1 建立完善的农业信息化服务平台 (3)1.2.2 提高农业生产效率 (3)1.2.3 促进农业产业升级 (3)1.3 研究方法 (3)1.3.1 文献调研 (3)1.3.2 实证分析 (4)1.3.3 模型构建 (4)1.3.4 问卷调查与访谈 (4)第二章农业信息化服务平台概述 (4)2.1 农业信息化服务平台的定义 (4)2.2 农业信息化服务平台的功能 (4)2.3 农业信息化服务平台的建设原则 (5)第三章需求分析 (5)3.1 农业生产需求 (5)3.2 农业市场需求 (5)3.3 农业政策需求 (6)第四章技术选型与架构设计 (6)4.1 技术选型 (6)4.1.1 开发语言及框架 (6)4.1.2 数据库技术 (6)4.1.3 分布式技术 (7)4.1.4 前后端分离技术 (7)4.2 系统架构设计 (7)4.2.1 整体架构 (7)4.2.2 数据源层 (7)4.2.3 数据处理层 (7)4.2.4 服务层 (7)4.2.5 前端展示层 (7)4.3 关键技术研究 (7)4.3.1 数据清洗技术 (8)4.3.2 数据挖掘技术 (8)4.3.3 分布式存储技术 (8)4.3.4 前后端分离技术 (8)第五章平台功能模块设计 (8)5.1 数据采集模块 (8)5.2 数据处理与分析模块 (8)5.3 决策支持模块 (9)5.4 信息发布与互动模块 (9)第六章平台开发与实现 (9)6.1 系统开发流程 (9)6.1.1 需求分析 (10)6.1.2 系统设计 (10)6.1.3 系统开发 (10)6.1.4 系统集成与调试 (10)6.1.5 系统部署与运维 (10)6.2 系统开发工具与平台 (10)6.2.1 开发工具 (10)6.2.2 开发平台 (11)6.3 系统测试与优化 (11)6.3.1 功能测试 (11)6.3.2 功能测试 (11)6.3.3 安全测试 (11)6.3.4 系统优化 (11)第七章平台运营与管理 (11)7.1 运营策略 (11)7.2 管理机制 (12)7.3 服务质量评价 (12)第八章平台推广与应用 (12)8.1 推广策略 (13)8.1.1 宣传推广 (13)8.1.2 合作推广 (13)8.1.3 激励推广 (13)8.2 应用场景 (13)8.2.1 农业生产管理 (13)8.2.2 农业市场交易 (13)8.2.3 农业金融服务 (13)8.2.4 农业培训与教育 (13)8.3 效益分析 (14)8.3.1 经济效益 (14)8.3.2 社会效益 (14)8.3.3 生态效益 (14)第九章项目风险与应对措施 (14)9.1 技术风险 (14)9.2 市场风险 (14)9.3 政策风险 (15)第十章总结与展望 (15)10.1 项目总结 (15)10.2 未来展望 (16)10.3 政策建议 (16)第一章引言我国农业现代化进程的加速,信息化技术在农业生产中的应用日益广泛,农业信息化服务平台的建设成为推动农业现代化的重要手段。
Dubbo架构深入篇----RPC实现总结

Dubbo架构深⼊篇----RPC实现总结最近我拜读了mindwind的⼀⽚博客⽂章,希望通过Dubbo深⼊学习RPC架构设计,在此结合RPC架构的原理,解析Dubbo是如何实现RPC 架构的。
RPC架构模型RPC架构的主要⽬的是在构建分布式系统时,调⽤远程⽅法就如同调⽤本地⽅法⼀样⽅便快捷,简化开发,提⾼效率。
我们看看下⾯这张图,了解⼀下RPC架构的主要组成部分及调⽤关系:以上图⽚引⾃mindfloating的博客上图左侧是调⽤者,右侧是⽅法提供端。
我们分别解释⼀下上图的各模块的职责:从左侧开始,Caller是调⽤者;RpcClient是Rpc协议定义的客户端,包括远程接⼝的地址列表及调⽤⽅式的信息等,Caller导⼊RpcClient;RemoteAPI表⽰远程接⼝;RpcProxy是⼀个对远程⽅法调⽤的代理组件,封装了远程过程调⽤的细节,可以包括加载地址列表,寻址,调⽤集群模块实现负载均衡、⾼可⽤,查找调⽤信息,调⽤RpcInvoker等;RpcInvoker是具体的RemoteAPI的调⽤者封装对象,它包含了⼀个具体接⼝⽅法的地址、调⽤⽅式等信息,并提供了调⽤处理⽅法;RpcConnector负责封装实现⽹络通信细节,如建⽴会话通道,发送数据请求和接收返回值数据;RpcProtocol是Rpc协议规范,定义了数据序列化和反序列化⽅法,如何解析地址信息等细节。
右侧为接⼝服务端,RpcAcceptor类似RpcConnector,封装实现⽹络通信细节,接收请求数据,发送本地接⼝处理后的返回值给客户端;RpcProcessor负责线程池管理,发起本地⽅法调⽤等;服务端RpcInvoker是本地API的调⽤者,通过反射技术调⽤指定接⼝的⽅法;Callee 是服务端的本地接⼝类,导出RPC服务为RpcServer,客户端Caller将其作为RpcClient导⼊.我们按照以上RPC的调⽤流程和各组件职责,聊⼀聊Dubbo是如何实现的。
dubbo泛化调用返回结果类型

dubbo泛化调用返回结果类型1.引言1.1 概述Dubbo是一种基于Java语言的高性能、轻量级的RPC框架,它主要用于分布式应用程序的服务化治理。
在Dubbo中,泛化调用是一种特殊的调用方式,它允许消费端能够在不依赖具体服务接口类的情况下,对服务进行调用并获取返回结果。
泛化调用是Dubbo中非常重要且实用的功能之一。
它的出现主要是为了解决一些特殊场景下的问题,比如在服务消费端并没有服务接口类的情况下仍然能够对服务进行调用。
一方面,这样的设计可以降低服务使用的依赖性,提高代码的灵活性和可维护性;另一方面,它也为一些动态创建服务代理等特殊应用场景提供了可能。
在泛化调用中,消费端可以通过传递方法名、参数类型和参数值来调用服务,而无需依赖具体的服务接口类。
这种方式下,服务提供端会根据消费端发送的请求信息来执行对应的服务,并将执行结果返回给消费端。
通过泛化调用,我们可以灵活地根据实际需求来调用服务,甚至在接口定义发生变化时,也无须修改消费端的代码。
然而,泛化调用也有其局限性。
由于泛化调用是基于反射实现的,在性能上相较于普通的接口调用会有一定的损耗。
此外,由于消费端无法通过静态类型检查来保证调用的正确性,因此在使用泛化调用时需要特别小心避免出现调用错误的情况。
综上所述,Dubbo的泛化调用是一种非常灵活且实用的功能,它允许消费端在不依赖具体服务接口的情况下调用服务并获取结果。
然而,泛化调用也存在一些性能损耗和使用上的注意事项。
在使用泛化调用时,我们需要根据具体场景和需求来权衡使用的利弊,并注意避免潜在的调用错误。
1.2 文章结构文章结构本文主要分为引言、正文和结论三个部分。
引言部分包括概述、文章结构和目的三个小节。
概述部分简要介绍了Dubbo泛化调用返回结果类型的问题,引起读者的兴趣。
文章结构部分则详细说明了本文的组织架构和各个小节的内容。
目的部分介绍了本文的写作目标,帮助读者更好地理解本文的价值和重要性。
分布式服务框架dubbodubbox入门示例

分布式服务框架dubbodubbox⼊门⽰例dubbo是⼀个分布式的服务架构,可直接⽤于⽣产环境作为SOA服务框架。
淘宝将这个项⽬开源出来以后,得到了不少同⾏的⽀持,包括:不管如何,能在阿⾥、当当、京东这些⼤型⽹站正式使⽤的框架,总不⾄于差到哪⾥去。
本⽂下⾯的⽰例均基于当当的dubbox版本,由于dubbox并没向maven提交编译后的jar包,所以只能从github clone代码到本地编译得到jar 包。
编译及测试步骤:(以下步骤全在windows环境中完成)1.本机先安装github on Windows的客户端,将在path路径中,把git.exe加进去3. mvn install -Dmaven.test.skip=true 跳过测试编译4.在本机,参考zoo.cfg如下:tickTime=2000initLimit=10syncLimit=5dataDir=D:/java/zookeeper-3.4.6/datadataLogDir=D:/java/zookeeper-3.4.6/logclientPort=2181server.1=localhost:2287:3387然后输⼊ bin/zkServer.cmd 启⽤zookeeper5. intellij Idea中导⼊源码6.运⾏ \dubbox\dubbo-demo\dubbo-demo-provider\src\test\java\com\alibaba\dubbo\demo\provider\DemoProvider.java把服务提供⽅跑起来,成功后,可以在ZK⾥,⽤ ls / 看下,会发现zk⾥多出了⼀个dubbo的节点,所有服务全注册在这⾥了7.运⾏\dubbox\dubbo-demo\dubbo-demo-consumer\src\test\java\com\alibaba\dubbo\demo\consumer\DemoConsumer.java服务消费⽅调⽤测试,可以看console⾥的输出8.运⾏\dubbox\dubbo-demo\dubbo-demo-consumer\src\test\java\com\alibaba\dubbo\demo\consumer\RestClient.java跑⼀下rest调⽤dubbox官⽅的⽰例,虽然已经很简单了,但是对于初次接触的⼈来讲,仍然略显复杂,下⾯的代码在其基础上简化了⼀下:⼀、先定义服务接⼝及传输对象DTO项⽬结构如下代码:User.javapackage yjmyzz.dubbo.demo.api;import org.codehaus.jackson.annotate.JsonProperty;import javax.validation.constraints.Min;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import java.io.Serializable;@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)public class User implements Serializable {@NotNull@Min(1L)private Long id;@JsonProperty("username")@XmlElement(name = "username")@NotNull@Size(min = 6, max = 50)private String name;public User() {}public User(Long id, String name) {this.id = id; = name;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}@Overridepublic String toString() {return "User (" +"id=" + id +", name='" + name + '\'' +')';}}UserService.javapackage yjmyzz.dubbo.demo.api;public interface UserService {User getUser(Long id);}UserRestService.javapackage yjmyzz.dubbo.demo.api;import javax.validation.constraints.Min;public interface UserRestService {User getUser(@Min(value = 1L, message = "User ID must be greater than 1") Long id);}pom.xml1<?xml version="1.0" encoding="UTF-8"?>2<project xmlns="/POM/4.0.0"3 xmlns:xsi="/2001/XMLSchema-instance"4 xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"> 56<modelVersion>4.0.0</modelVersion>78<groupId>blogs.yjmyzz</groupId>9<artifactId>dubbo-hello-api</artifactId>10<version>0.1</version>1112<dependencies>1314<dependency>15<groupId>com.alibaba</groupId>16<artifactId>dubbo</artifactId>17<version>2.8.4</version>18</dependency>1920<dependency>21<groupId>javax.validation</groupId>22<artifactId>validation-api</artifactId>23<version>1.0.0.GA</version>24</dependency>2526<dependency>27<groupId>javax.annotation</groupId>28<artifactId>javax.annotation-api</artifactId>29<version>1.2</version>30</dependency>3132<dependency>33<groupId>org.codehaus.jackson</groupId>34<artifactId>jackson-mapper-asl</artifactId>35<version>1.9.12</version>36</dependency>3738</dependencies>39</project>View Code⼆、定义服务⽣产者(即:服务接⼝的实现⽅)UserServiceImpl.javapackage yjmyzz.dubbo.demo.provider;import er;import erService;public class UserServiceImpl implements UserService {public User getUser(Long id) {return new User(id, "username" + id);}}UserRestServiceImpl.javapackage yjmyzz.dubbo.demo.provider;import com.alibaba.dubbo.rpc.RpcContext;import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;import er;import erRestService;import erService;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.ws.rs.*;import javax.ws.rs.core.MediaType;@Path("users")@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})@Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})public class UserRestServiceImpl implements UserRestService {private UserService userService;public void setUserService(UserService userService) {erService = userService;}@GET@Path("{id : \\d+}")public User getUser(@PathParam("id") Long id) {if (RpcContext.getContext().getRequest(HttpServletRequest.class) != null) {System.out.println("Client IP address from RpcContext: " + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr()); }if (RpcContext.getContext().getResponse(HttpServletResponse.class) != null) {System.out.println("Response object from RpcContext: " + RpcContext.getContext().getResponse(HttpServletResponse.class));}return userService.getUser(id);}}DemoProvider.javapackage yjmyzz.dubbo.demo.provider;import org.springframework.context.support.ClassPathXmlApplicationContext;import java.io.IOException;public class DemoProvider {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/*.xml");context.start();System.out.println("服务已经启动...");System.in.read();}}配置⽂件:resources\META-INF\spring\dubbo-demo-provider.xml1<?xml version="1.0" encoding="UTF-8"?>23<beans xmlns="/schema/beans"4 xmlns:xsi="/2001/XMLSchema-instance"5 xmlns:dubbo="/schema/dubbo"6 xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.5.xsd7 /schema/dubbo /schema/dubbo/dubbo.xsd">89<dubbo:application name="demo-provider" owner="programmer" organization="dubbox"/>1011<dubbo:registry address="zookeeper://127.0.0.1:2181"/>1213<dubbo:protocol name="dubbo" serialization="kryo" optimizer="yjmyzz.dubbo.demo.api.SerializationOptimizerImpl"/>1415<!-- use tomcat server -->16<dubbo:protocol name="rest" port="8888" threads="500" contextpath="services" server="tomcat" accepts="500"17 extension="com.alibaba.dubbo.rpc.protocol.rest.support.LoggingFilter"/>181920<dubbo:service interface="erService" ref="userService" protocol="dubbo"/>2122<dubbo:service interface="erRestService" ref="userRestService" protocol="rest" validation="true"/>2324<bean id="userService" class="erServiceImpl"/>2526<bean id="userRestService" class="erRestServiceImpl">27<property name="userService" ref="userService"/>28</bean>293031</beans>View Codepom.xml1<?xml version="1.0" encoding="UTF-8"?>2<project xmlns="/POM/4.0.0"3 xmlns:xsi="/2001/XMLSchema-instance"4 xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">56<modelVersion>4.0.0</modelVersion>78<groupId>blogs.yjmyzz</groupId>9<artifactId>dubbo-hello-provider</artifactId>10<version>0.1</version>1112<dependencies>1314<!--公⽤的服务接⼝-->15<dependency>16<groupId>blogs.yjmyzz</groupId>17<artifactId>dubbo-hello-api</artifactId>18<version>0.1</version>19</dependency>2021<dependency>22<groupId>com.alibaba</groupId>23<artifactId>dubbo</artifactId>24<version>2.8.4</version>25</dependency>2627<dependency>28<groupId>org.javassist</groupId>29<artifactId>javassist</artifactId>30<version>3.15.0-GA</version>31</dependency>3233<dependency>34<groupId>org.apache.mina</groupId>35<artifactId>mina-core</artifactId>36<version>1.1.7</version>41<artifactId>grizzly-core</artifactId>42<version>2.1.4</version>43</dependency>4445<dependency>46<groupId>org.apache.httpcomponents</groupId> 47<artifactId>httpclient</artifactId>48<version>4.2.1</version>49</dependency>5051<dependency>52<groupId>com.alibaba</groupId>53<artifactId>fastjson</artifactId>54<version>1.1.39</version>55</dependency>5657<dependency>58<groupId>com.thoughtworks.xstream</groupId>59<artifactId>xstream</artifactId>60<version>1.4.1</version>61</dependency>6263<dependency>64<groupId>org.apache.bsf</groupId>65<artifactId>bsf-api</artifactId>66<version>3.1</version>67</dependency>6869<dependency>70<groupId>org.apache.zookeeper</groupId>71<artifactId>zookeeper</artifactId>72<version>3.4.6</version>73</dependency>7475<dependency>76<groupId>com.github.sgroschupf</groupId>77<artifactId>zkclient</artifactId>78<version>0.1</version>79</dependency>8081<dependency>82<groupId>org.apache.curator</groupId>83<artifactId>curator-framework</artifactId>84<version>2.5.0</version>85</dependency>8687<dependency>88<groupId>com.googlecode.xmemcached</groupId> 89<artifactId>xmemcached</artifactId>90<version>1.3.6</version>91</dependency>9293<dependency>94<groupId>org.apache.cxf</groupId>95<artifactId>cxf-rt-frontend-simple</artifactId>96<version>2.6.1</version>97</dependency>9899<dependency>100<groupId>org.apache.cxf</groupId>101<artifactId>cxf-rt-transports-http</artifactId>102<version>2.6.1</version>103</dependency>104105<dependency>106<groupId>org.apache.thrift</groupId>107<artifactId>libthrift</artifactId>108<version>0.8.0</version>109</dependency>110111<dependency>112<groupId>com.caucho</groupId>113<artifactId>hessian</artifactId>114<version>4.0.7</version>115</dependency>116117<dependency>118<groupId>javax.servlet</groupId>119<artifactId>javax.servlet-api</artifactId>120<version>3.1.0</version>125<artifactId>jetty</artifactId>126<version>6.1.26</version>127<exclusions>128<exclusion>129<groupId>org.mortbay.jetty</groupId>130<artifactId>servlet-api</artifactId>131</exclusion>132</exclusions>133</dependency>134135<dependency>136<groupId>log4j</groupId>137<artifactId>log4j</artifactId>138<version>1.2.16</version>139</dependency>140141<dependency>142<groupId>org.slf4j</groupId>143<artifactId>slf4j-api</artifactId>144<version>1.6.2</version>145</dependency>146147<dependency>148<groupId>redis.clients</groupId>149<artifactId>jedis</artifactId>150<version>2.1.0</version>151</dependency>152153<dependency>154<groupId>javax.validation</groupId>155<artifactId>validation-api</artifactId>156<version>1.0.0.GA</version>157</dependency>158159<dependency>160<groupId>org.hibernate</groupId>161<artifactId>hibernate-validator</artifactId>162<version>4.2.0.Final</version>163</dependency>164165<dependency>166<groupId>javax.cache</groupId>167<artifactId>cache-api</artifactId>168<version>0.4</version>169</dependency>170171<dependency>172<groupId>org.jboss.resteasy</groupId>173<artifactId>resteasy-jaxrs</artifactId>174<version>3.0.7.Final</version>175</dependency>176177<dependency>178<groupId>org.jboss.resteasy</groupId>179<artifactId>resteasy-client</artifactId>180<version>3.0.7.Final</version>181</dependency>182183<dependency>184<groupId>org.jboss.resteasy</groupId>185<artifactId>resteasy-netty</artifactId>186<version>3.0.7.Final</version>187</dependency>188189<dependency>190<groupId>org.jboss.resteasy</groupId>191<artifactId>resteasy-jdk-http</artifactId>192<version>3.0.7.Final</version>193</dependency>194195<dependency>196<groupId>org.jboss.resteasy</groupId>197<artifactId>resteasy-jackson-provider</artifactId> 198<version>3.0.7.Final</version>199</dependency>200201<dependency>202<groupId>org.jboss.resteasy</groupId>203<artifactId>resteasy-jaxb-provider</artifactId> 204<version>3.0.7.Final</version>208<groupId>org.apache.tomcat.embed</groupId>209<artifactId>tomcat-embed-core</artifactId>210<version>8.0.11</version>211</dependency>212213<dependency>214<groupId>org.apache.tomcat.embed</groupId>215<artifactId>tomcat-embed-logging-juli</artifactId>216<version>8.0.11</version>217</dependency>218219<dependency>220<groupId>com.esotericsoftware.kryo</groupId>221<artifactId>kryo</artifactId>222<version>2.24.0</version>223</dependency>224225<dependency>226<groupId>de.javakaffee</groupId>227<artifactId>kryo-serializers</artifactId>228<version>0.26</version>229</dependency>230231<dependency>232<groupId>de.ruedigermoeller</groupId>233<artifactId>fst</artifactId>234<version>1.55</version>235</dependency>236237</dependencies>238239240</project>View Code测试时,运⾏DemoProvider中的main⽅法即可启动服务,所有服务注册在ZooKeeper,层次结构类似下⾯这样:/dubbo/dubbo/erRestService/dubbo/erRestService/providers/dubbo/erRestService/configurators/dubbo/erService/dubbo/erService/providers/dubbo/erService/configurators三、服务消费⽅DemoConsumer.javapackage yjmyzz.dubbo.demo.consumer;import org.springframework.context.support.ClassPathXmlApplicationContext;import erService;import javax.ws.rs.client.Client;import javax.ws.rs.client.ClientBuilder;import javax.ws.rs.client.WebTarget;import javax.ws.rs.core.Response;public class DemoConsumer {public static void main(String[] args) {final String port = "8888";//测试Rest服务getUser("http://localhost:" + port + "/services/users/1.json");getUser("http://localhost:" + port + "/services/users/1.xml");//测试常规服务ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/*.xml");context.start();UserService userService = context.getBean(UserService.class);System.out.println(userService.getUser(1L));}private static void getUser(String url) {System.out.println("Getting user via " + url);Client client = ClientBuilder.newClient();WebTarget target = client.target(url);Response response = target.request().get();try {if (response.getStatus() != 200) {throw new RuntimeException("Failed with HTTP error code : " + response.getStatus());}System.out.println("Successfully got result: " + response.readEntity(String.class));} finally {response.close();client.close();}}}配置⽂件:resources\META-INF\spring\dubbo-hello-consumer.xml1<?xml version="1.0" encoding="UTF-8"?>2<beans xmlns="/schema/beans"3 xmlns:xsi="/2001/XMLSchema-instance"4 xmlns:dubbo="/schema/dubbo"5 xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.5.xsd6 /schema/dubbo /schema/dubbo/dubbo.xsd">78<dubbo:application name="demo-consumer" owner="programmer" organization="dubbox"/>910<dubbo:registry address="zookeeper://127.0.0.1:2181"/>1112<dubbo:reference id="userRestService" interface="erRestService"/>1314<dubbo:reference id="userService" interface="erService"/>1516</beans>View Codepom.xml1<?xml version="1.0" encoding="UTF-8"?>2<project xmlns="/POM/4.0.0"3 xmlns:xsi="/2001/XMLSchema-instance"4 xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">56<modelVersion>4.0.0</modelVersion>78<groupId>blogs.yjmyzz</groupId>9<artifactId>dubbo-hello-consumer</artifactId>10<version>0.1</version>111213<dependencies>14<!--公⽤的服务接⼝-->15<dependency>16<groupId>blogs.yjmyzz</groupId>17<artifactId>dubbo-hello-api</artifactId>18<version>0.1</version>19</dependency>202122<dependency>23<groupId>com.alibaba</groupId>24<artifactId>dubbo</artifactId>25<version>2.8.4</version>26</dependency>2728<dependency>29<groupId>org.javassist</groupId>30<artifactId>javassist</artifactId>31<version>3.15.0-GA</version>32</dependency>3334<dependency>35<groupId>org.apache.mina</groupId>36<artifactId>mina-core</artifactId>37<version>1.1.7</version>38</dependency>3940<dependency>41<groupId>org.glassfish.grizzly</groupId>42<artifactId>grizzly-core</artifactId>4546<dependency>47<groupId>org.apache.httpcomponents</groupId> 48<artifactId>httpclient</artifactId>49<version>4.2.1</version>50</dependency>5152<dependency>53<groupId>com.alibaba</groupId>54<artifactId>fastjson</artifactId>55<version>1.1.39</version>56</dependency>5758<dependency>59<groupId>com.thoughtworks.xstream</groupId>60<artifactId>xstream</artifactId>61<version>1.4.1</version>62</dependency>6364<dependency>65<groupId>org.apache.bsf</groupId>66<artifactId>bsf-api</artifactId>67<version>3.1</version>68</dependency>6970<dependency>71<groupId>org.apache.zookeeper</groupId>72<artifactId>zookeeper</artifactId>73<version>3.4.6</version>74</dependency>7576<dependency>77<groupId>com.github.sgroschupf</groupId>78<artifactId>zkclient</artifactId>79<version>0.1</version>80</dependency>8182<dependency>83<groupId>org.apache.curator</groupId>84<artifactId>curator-framework</artifactId>85<version>2.5.0</version>86</dependency>8788<dependency>89<groupId>com.googlecode.xmemcached</groupId> 90<artifactId>xmemcached</artifactId>91<version>1.3.6</version>92</dependency>9394<dependency>95<groupId>org.apache.cxf</groupId>96<artifactId>cxf-rt-frontend-simple</artifactId>97<version>2.6.1</version>98</dependency>99100<dependency>101<groupId>org.apache.cxf</groupId>102<artifactId>cxf-rt-transports-http</artifactId>103<version>2.6.1</version>104</dependency>105106<dependency>107<groupId>org.apache.thrift</groupId>108<artifactId>libthrift</artifactId>109<version>0.8.0</version>110</dependency>111112<dependency>113<groupId>com.caucho</groupId>114<artifactId>hessian</artifactId>115<version>4.0.7</version>116</dependency>117118<dependency>119<groupId>javax.servlet</groupId>120<artifactId>javax.servlet-api</artifactId>121<version>3.1.0</version>122</dependency>123124<dependency>125<groupId>org.mortbay.jetty</groupId>126<artifactId>jetty</artifactId>129<exclusion>130<groupId>org.mortbay.jetty</groupId>131<artifactId>servlet-api</artifactId>132</exclusion>133</exclusions>134</dependency>135136<dependency>137<groupId>log4j</groupId>138<artifactId>log4j</artifactId>139<version>1.2.16</version>140</dependency>141142<dependency>143<groupId>org.slf4j</groupId>144<artifactId>slf4j-api</artifactId>145<version>1.6.2</version>146</dependency>147148<dependency>149<groupId>redis.clients</groupId>150<artifactId>jedis</artifactId>151<version>2.1.0</version>152</dependency>153154<dependency>155<groupId>javax.validation</groupId>156<artifactId>validation-api</artifactId>157<version>1.0.0.GA</version>158</dependency>159160<dependency>161<groupId>org.hibernate</groupId>162<artifactId>hibernate-validator</artifactId>163<version>4.2.0.Final</version>164</dependency>165166<dependency>167<groupId>javax.cache</groupId>168<artifactId>cache-api</artifactId>169<version>0.4</version>170</dependency>171172<dependency>173<groupId>org.jboss.resteasy</groupId>174<artifactId>resteasy-jaxrs</artifactId>175<version>3.0.7.Final</version>176</dependency>177178<dependency>179<groupId>org.jboss.resteasy</groupId>180<artifactId>resteasy-client</artifactId>181<version>3.0.7.Final</version>182</dependency>183184<dependency>185<groupId>org.jboss.resteasy</groupId>186<artifactId>resteasy-netty</artifactId>187<version>3.0.7.Final</version>188</dependency>189190<dependency>191<groupId>org.jboss.resteasy</groupId>192<artifactId>resteasy-jdk-http</artifactId>193<version>3.0.7.Final</version>194</dependency>195196<dependency>197<groupId>org.jboss.resteasy</groupId>198<artifactId>resteasy-jackson-provider</artifactId> 199<version>3.0.7.Final</version>200</dependency>201202<dependency>203<groupId>org.jboss.resteasy</groupId>204<artifactId>resteasy-jaxb-provider</artifactId> 205<version>3.0.7.Final</version>206</dependency>207208<dependency>209<groupId>org.apache.tomcat.embed</groupId> 210<artifactId>tomcat-embed-core</artifactId>211<version>8.0.11</version>212</dependency>213214<dependency>215<groupId>org.apache.tomcat.embed</groupId>216<artifactId>tomcat-embed-logging-juli</artifactId>217<version>8.0.11</version>218</dependency>219220<dependency>221<groupId>com.esotericsoftware.kryo</groupId>222<artifactId>kryo</artifactId>223<version>2.24.0</version>224</dependency>225226<dependency>227<groupId>de.javakaffee</groupId>228<artifactId>kryo-serializers</artifactId>229<version>0.26</version>230</dependency>231232<dependency>233<groupId>de.ruedigermoeller</groupId>234<artifactId>fst</artifactId>235<version>1.55</version>236</dependency>237</dependencies>238239240</project>View Code其它注意事项:dubbo构架中,zk充着“服务注册中⼼”的⾓⾊,所以⽣产者与消费者的xml配置⽂件中,都要配置zk地址,如果zk采⽤集群部署时,配置写法参考下⾯这样:<dubbo:registry address="zookeeper://172.28.*.102:2181?backup=172.28.*.102:2182,172.28.*.102:2183"/>dubbo还有⼀个管理界⾯,⽤于服务治理,包括启⽤/禁⽤服务,设置服务的路由规则(即:A地址的Consumer直接调⽤B机器的Provider,⽽不是由负载均衡算法分配)等等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于分布式服务框架Dubbo的调研报告
在接触过的项目中由于功能比较少,数据访问量并不是很大,在项目设计架构的时候总是优先考虑如何使代码简化,抽象相似方法。
因此会引入诸如面向接口编程,面向切面编程,以及设计模式的考量。
此时,ORM(Object/Relation Mapping)的数据访问框架,这种对象关系映射解决了面向对象与关系数据库存在的互不匹配的问题,也成了中小型项目基本的服务框架。
其中,我了解的比较多的是显示层的struts2,数据持久层的Hibernate,以及业务逻辑层的Spring,三者通力配合可以大大简化应用服务的代码编程数量,可以让程序员在编写代码的时候优先考量功能需求,而不必为冗余的操作代码而浪费时间,其中我深有体会的有像将服务放入Spring,自动完成事物操作。
还有关于CDUR的操作,数据存储与取得,只要进行简单的Hibernate配置就可以直接实现关系对象的转化。
当然以上ORM框架的核心以及它所完成的任务决定了一个项目分层架构是一种垂直纵向的关系,比如说我们经典的MVC模式,我们需要实体层,数据持久层,业务逻辑层,以及显示层。
持久层,业务逻辑层,显示层在设计的时候需要从上往下传递数据对象,因而考量设计的重点在于高内聚,低耦合。
层与层之间要相互依赖,又要相互独立。
这样的设计在进行功能量适中,访问服务数量不多的情况能够应对自如,但是当访问服务数量激增,系统功能变得复杂的时候这种基于ORM的服务架构就会显得笨重,并且不利于测试。
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变得市场需求。
那么,提高业务复用及整合的分布式服务框架RPC(Remote Procedure Call Protocol)就成了关键。
这种抽取核心功能的方式非常类似于MVC模型下模板方法模式,即抽取公共方法为抽象基类,而在此处就将相似服务功能抽取出来形成注册服务中心来统一调配资源。
Duboo就是这种分布式服务框架,它主要针对的是一种SOA方案,我们知道面向对象模型是紧耦合的,而SOA指得就是一种面向服务体系,实际上就是我们都认知的面向接口编程,这也是分布式核心思想,尽量用接口定义公共服务
方式,利用实现接口的方式实现具体方法。
Duboo功能主要包括:高性能NIO 通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。
Duboo的依赖成本比较低,只要JDK在1.5以上,通过一些配置就可以让Duboo不依赖任何三方库运行起来,并且Duboo是开源的,这样就方便了程序员更好的应用在项目中,当然你的项目要有类似于淘宝的访问量你才需要考虑它的适用。
那么Duboo所要解决的问题是什么呢?
首先,服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。
并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。
当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。
接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。
其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。
说了这么多,我们来看看Duboo这个架构到底提供了什么。
在Duboo架构中,其主要包括5个角色,Provider:暴露服务的服务提供方;Consumer:调用服务的服务消费方;Register:服务注册与发现中心。
Moniter:统计服务的调用次数和调用时间的监控中心。
Container:服务运行对象。
很显然,Duboo将我们熟悉的MVC模式下业务逻辑层进行了封装,并交给容器管理。
我们可以将基于Duboo的具体服务类部署于Spring IOC容器中,利用注解的方式来声明和注入相关的服务对象,将我们熟悉的业务逻辑的层的具体
方法接口统一放入Duboo形成服务注册与发现中心统一资源调配。
实际上,在使用Duboo等类似分布式框架的前提都是集中在服务层功能的真正复杂情况下,由于大型项目每个模块设计的程序员所使用的方法可能并不唯一,那么调合功能使其按照统一的方式向外发布和获取访问者的服务需求是亟需解决的。
当功能累加的时候我们需要分层来部署项目,当出现瓶颈的时候我们就会希望以非常细的粒度来再次部署,这样就需要增加机器来缓解服务器的负担。
Dubbo通过长连接减少握手,即在一次连接中发送多个数据包,完成数据上传与下载。
通过NIO及线程池在单连接上并发拼包处理消息,通过二进制流压缩数据,比常规HTTP等短连接协议更快。
实际上NIO(new IO)的独到之处即提供了(Buffer)原始类型的缓存支持,能让我们在读写数据的时候更快。
Dubbo提供了形式简明的服务框架,使用他的同时,我们也应该考虑到部署的复杂度与并发量,它所适合的场景我想应该更多得定位于日均访问量非常大的系统,用来提供服务与追踪受众。