探索分布式服务框架Dubbo3:为何选择Dubbo

Dubbo:高性能分布式服务框架 服务治理:提供完善的服务治理能力,包括服务注册与发现、负载均衡、容错机制等。高性能:基于 Netty 实现高效的网络通信,支持高并发调用。扩展性:通过 SPI 机制,支持灵活的扩展和定制。动态配置:支持动态调整服务配置,适应业务需求变化。Dubbo 是高性能分布式服务框架的典范,通过其强大的服务治理能力、高性能和扩展性,为微服务架构、分布式系统和高并发场景提供了强大的支持。通过深入了解其核心概念、架构设计、使用场景和最佳实践,开发团队可以充分发挥 Dubbo 的优势,构建高效、可靠的分布式服务系统。 阅读详情

聊聊Dubbo(一):为何选择

1. 前言

随着现在互联网行业的发展,越来越多的框架、中间件、容器等开源技术不断地涌现,更好地来服务于业务,实现业务并解决问题。然而面对众多的技术选择,我们要如何甄别出适合自己团队业务的技术呢?对于人来说,鞋子过大,可能影响奔跑的速度,鞋子过小,可能影响身体的成长。技术对于业务也是如此的关系。

所以,相对于技术的学习、搭建、使用、运维等技能,我们 对技术的甄别选择更是重中之重。那么本文要讲的Dubbox框架,又是如何在众多的服务框架中脱颖而出,被团队选中践行服务之路?

2. 服务

2.1 为什么要做服务

技术为业务而生,架构也为业务而出现。随着业务的发展、用户量的增长,系统数量增多,调用依赖关系也变得复杂,为了确保系统高可用、高并发的要求,系统的架构也从单体时代慢慢迁移至服务SOA时代,根据不同服务对系统资源的要求不同,我们可以更合理的配置系统资源,使系统资源利用率最大化。

 

系统架构演进

 

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

平台随着业务的发展 从 All in One 环境 就可以满足业务需求(以Java来说,可能只是一两个war包就解决了);发展到需 要拆分多个应用,并且采用MVC的方式 分离前后端,加快开发效率;在发展到服务越来越多,不得不将 一些核心或共用的服务拆分出来,提供实时流动监控计算等,其实发展到此阶段,如果服务拆分的足够精细,并且独立运行,这个时候至少可以 理解为SOA(Service-Oriented Architecture)架构 了。

2.2 服务带来的挑战

当迎来服务SOA时代,我们面临要解决的问题会很多,比如:系统的复杂度上升、服务依赖关系、服务性能监控、全链路日志、容灾、断路器、限流等。那么面对这些问题为什么还要做分布式服务呢?因为在未来只有砥砺前行,才能走的更高更远。不过看到这些问题不要气馁,先不管这些问题,让我们一步步来梳理下现存有什么问题,我们要完成什么目标,问题自然会迎刃而解。

根据现在团队的业务系统情况,首先我们要梳理出现存的问题是什么:

  1. 多种调用传输方式:HTTP方式、WebService方式;
  2. 服务调用依赖关系:人工记录,查看代码分析;
  3. 服务调用性能监控:日志记录,人工查看时间;
  4. 服务与应用紧耦合:服务挂掉,应用无法可用;
  5. 服务集群负载配置:Nginx配置,存在单点问题;

在去选择技术框架时,技术框架最基本要解决上面现存问题,同时我们也要确认出我们的期望,要达到的目标是什么:

  1. 支持当前业务需求,这是最最基本的条件;
  2. 服务避免单点问题,去中心化;
  3. 服务高可用、高并发,解耦服务依赖;
  4. 服务通用化,支持异构系统调用服务;
  5. 服务依赖关系自维护,可视化;
  6. 服务性能监控自统计,可视化;
  7. 服务需自带注册、发现、健康检查、负载均衡等特性;
  8. 开发人员关注度高,上手快,简单轻量,低侵入;

还有最重要一点,这也是往往很多技术人员进入的误区,“对于技术,不要为了使用而使用,用最简单合适的技术实现解决问题才是正道”。架构是服务于业务的,能快速方便的满足业务需求的架构才是好的架构。

 

