共计 2581 个字符,预计需要花费 7 分钟才能阅读完成。
一、Dubbo 介绍
Java 开发的同学置信对 Dubbo 都有理解,Dubbo 是阿里开源的 RPC/ 服务治理框架,以下是百度的解释:
Dubbo(读音 [ˈdʌbəʊ]) 是阿里巴巴公司开源的一个高性能优良的服务框架,使得利用可通过高性能的 RPC 实现服务的输入和输出性能,能够和 [1] Spring 框架无缝集成。Dubbo 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大外围能力:面向接口的近程办法调用,智能容错和负载平衡,以及服务主动注册和发现。
https://baike.baidu.com/item/…
首先 Dubbo 是一个 RPC 框架,如果零碎是微服务架构,服务之间能够通过 Dubbo 来调用,解耦调用者 (Consumer) 和服务提供者 (Provider) 的依赖问题,为了对立概念,前面都以 Consumer 称说服务调用者,以 Provider 称说服务提供者;
没有 RPC 框架,可能要在配置文件中硬编码很多服务地址,有了 Dubbo 之后,Consumer 不必关怀有多少服务提供者,打个比方我想调用用户服务,你只有把服务名通知 Dubbo,Dubbo 会主动寻找相应的 Provider,而不必在配置文件中写死,真正解放了运维。
Dubbo 具体的性能就不在这里解释了,能够参考官网手册:
http://dubbo.apache.org/zh-cn…
二、Dubbo2.7 介绍
Dubbo 最新版本为 2.7.6,2.7 当前有大的变动,次要个性有:
1、Tag 路由
标签路由通过将某一个或多个服务的提供者划分到同一个分组,束缚流量只在指定分组中流转,从而实现流量隔离的目标,能够作为蓝绿公布、灰度公布等场景的能力根底。
这是 1 个理论的例子:
force: false
假如以后 tradecenter 服务有 2 台机器,1 台是 172.21.107.21,另 1 台是 172.21.107.22;
下面将 tradecenter 这个服务其中 1 台 172.21.107.21,打了标签 pre,后续 Consumer 调用时,只有带了 pre 的 tag,就肯定会调用到这台机;而没带 tag 的会调用到另 1 台机 172.21.107.22,这样就能够实现灰度公布了。
这个上面再重点讲述。
2、新增元数据中心
这块以前是全在注册核心,之所以独自分进去,也是思考性能、带宽的问题,因为有的配置 Consumer 基本不必关怀,当集群调用方增多的时候,如果还按以前的形式,将大大将减少网络的耗费。
元数据中心负责存储包含服务动态化配置、服务定义(如办法签名)等数据,默认提供 Zookeeper, Redis 反对。
3、动静配置核心
次要承当 2 个性能:
A、内部化配置。启动配置的集中式存储(简略了解为 dubbo.properties 的内部化存储)。
B、服务治理。服务治理规定的存储与告诉。
启用动静配置,以 Zookeeper 为例
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
理论反对 Redis、Zookeeper,还有阿波罗等第三方配置核心;能够看到,这些也是不便运维的操作,以前这些操作可能须要重启利用,有了动静配置核心后只有在后盾配置就能够了。
三、灰度公布
咱们来看下如何通过 tag 路由做灰度,假如咱们的利用架构是这样的:
在接入层,即用户浏览器能够拜访到的是商城的接口,而后商城会依赖订单核心服务,订单又会依赖商品核心服务,举 1 个理论的例子,以下单接口为例:
1、用户调用接口下单接口;
2、商城调用订单核心保留订单接口;
3、订单调用商品核心查问接口接口;
以下面的场景来说须要做灰度首先在调用层须要将 tag 传递过去,通过以下代码传递 tag:
RpcContext.getContext().setAttachment(TAG_KEY, "pre");
如何对利用中无侵入呢,官网倡议通过 Filter 或 SPI 的形式实现,具体形式是放在动静配置中,或环境配置中,而后在过滤器初始化的时候读取这个配置,而后每次调用前将 tag 传递到调用链中。
对于非 Java 利用,比方 PHP,如果通过 Hessian 协定调用,通过 http 头传递就能够了,看下 Hessian 的实现:
RpcContext.getContext().setRemoteAddress(request.getRemoteAddr(), request.getRemotePort());
即在 http 头中这样传参数,Hessian Php 客户端的实现,github 上曾经有了,原仓库地址我曾经不记得了,我在 github 上曾经 clone,并做了些优化,地址:
https://github.com/programwit…
function getStream($url, $data, $options)
即在 http 头中加上参数 headerdubbo.tag,下面 tag 内容是写死的,能够依据状况本人读取动静配置或环境配置。
四、Dubbo 环境搭建
1、从 github 下载代码:https://github.com/apache/dubbo
2、切到相应分支,我用的是 2.7.4.1 的;
3、mvn 编译就行了,mvn clean:compile
官网自带了一些样例代码,即 demo 模块,上面是 demo 的代码,实现形式有注解、api、xml 的形式,我用 xml 的形式进行测试,其中 dubbo-demo-xml-provider-service 是我另外加的模块
这是 consumer 的 xml 配置,次要是多了 metadata-report 和 config-center 的标签配置:
<dubbo:application name="demo-consumer"/>
记得在 pom 文件援用 zookeeper 的依赖:
<dependency>
provider 的 xml 配置:
<dubbo:application name="demo-provider"/>
下面加了 hessian 协定,是为了不便 PHP 调用而测试的。
以下是运行后果:
往期精彩文章:
FastDFS 不同步怎么破
OAuth2.0 及 Spring 实现
Mysql 中间件 360 Atlas 踩坑
RabbitMQ 跨机房迁徙数据零失落
[](http://mp.weixin.qq.com/s?__b…
继续获取最新中间件等技术,请关注公众号: