Dubbo2.7试用

一、Dubbo介绍

Java开发的同学相信对Dubbo都有了解,Dubbo是阿里开源的RPC/服务治理框架,以下是百度的解释:

Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1] Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 https://baike.baidu.com/item/Dubbo/18907815?fr=aladdin

首先Dubbo是一个RPC框架,如果系统是微服务架构,服务之间可以通过Dubbo来调用,解耦调用者(Consumer)和服务提供者(Provider)的依赖问题,为了统一概念,后面都以Consumer称呼服务调用者,以Provider称呼服务提供者;

没有RPC框架,可能要在配置文件中硬编码很多服务地址,有了Dubbo之后,Consumer不用关心有多少服务提供者,打个比方我想调用用户服务,你只要把服务名告诉Dubbo,Dubbo会自动寻找相应的Provider,而不用在配置文件中写死,真正解放了运维。

Dubbo具体的功能就不在这里解释了,可以参考官方手册:

http://dubbo.apache.org/zh-cn/docs/user/new-features-in-a-glance.html

二、Dubbo2.7介绍

Dubbo最新版本为2.7.6,2.7以后有大的变化,主要特性有:

1、Tag路由

标签路由通过将某一个或多个服务的提供者划分到同一个分组,约束流量只在指定分组中流转,从而实现流量隔离的目的,可以作为蓝绿发布、灰度发布等场景的能力基础。

这是1个实际的例子:

 force: false
  runtime: true
  enabled: true
  key: tradecenter
  tags:
   - name: pre
      addresses: ["172.21.107.21:20880"]

假设当前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());
 
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
    String key = enumeration.nextElement();
    if (key.startsWith(DEFAULT_EXCHANGER)) {
        RpcContext.getContext().setAttachment(key.substring(DEFAULT_EXCHANGER.length()),
                request.getHeader(key));
    }
}
 
try {
    skeleton.invoke(request.getInputStream(), response.getOutputStream());
} catch (Throwable e) {
    throw new ServletException(e);
}

即在http头中这样传参数,Hessian Php客户端的实现,github上已经有了,原仓库地址我已经不记得了,我在github上已经clone,并做了些优化,地址:

https://github.com/programwithebay/fasthessian

function getStream($url, $data, $options)
{
    $curl        = new Curl;
    $curlOptions = [];
    $curlHeader  = [
        'Content-Type'    => 'application/binary',
        'headerdubbo.tag' => 'pre',
    ];
    if (!empty($options->transportOptions)) {

即在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"/>
    <dubbo:metadata-report address="zookeeper://172.21.104.63:2181" />
    <dubbo:registry id="zookeeper" address="zookeeper://172.21.104.63:2181" />
    <dubbo:config-center address="zookeeper://172.21.104.63:2181" timeout="10000" />

记得在pom文件引用zookeeper的依赖:

<dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-metadata-report-zookeeper</artifactId>
            <version>${project.parent.version}</version>
         </dependency>

provider的xml配置:

 <dubbo:application name="demo-provider"/>
    <dubbo:consumer filter="default" timeout="5000"/>

    <dubbo:registry address="zookeeper://172.21.104.63:2181"  id="zookeeper" />
    <dubbo:config-center address="zookeeper://172.21.104.63:2181" />
    <dubbo:metadata-report address="zookeeper://172.21.104.63:2181" />

    <dubbo:protocol name="hessian" port="10890" dispather="all" threadpool="fixed"
                    threads="10" id="hessian" server="jetty"/>

    <dubbo:protocol name="dubbo" id="dubbo" port="20890" />

    <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl" />

    <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" registry="zookeeper"
                   version="1.0.0" tag="" protocol="dubbo,hessian" />

上面加了hessian协议,是为了方便PHP调用而测试的。

以下是运行结果:

本文分享自微信公众号 - 程序员升级之路(gh_1fab42db66cb),作者:刘江华

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis迁移工具redis-port使用&代码分析

    Redis现在是互联网公司缓存的标配了,在一些场景下我们需要将redis的数据从一些实例迁移到其它实例上,一个好的Redis数据迁移工具可以起到事半功倍的效果,...

    心平气和
  • 如何做好稳定性

    电商类的网站不可避免要面对大促的话题,每次大促对系统的可用性要求很高,是对技术人的一次考验,所以要做好整套的方案来保证。

    心平气和
  • Skywalking Php二:代码分析

    前面我们介绍了Skywalking php如何安装的,这篇文章我们来分析Skywalking php是如何实现拦截的。

    心平气和
  • 使用SpringBoot+Dubbo搭建一个简单的分布式服务

    开始实战之前,我们先来简单的了解一下这样几个概念:Dubbo、RPC、分布式、由于本文的目的是带大家使用SpringBoot+Dubbo 搭建一个简单的分布式服...

    Java团长
  • 使用SpringBoot+Dubbo搭建一个简单的分布式服务

    开始实战之前,我们先来简单的了解一下这样几个概念:Dubbo、RPC、分布式、由于本文的目的是带大家使用SpringBoot+Dubbo 搭建一个简单的分布式服...

    好好学java
  • kafka删除topic数据

    https://blog.csdn.net/u013256816/article/details/80418297

    py3study
  • Mysql体系结构

    客户端连接器 mysql为外部程序提供的客户端connector,例如 PHP JAVA .NET RUBY 连接管理 管理客户端连接的相关操作,例如 ...

    dys
  • 014 linux 命令行工具jq

    上善若水.夏
  • Python调用JavaScript代码

    在写爬虫经常会遇到很多JS代码,比如说某些参数加密,可以只用用Python来翻译,但是有时候代码不容易阅读(JS渣渣),所以这里直接去找一条捷径,直接用Pyth...

    小歪
  • 2015全球网络安全市场报告(下)

    微信号:freebuf 八、行业垂直企业 大型银行及金融服务企业将在对抗网络袭击中增加网络安全支出。 ● 摩根大通首席执行官Jamie Dimon在2014年年...

    FB客服

扫码关注云+社区

领取腾讯云代金券