没有最好的,只有适合自己的

 

2.3 服务未来的趋势

一谈到服务,可能大家很多听说过SOA、MSA等服务的概念名词,近几年MSA炒的比较火,其实每一个概念的背后都在解决不同的问题。此类名词的最大特点就是 一解释就懂,一问就不知,一讨论就打架。

SOA、MSA两者说到底都是对外提供接口的一种架构设计方式。我倒觉得微服务其实就是随着互联网的发展,复杂的平台、业务的出现,导致SOA架构向更细粒度、更通用化程度发展,就成了所谓的微服务了。以这种说法做为根据,我觉得SOA与微服务的区别在于如下几个方面:

  1. 微服务相比于SOA更加精细,微服务更多的以独立的进程的方式存在,互相之间并无影响;
  2. 微服务提供的接口方式更加通用化,例如HTTP RESTful方式,各种终端都可以调用,无关语言、平台限制;
  3. 微服务更倾向于分布式去中心化的部署方式,在互联网业务场景下更适合;

微服务与SOA有很多相同之处。两者都属于典型的、包含松耦合分布式组件的系统结构。在围绕着服务的概念创建架构这一方面,微服务提供了一种更清晰、定义更良好的方式。微服务的原则与敏捷软件开发思想是高度一致的,而它与SOA原则的演化的目标也是相同的,则减少传统的企业服务总线开发的高复杂性。两者之间最关键的区别在于,微服务专注于以自治的方式产生价值。但是两种架构背后的意图是不同的:SOA尝试将应用集成,一般采用中央管理模式来确保各应用能够交互运作。微服务尝试部署新功能,快速有效地扩展开发团队。它着重于分散管理、代码再利用与自动化执行。

功能SOA微服务
组件大小大块业务逻辑单独任务或小块业务逻辑
耦合通常松耦合总是松耦合
公司架构任何类型小型、专注于功能交叉的团队
管理着重中央管理着重分散管理
目标确保应用能够交互操作执行新功能,快速拓展开发团队

微服务并不是一种新思想的方法。它更像是一种思想的精炼,一种SOA的精细化演进,并且更好地利用了先进的技术以解决问题,例如容器与自动化等。所以对于我们 去选择服务技术框架时,并不是非黑即白,而是针对SOA、MSA两种架构设计同时要考虑到兼容性,对于现有平台情况架构设计,退则守SOA,进则攻MSA,阶段性选择适合的。

3. 框架

现在业界比较成熟的服务框架有很多,比如:Hessian、CXF、Dubbo、Dubbox、Spring Cloud、gRPC、thrift等技术实现,都可以进行远程调用,具体技术实现优劣参考以下分析,这也是具体在技术方案选择过程中的重要依据。

3.1 服务框架对比

Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。不过,略有遗憾的是,据说在淘宝内部,dubbo由于跟淘宝另一个类似的框架HSF(非开源)有竞争关系,导致dubbo团队已经解散,反到是当当网的扩展版本Dubbox仍在持续发展,墙内开花墙外香。其它的一些知名电商如当当、国美维护了自己的分支或者在dubbo的基础开发,但是官方的库缺乏维护,相关的依赖类比如Spring,Netty还是很老的版本(Spring 3.2.16.RELEASE, netty 3.2.5.Final),倒是有些网友写了升级Spring和Netty的插件。

Dubbox和Dubbo本质上没有区别,名字的含义扩展了Dubbo而已,以下扩展出来的功能,也是选择Dubbox很重要的考察点。

  1. 支持REST风格远程调用(HTTP + JSON/XML);
  2. 支持基于Kryo和FST的Java高效序列化实现;
  3. 支持基于Jackson的JSON序列化;
  4. 支持基于嵌入式Tomcat的HTTP remoting体系;
  5. 升级Spring至3.x;
  6. 升级ZooKeeper客户端;
  7. 支持完全基于Java代码的Dubbo配置;

Spring Cloud完全基于Spring Boot,是一个非常新的项目,2016年推出1.0的release版本,目前Github上更新速度很快. 虽然Spring Cloud时间最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案。Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用。它们将在任何分布式环境中工作,包括开发人员自己的笔记本电脑,裸物理机的数据中心,和像Cloud Foundry云管理平台。在未来引领这微服务架构的发展,提供业界标准的一套微服务架构解决方案。

