dubbo 注解配置:

@Service //Service注解暴露服务

@Configuration // javaconfig形式配置公共模块

@DubboComponentScan // 指定dubbo扫描路径

@Reference //注解引用

启动时检查服务可用性:

<dubbo:reference check //设定特定服务启动检查

<dubbo:consumer check //设定所有服务启动检查

<dubbo:registry check //设定注册中心启动检查

集群容错:

<dubbo:service retries <dubbo:reference retries <dubbo:method retries

failover:失败自动切换,重试其它服务器

failfast:快速失败,只发起一次调用,失败立即报错,非幂等操作

failsafe:失败安全,忽略异常,

failback:失败自动恢复,后台记录失败请求,定时重发,

forking:同时调用多个服务器,只要一个返回成功即可,应用于实时性高的操作

broadcast:广播所有服务器,逐个调用,任意一台报错,则报错,服务更新提供者缓存应用

负载均衡:

服务端 服务端方法级 客户端 客户端方法级

random:按权重设置随机概率,碰撞概率

roundrobin:公约后的权重设置轮训概率,慢提供者积累请求问题。

leastactive:慢的提供者收到更少的请求

consistenthash:相同参数请求发送到同一提供者,

缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" />

缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />

线程派发策略:

all:所有消息都派发到线程池

direct:所有消息不派发线程池,直接在io线程操作

message:只请求响应派发到线程池

execution:只请求消息派发线程池

connection:除连接断开消息,其它派发到线程池

线程池:

fixed:固定大小

cached:空闲一分钟删除,需要重建

limited:可伸缩,只增长不减少,应对大流量

直连:<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />

只订阅:

可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务(服务检测影响),通过直连测试正在开发的服务。

<dubbo:registry address="10.20.153.10:9090" register="false" />

只注册

如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务。这个时候,可以让服务提供者方只注册服务到另一注册中心,而不从另一注册中心订阅服务。

禁用订阅配置

<dubbo:registry id="hzRegistry" address="10.20.153.10:9090" />

<dubbo:registry id="qdRegistry" address="10.20.141.150:9090" subscribe="false" />

人工管理上下线:

<dubbo:registry address="10.20.141.150:9090" dynamic="false" />

多协议

Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。

不同服务不同协议

不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议

多协议暴露服务

多注册中心注册

Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务。另外,注册中心是支持自定义扩展的

多版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。

可以按照以下的步骤进行版本迁移:

在低压力时间段,先升级一半提供者为新版本

再将所有消费者升级为新版本

然后将剩下的一半提供者升级为新版本

分组聚合

按组合并返回结果 1,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。

结构缓存:

lru:缓存清理策略

threadlocal:线程缓存

jcache:桥接其它缓存实现

回声测试:

回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。

所有服务自动实现 EchoService 接口,只需将任意服务引用强制转型为 EchoService,即可使用。

RpcContext:threadlocal的临时状态记录器。存储当前调用所需的环境信息。

隐式参数

可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递

并发控制:限制方法的并发执行数 executes

连接控制:限制服务器端接受的连接 accepts 区别executes,一个连接可能很多种执行方法的方案

延迟连接用于减少长连接数。当有调用发起时,再创建长连接 lazy

<dubbo:protocol name="dubbo" lazy="true" />

注意:该配置只对使用长连接的 dubbo 协议生效

粘滞连接

粘滞连接用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非该提供者挂了,再连另一台。

粘滞连接将自动开启延迟连接,以减少长连接数。

<dubbo:protocol name="dubbo" sticky="true" />

服务降级:mock

mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。

mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。

优雅停机:kill pid; JDK 的 ShutdownHook

服务提供方

停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。

然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。

服务消费方

停止时,不再发起新的调用请求,所有新的调用在客户端即报错。

然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。

缺省端口设置:

dubbo: 20880

rmi: 1099

http, hessian, webservice: 80

memcached: 11211

redis: 6379

服务容器:

dubbo服务容器是一个standlone启动程序,因为后台服务不需要web容器的功能,所以不需要tomcat等来启动。

简单的Main方法启动,加载spring容器,用于暴露服务。

服务容器的加载内容可以配置扩展:java 命令的 -D 参数或者 dubbo.properties 中。

spring容器:自动加载 META-INF/spring 目录下的所有 Spring 配置。

配置 spring 配置加载位置:

dubbo.spring.config=classpath*:META-INF/spring/*.xml

jetty容器:启动一个内嵌jetty,用于汇报状态

dubbo.jetty.port=8080:配置 jetty 启动端口

dubbo.jetty.directory=/foo/bar:配置可通过 jetty 直接访问的目录,用于存放静态文件

dubbo.jetty.page=log,status,system:配置显示的页面,缺省加载所有页面

容器启动

缺省只加载 spring:

java com.alibaba.dubbo.container.Main

通过 main 函数参数传入要加载的容器:

java com.alibaba.dubbo.container.Main spring jetty log4j

通过 JVM 启动参数传入要加载的容器:

java com.alibaba.dubbo.container.Main -Ddubbo.container=spring,jetty,log4j

通过 classpath 下的 dubbo.properties 配置传入要加载的容器

dubbo.container=spring,jetty,log4j

线程栈自动dump:

当业务线程池满时,我们需要知道线程都在等待哪些资源、条件、以及找到系统的瓶颈、异常点。dubbo通过jstack自动导出线程堆栈来保留现场。

默认策略:

导出路径,user.home标识的用户主目录

导出间隔,最短间隔允许每隔10分钟导出一次

reference:配置listener

com.alibaba.dubbo.rpc.InvokerListener

serialization:serialization string 可选 dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json 性能调优 协议序列化方式,当协议支持多种序列化方式时使用,比如:dubbo协议的dubbo,hessian2,java,compactedjava,以及http协议的json等

缓存:

<dubbo:registry address="multicast://224.0.0.0:1234" file="cache/dubbo.cache"/>

这个文件会缓存注册中心的列表和服务提供者列表。有了这项配置后,当应用重启过程中,Dubbo 注册中心不可用时则应用会从这个缓存文件读取服务提供者列表的信息,进一步保证应用可靠性。

redis:注册中心

<dubbo:registry id="remoteregister" address="redis://127.0.0.1:6379"

dubbo协议:

缺省协议,使用基于 mina 1.1.7 和 hessian 3.2.1 的 tbremoting 交互。

连接个数:单连接

连接方式:长连接

传输协议:TCP

传输方式:NIO 异步传输

序列化:Hessian 二进制序列化

适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。

适用场景:常规远程服务方法调用

referred:

https://github.com/windwant/dubbo-service-demo.git

https://github.com/windwant/spring-dubbo-service.git

dubbo 微服务框架的更多相关文章

  1. 非常完善的两个微服务框架比较(SpringCloud与Dubbo)

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值. 虽然微服务架构没有公认的技术标准和规范或者草案,但 ...

  2. 微服务框架Dubbo与Springcloud的区别

    微服务框架Dubbo与Springcloud的区别 微服务主要的优势如下: 1.降低复杂度 将原来偶合在一起的复杂业务拆分为单个服务,规避了原本复杂度无止境的积累.每一个微服务专注于单一功能,并通过定 ...

  3. 十分钟搭建微服务框架(SpringBoot +Dubbo+Docker+Jenkins源码)

    本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 这套微服务框架能干啥? 这套系统搭建完之后,那可就厉害了: 微服务架构 你的整个应用程 ...

  4. Dubbo Ecosystem - 从微服务框架到微服务生态

    从微服务框架到微服务生态,这是微服务发展的必然趋势,也是Dubbo社区满足开发者更高效的构建微服务体系期望的使命和担当. 近期,Apache Dubbo PPMC 望陶(社区昵称:ralf0131)做 ...

  5. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...

    原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...

  6. Dubbo分布式服务框架入门使用

    概念: Provider 暴露服务方称之为"服务提供者". Consumer 调用远程服务方称之为"服务消费者". Registry 服务注册与发现的中心目录服 ...

  7. 【微服务】使用spring cloud搭建微服务框架,整理学习资料

    写在前面 使用spring cloud搭建微服务框架,是我最近最主要的工作之一,一开始我使用bubbo加zookeeper制作了一个基于dubbo的微服务框架,然后被架构师否了,架构师曰:此物过时.随 ...

  8. 使用Redis为注册中心的Dubbo微服务架构(基于SpringBoot)

    title: 使用Redis为注册中心的Dubbo微服务架构(基于SpringBoot) date: 2019-07-30 14:06:29 categories: 架构 author: mrzhou ...

  9. springcolud 的学习(二).SpringCloud微服务框架

    为什么选择SpringCloud因为SpringCloud出现,对微服务技术提供了非常大的帮助,因为SpringCloud 提供了一套完整的微服务解决方案,不像其他框架只是解决了微服务中某个问题. 服 ...

随机推荐

  1. Maven Jetty插件使用

    本机环境 JDK8 Maven 3.5 Jetty 9.3 Eclipse Mars pom.xml配置 在你的 pom.xml 文件中添加 jetty 插件的描述信息 <build> & ...

  2. [LuoguP2158][SDOI2008]仪仗队

    [LuoguP2158][SDOI2008]仪仗队(Link) 现在你有一个\(N \times N\)的矩阵,求你站在\((1,1)\)点能看到的点的总数. 很简洁的题面. 这道题看起来很难,但是稍 ...

  3. HDU 1116 Play on Words(欧拉回路+并查集)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1116 Play on Words Time Limit: 10000/5000 MS (Java/Ot ...

  4. UVA - 1160(简单建模+并查集)

    A secret service developed a new kind of explosive that attain its volatile property only when a spe ...

  5. awk 简单使用 egrep 正则表达式

    [root@python ~]# cat testcount.txt a 1.1.1.1b 2.2.2.2c 3.3.3.3a 1.1.1.1d 4.4.4.4e 5.5.5.5f 6.6.6.6 1 ...

  6. C#实体更新指定的字段

    接口类: /// <summary> /// 更新指定字段 /// </summary> /// <param name="entity">实体 ...

  7. iOS之面试题:阿里-P6一面-参考思路

    阿里-p6-一面  1.介绍下内存的几大区域? 2.你是如何组件化解耦的? 3.runtime如何通过selector找到对应的IMP地址 4.runloop内部实现逻辑? 5.你理解的多线程? 6. ...

  8. Druid手动设置参数错误

    在做Druid操作的时候,出现了小错误:但是总归是找到了,并且推一及三,以后学者高效解决问题: 严重: create connection errorjava.sql.SQLException: Ac ...

  9. 在js中获取页面元素的属性值时,弱类型导致的诡异事件踩坑记录,

    前几天写一个js的时候遇到一个非常诡异的事情,这个问题是这样的,我要获取一个页面的DOM元素的val值,判断这个值是否比某个变量大,这个需求原先数字最大也就是10,现在要改了,可能会更多,这个时候我发 ...

  10. 你不知道的css之 width “继承”篇。

    众所周知,css的三大特性分别是 继承性,层叠性,和优先级. 那么这里就详细说一下css中width的继承性及其特殊情况. 继承性概念详解:css的继承性指的被包在内部的标签拥有外部标签的样式性,子元 ...