缺点是项目很年轻,很少见到国内业界有人在生产上成套使用,一般都是只有其中一两个组件。相关的技术文档大部分是英文的,案例也相对较少,使用的话需要摸索的时间会长一些。

下图是Spring Cloud和Dubbo对比:

 

Spring Cloud和Dubbo对比

 

Motan是新浪微博开源的一个Java 框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。与Dubbo相比,Motan在功能方面并没有那么全面,也没有实现特别多的扩展。用的人比较少,功能和稳定性有待观望。对跨语言调用支持较差,主要支持java。

Hessian采用的是 二进制RPC协议,适用于发送二进制数据。但本身也是一个Web Service框架对RPC调用提供支持,功能简单,使用起来也方便。基于Http协议进行传输。通过Servlet提供远程服务。通过Hessain本身提供的API来发起请求。响应端根据Hessian提供的API来接受请求。

Hessian优点:

  1. 整个jar很小,轻量;
  2. 配置简单;
  3. 功能强大,抛开了soap(simple object access protocal 简单对象访问协议)、ejb,采用二进制来传递对象;

rpcx是Go语言生态圈的Dubbo, 比Dubbo更轻量,实现了Dubbo的许多特性,借助于 Go语言优秀的并发特性和简洁语法,可以使用较少的代码实现分布式的RPC服务。

gRPC是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。

thrift是Apache的一个跨语言的高性能的服务框架,也得到了广泛的应用。

以上RPC框架功能比较:

功能HessianMontanrpcxgRPCThriftDubboDubboxSpring Cloud
开发语言跨语言JavaGo跨语言跨语言JavaJavaJava
分布式(服务治理)×√√××√√√
多序列化框架支持hessian√(支持Hessian2、Json,可扩展)√× 只支持protobuf)×(thrift格式)√√√
多种注册中心×√√××√√√
管理中心×√√××√√√
跨编程语言√×(支持php client和C server)×√√×××
支持REST××××××√√
关注度低中低中中中高中
上手难度低低中中中低低中
运维成本低中中中低中中中
开源机构CauchoWeiboApacheGoogleApacheAlibabaDangdangApache

实际场景中的选择

  1. Spring Cloud:Spring全家桶,用起来很舒服,只有你想不到,没有它做不到。可惜因为发布的比较晚,国内还没出现比较成功的案例,大部分都是试水,不过毕竟有Spring作背书,还是比较看好。
  2. Dubbox:相对于Dubbo支持了REST,估计是很多公司选择Dubbox的一个重要原因之一,但如果使用Dubbo的RPC调用方式,服务间仍然会存在API强依赖,各有利弊,懂的取舍吧。
  3. Thrift:如果你比较高冷,完全可以基于Thrift自己搞一套抽象的自定义框架吧。
  4. Montan:可能因为出来的比较晚,目前除了新浪微博16年初发布的,
  5. Hessian:如果是初创公司或系统数量还没有超过5个,推荐选择这个,毕竟在开发速度、运维成本、上手难度等都是比较轻量、简单的,即使在以后迁移至SOA,也是无缝迁移。
  6. rpcx/gRPC:在服务没有出现严重性能的问题下,或技术栈没有变更的情况下,可能一直不会引入,即使引入也只是小部分模块优化使用。

3.2 RPC vs REST(JAX-RS)

由于Dubbo是基础框架,其实现的内容对于我们实施微服务架构是否合理,也需要我们根据自身需求去考虑是否要修改,比如Dubbo的服务调用是通过RPC实现的,但是如果仔细拜读过Martin Fowler的microservices一文,其定义的服务间通信是HTTP协议的REST API。那么这两种有何区别呢?

  1. 服务提供方与调用方接口依赖方式太强

    我们为每个微服务定义了各自的service抽象接口,并通过持续集成发布到私有仓库中,调用方应用对微服务提供的抽象接口存在强依赖关系,因此不论开发、测试、集成环境都需要严格的管理版本依赖,才不会出现服务方与调用方的不一致导致应用无法编译成功等一系列问题,以及这也会直接影响本地开发的环境要求,往往一个依赖很多服务的上层应用,每天都要更新很多代码并install之后才能进行后续的开发。若没有严格的版本管理制度或开发一些自动化工具,这样的依赖关系会成为开发团队的一大噩梦。而REST接口相比RPC更为轻量化,服务提供方和调用方的依赖只是依靠一纸契约,不存在代码级别的强依赖,当然REST接口也有痛点,因为接口定义过轻,很容易导致定义文档与实际实现不一致导致服务集成时的问题,但是该问题很好解决,只需要通过每个服务整合swagger,让每个服务的代码与文档一体化,就能解决。所以在分布式环境下,REST方式的服务依赖要比RPC方式的依赖更为灵活。

  2. 服务对平台敏感,难以简单复用

    通常我们在提供对外服务时,都会 以REST的方式提供出去,这样可以实现跨平台的特点,任何一个语言的调用方都可以根据接口定义来实现。那么在Dubbo中我们要提供REST接口时,不得不实现一层代理,用来将RPC接口转换成REST接口进行对外发布。若我们每个服务本身就以REST接口方式存在,当要对外提供服务时,主要在API网关中配置映射关系和权限控制就可实现服务的复用了。

相信这些痛点也是为什么当当网在dubbox(基于Dubbo的开源扩展)中增加了对REST支持的原因之一。

Dubbo实现了服务治理的基础,但是要完成一个完备的微服务架构,还需要在各环节去扩展和完善以保证集群的健康,以减轻开发、测试以及运维各个环节上增加出来的压力,这样才能让各环节人员真正的专注于业务逻辑。

而Spring Cloud依然发扬了Spring Source整合一切的作风,以标准化的姿态将一些微服务架构的成熟产品与框架揉为一体,并继承了Spring Boot简单配置、快速开发、轻松部署的特点,让原本复杂的架构工作变得相对容易上手一些。所以,如果选择Dubbo请务必在各个环节做好整套解决方案的准备,不然很可能随着服务数量的增长,整个团队都将疲于应付各种架构上不足引起的困难。而如果选择Spring Cloud,相对来说每个环节都已经有了对应的组件支持,可能有些也不一定能满足你所有的需求,但是其活跃的社区与高速的迭代进度也会是你可以依靠的强大后盾。

 

微服务结构图

 

4. Dubbox带来什么

4.1 Dubbo服务治理

 

Dubbo服务治理

 

特性描述
透明远程调用就像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入;
负载均衡机制Client端LB,可在内网替代F5等硬件负载均衡器;
容错重试机制服务Mock数据,重试次数、超时机制等;
自动注册发现注册中心基于接口名查询服务提 供者的IP地址,并且能够平滑添加或删除服务提供者;
性能日志监控Monitor统计服务的调用次调和调用时间的监控中心;
服务治理中心路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等手动配置。
自动治理中心无,比如:熔断限流机制、自动权重调整等;

4.2 Dubbox扩展特性

  1. 支持REST风格远程调用(HTTP + JSON/XML);
  2. 支持基于Kryo和FST的Java高效序列化实现;
  3. 支持基于Jackson的JSON序列化;
  4. 支持基于嵌入式Tomcat的HTTP remoting体系;
  5. 升级Spring至3.x;
  6. 升级ZooKeeper客户端;
  7. 支持完全基于Java代码的Dubbo配置;

5. 参考资料与推荐阅读

  1. 分布式RPC框架性能大比拼
  2. 实施微服务,我们需要哪些基础框架?
  3. 微服务(Microservice)那点事
  4. Spring Cloud微服务框架主要子项目和RPC框架的对比
  5. 微服务、SOA 和 API:是敌是友?
  6. 微服务与SOA的实践应用对比
  7. 微服务架构的基础框架选择:Spring Cloud还是Dubbo?
  8. 微服务与SOA架构
  9. Web Service实践之REST vs RPC
  10. RPC好,还是RESTful好?
  11. Rpc和Rest接口,微服务之Rpc
  12. WEB开发中,使用JSON-RPC好,还是RESTful API好?
Dubbo分布式服务框架:原理深度解析与实战应用探索(二) Dubbo是一个高性能的分布式服务框架,用于构建可伸缩的企业级应用软件系统。它由阿里巴巴集团开源,并在国内外广泛应用。 本文将跟随《Dubbo分布式服务框架:原理深度解析与实战应用探索(一)》的进度,继续介绍Thrift。希望通过本系列文章的学习,您将能够更好地理解Dubbo的内部工作原理,掌握Dubbo的使用技巧,以及通过合理的配置完成最佳实践,充分发挥Dubbo的潜力,为系统的高效运行提供有力保障。 阅读详情

相关推荐

Dubbo分布式服务框架:原理深度解析与实战应用探索(三)

​ Dubbo是一个高性能的分布式服务框架,用于构建可伸缩的企业级应用软件系统。它由阿里巴巴集团开源,并在国内外广泛应用。 本文将跟随《Dubbo分布式服务框架:原理深度解析与实战应用探索(二)》的进度,继续介绍Dubbo。希望通过本系列文章的学习,您将能够更好地理解Dubbo的内部工作原理,掌握Dubbo的使用技巧,以及通过合理的配置完成最佳实践,充分发挥Dubbo的潜力,为系统的高效运行提供有力保障。 ​

凛鼕将至的博客 1488

Dubbo3主推的Triple协议

Dubbo3 推出了下一代RPC通信协议——Triple,译为第三代的。Triple 完全兼容 gRPC 协议,运行在 HTTP2 协议之上。Dubbo 框架提供了 Triple 协议的多种语言实现,可以帮助你构建浏览器、gRPC 兼容的 HTTP API 接口。已经有了 dubbo 协议,为啥还要推出 Triple 协议???Triple 协议的推出,旨在解决 Dubbo2 私有协议带来的互通性问题。Triple 协议就是要解决这些问题的。

程序员小潘 1620

广工计组f4b 8位12指令微程序CPU设计实验报告(内含可通过代码以及波形图)

实验目的:模型机是计算机的缩细模型,通过它可以理解计算机整机的结构和功能,理解CPU,存储器,中断控制器,接口的结构及实现逻辑和各部件之前的接口关系。本实验是设计一个8位模型计算机。:一条机器指令可以分解成一个微操作序列,这些微操作是计算机最基本的,不可再细分的操作。:在微程序控制的计算机中。将控制部件向执行部件发出的各种控制命令成为微命令,它是构成控制序列的最小单位。微命令和微操作是一一对应的。微命令是微操作的控制信号,微操作微命令的执行过程。2.:微指令是若干微命令的集合。

weixin_63692154的博客 4703

Dubbo3应用开发—协议(Dubbo协议、REST协议 、gRPC协议、Triple协议)

本文介绍了Dubbo应用开发中可以使用的协议,包括Dubbo协议、REST协议 、gRPC协议和Triple协议。

随机的未知——用已知去面对未知 1042

ADS系列之SI&PI仿真笔记:ADS多种版本的安装、卸载&重装(一)

此系列仅作为ADS学习过程的记录,如有错误的地方还请大佬指正! 一、下载&安装 ADS软件下载&安装还算比较简单,目前接触到有两个版本:ADS2017和ADS2019。这里贴下链接,破解教程里面都有: ADS2017下载地址:https://pan.baidu.com/s/1l-Bs9owKRmp5Pv0Mt92OYA 提取码:wuzf ADS2019下载地址:吴川斌的博客-w...

Claudedy的博客 3万+

基于SolidWorks宏的草图点坐标自动化提取与Excel集成

本文详细介绍了如何利用SolidWorks宏编程实现草图点坐标的自动化提取并与Excel集成,显著提升机械设计效率。通过VBA代码解析与优化,解决了人工记录坐标耗时易错的问题,并扩展了多草图批量处理、数据可视化等高级功能,适用于数控加工、质量检测等场景。

weixin_29251131的博客 461

SpringBoot集成Dubbo启用gRPC协议

Dubbo 在 2.7.5 版本开始支持原生 gRPC 协议,对于计划使用 HTTP/2 通信或者期望 gRPC 协议支持服务治理能力的,都可以考虑接入 Dubbo 体系启用 gRPC 协议。由于官网给的 代码示例 是基于 spring,现在基本上都是基于SpringBoot开发,所以本文提供一下 SpringBoot 的代码示例。此外还会简单说明 Dubbo 支持的原生 gRPC 协议与原生 gRPC 协议在代码开发时的区别。如果对gRPC协议不了解的,后续文章会有更新,请持续关注。

二蛋的博客 3386

Linux之SUSE系统SAP-HANA经常系统内存不足使得SAP应用不能使用解决方案

问题描述 Linux内存使用量超过阈值,使得sap应用程序无可用内存,最终导致程序崩溃。 问题原因 自己查阅了一些资料,也基于zabbix的可用内存和实际不太一样入手去找原因发现问题出现于Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,而SAP-HANA的日志文件很大...

liuxiangyang_的博客 6710

小白也能看懂的dubbo3应用级服务发现详解

dubbo 是一款开源的 RPC 框架,主要有3个角色: 提供者(provider)、消费者(consumer) 、注册中心(registry) 提供者启动时向注册中心注册服务地址,消费者启动时订阅服务,并通过获取到的提供者地址发起调用,当提供者地址变更时,通过注册中心向消费者推送变更。这就是 dubbo 主要的工作流程。 在2.7.5之前,dubbo 只支持接口级服务发现模型,>=2.7.5的版本提供了接口级与应用级两种服务发现模型,3.0之后的版本应用级服务发现更是非常重要的一个功能。

java_xiaoo的博客 621

数据中心——Vxlan基本概念1

东西流量指的就是横向流量-------例如:服务器与服务器之间交换流量南北流量指的就是纵向流量-------例如:客户端和服务器之间的流量以下主要是讲解业务平面的网络架构(一般业务平面就需要用到专用的数据中心交换机)

m0_49864110的博客 1万+

手把手教你使用ConvNeXt训练自己数据集和推理,ConvNeXt模型训练(CVPR 2022),一个能挑战 Vision Transformer 的卷积神经网络,含完整代码和数据集

手把手教你使用ConvNeXt训练自己数据集和推理,ConvNeXt模型训练(CVPR 2022),一个能挑战 Vision Transformer 的卷积神经网络,含完整代码和数据集

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1449

Dubbo3.0系列(6)- Dubbo3.0支持的RPC协议

Triple 协议是 Dubbo3 推出的主力协议。Triple 意为第三代,通过 Dubbo1.0/ Dubbo2.0 两代协议的演进,以及云原生带来的技术标准化浪潮,Dubbo3 新协议 Triple 应运而生。采用分层设计,其数据交换格式基于Protobuf (Protocol Buffers) 协议开发,具备优秀的序列化/反序列化效率,当然还支持多种序列化方式,也支持众多开发语言。在传输层协议,Triple 选择了 HTTP/2,相较于 HTTP/1.1,其传输效率有了很大提升。...

m0_61083409的博客 552

Allegro格式PCB转换成Pads操作指导

变量:AEX_BIN_ROOT 值:D: MentorGraphics>PADSVX1.2>SDD_HOME>translators>win32bin (值:软件按装的位置,可以是9.5版本,也可以是VX1.0等不同的版本)。变量:HOME 值:C:Users>win7>AppData>Roaming>SPB_Data (这个值是allegro快捷键存放位置器,也可以随意放置在那个盘,我们可以采用默认的路径)。第4步:打开 PADSLayout软件,然后选择导入文件,选择刚刚处理的 allegro文件。

weixin_54787054的博客 3717

Dubbo分布式服务框架:原理深度解析与实战应用探索(一)

Dubbo是一个高性能的分布式服务框架,用于构建可伸缩的企业级应用软件系统。它由阿里巴巴集团开源,并在国内外广泛应用。Dubbo的主要特点包括:服务治理:Dubbo提供了丰富的服务治理功能,包括服务注册与发现、负载均衡、容错机制等。通过这些功能,Dubbo可以实现服务的自动化管理和监控。通信协议:Dubbo支持多种通信协议,包括RPC、HTTP和消息队列等。这使得Dubbo可以灵活适应不同的应用场景。服务调用方式:Dubbo支持多种服务调用方式,包括同步调用、异步调用和单向调用。

凛鼕将至的博客 1681

Android 9.0 SystemUI禁用长按recent键的分屏功能

​ 在9.0的系统产品开发中,系统对于多窗口模式默认会有分屏功能的,但是在某些产品中,需要禁用分屏模式,所以需要在导航栏中 禁用长按recent的分屏模式功能,接下来分析下相关分屏模式的实现 ​

安卓兼职framework和app工程师的博客 448

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Dubbo:深入解析分布式服务框架

Dubbo最初是由阿里巴巴开发并开源的一个高性能、轻量级的 Java RPC 框架,致力于解决分布式系统中服务调用的复杂性。透明的远程方法调用:开发者可以像调用本地方法一样调用远程服务,Dubbo 通过代理类自动处理网络通信细节。这样的设计大大降低了开发者学习和使用分布式服务的门槛。服务注册与发现:通过注册中心(如 ZooKeeper、Nacos 等),Dubbo 实现了服务的动态注册和发现机制。当一个服务提供者启动时,它会自动注册到注册中心,服务消费者则从注册中心获取服务提供者的列表,实现服务的动态感知。

lssffy的博客 1742

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Apache Dubbo:高性能分布式服务框架全面解析

Apache Dubbo:高性能分布式服务框架全面解析 【免费下载链接】dubbo Dubbo 是一款高性能、轻量级的分布式服务框架,旨在解决企业应用系统中服务治理的问题。轻量级的服务框架,支持多种通信协议和服务治理。适用分布式微服务架构下的服务调用和治理。 ...

gitblog_00903的博客 1229

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

初识分布式服务管理框架-Dubbo

欢迎加入DUBBO交流群:259566260 Dubbo是阿里下面的一个开源分布式服务管理框架。它的产生是因为分布式的产生而产生的。下面将几点分享一下我对Dubbo的初步认识。通过dubbo的官方文档可以了解一下怎么使用以及基本的设计思想。http://alibaba.github.io/dubbo-doc-static/User+Guide-zh.htm下面分享一下我对Dubbo的理解,可能其中

JDream314的专栏 9858

Dubbo分布式服务框架

本文从多个方面详细阐述了Dubbo分布式服务框架的优势和应用场景,重申了引言中的目的和重要性。Dubbo作为一款优秀的分布式服务框架,具备高度的可扩展性、出色的性能以及完善的服务治理功能,为企业构建高可用、高性能、可扩展的分布式系统提供了有力支持。在未来的发展中,Dubbo有望在更多领域发挥重要作用。优化性能:针对特定场景,如高并发、大数据量等,对Dubbo的性能进行优化。扩展功能:继续丰富Dubbo的功能,如支持更多协议、提供更完善的监控等。社区建设。

2501_92489105的博客 990

Dubbo分布式服务框架全解析

摘要:Dubbo是一款高性能分布式服务框架,提供透明化的RPC远程调用和SOA服务治理方案。其核心功能包括远程通讯、集群容错和自动服务发现,通过注册中心实现服务动态管理。架构包含Provider、Consumer、Registry等角色,支持负载均衡和失败容错。使用方式基于Spring配置,通过Zookeeper作为注册中心,服务提供者暴露接口,消费者订阅调用。典型应用场景包括替代硬件负载均衡器,实现服务自动注册与发现。测试时可通过管理页面监控各节点状态,确保服务正常运行。

YF云飞的博客 914

Dubbo 一款分布式服务框架

一款分布式服务框架高性能和透明化的RPC远程服务调用方案服务治理方案。

weixin_62282158的博客 663

Apache Dubbo 分布式服务框架

核心定位:高性能 Java RPC(远程过程调用)框架,专注于分布式服务治理核心能力:服务注册发现、负载均衡、容错机制、动态配置管理生态地位:阿里巴巴开源,Apache 顶级项目,微服务核心基础设施。

slovess的博客 1056
上一篇: 探索分布式服务框架Dubbo开篇:牛逼哄哄的RPC
下一篇: 探索分布式服务框架Dubbo4:Dubbo初体验
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值