《分布式_Dubbo》_Dubbo快速入门和配置汇总

Dubbo 快速入门,记录下

概要:

  1. Dubbo 快速入门
  2. Dubbo 常规配置说明

一、Dubbo 快速入门


Dubbo核心功能解释

dubbo 阿里开源的一个SOA服务治理框架,从目前来看把它称作是一个RPC远程调用框架更为贴切。单从RPC框架来说,功能较完善,支持多种传输和序列化方案。所以想必大家已经知道他的核心功能了:就是远程调用

image.png

快速演示Dubbo的远程调用

实现步骤

  • 创建服务端项目
    • 引入dubbo 依赖
    • 编写服务端代码
  • 创建客户端项目
    • 引入dubbo 依赖
    • 编写客户端调用代码

dubbo 引入:【注解模式好像需要2.7】

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.2</version>
</dependency>

dubbo 默认依懒:


image.png
image.png

客户端代码:

/**
 * @author huey China.
 * @Description : spring 整合 dubbo  multicast
 * @Date Created in 2018/11/26 下午23:02
 */
public class YoungClient {

    // 基于 URL构建远程服务
    public UserService buildRemoteService(String remoteUrl) {

            //引用配置
            ReferenceConfig<UserService> referenceConfig = new ReferenceConfig();
            referenceConfig.setInterface(UserService.class);
            referenceConfig.setRegistry(new RegistryConfig("multicast://224.1.2.3:11111"));
            referenceConfig.setUrl(remoteUrl);
            //应用
            referenceConfig.setApplication(new ApplicationConfig("young-app"));
            referenceConfig.setLoadbalance("roundrobin");
            return referenceConfig.get();
    }

    public static void main(String[] args) throws IOException {
        YoungClient client = new YoungClient();
        UserService service = client.buildRemoteService(null);
        int count = 0;
        String cmd;
        while (!"exist".equals(cmd = read())) {
            System.out.println(
                    // 测试
                    service.getUser(1111)
            );
        }
    }

    private static String read() throws IOException {
        byte[] b = new byte[1024];
        LineNumberReader lineNumber = new LineNumberReader(
                new InputStreamReader(System.in));
        return lineNumber.readLine();
    }

}

服务端代码:

/**
 * @author huey China.
 * @Description : spring 整合 dubbo  multicast
 * @Date Created in 2018/11/26 下午23:02
 */
public class SimpleServer {
    public void openService(int port)throws Exception {
        // 服务配置
        ServiceConfig<UserService> serviceConfig = new ServiceConfig();
        // 设置服务接口
        serviceConfig.setInterface(UserService.class);
        // 设置开放的协议
        serviceConfig.setProtocol(new ProtocolConfig("dubbo", port));
        // 设置一个空的注册中心
        serviceConfig.setRegistry(new RegistryConfig("multicast://224.1.2.3:11111")); //网卡需要支持 走过虚拟网卡不支持的坑 设置host 本机名称和物理ip映射
        // 设置服务当前所在应用
        serviceConfig.setApplication(new ApplicationConfig("simple-app"));
        // 设置服务实现对象

        UserServiceImpl ref = new UserServiceImpl();        serviceConfig.setRef(ref);
        // 暴露服务
        serviceConfig.export();
        List<URL> list = serviceConfig.getExportedUrls();
        ref.setPort(list.get(0).getPort());
        System.out.println("服务已开启 :" + list.get(0).getPort());
    }

    // 20880 20881
    public static void main(String[] args) throws Exception {
        new SimpleServer().openService(-1);
        System.in.read();
    }
}

运行验证截图

image.png

image.png

基于Dubbo实现服务集群:

在上一个例子中如多个服务的集群?即当有多个服务同时提供的时候,客户端该调用哪个?以什么方式进行调用以实现负载均衡?
一个简单的办法是将多个服务的URL同时设置到客户端并初始化对应的服务实例,然后以轮询的方式进行调用。


image.png

但如果访问增大,需要扩容服务器数量,那么就必须增加配置重启客户端实例。显然这不是我们愿意看到的。Dubbo引入了服务注册中的概念,可以解决动态扩容的问题。


image.png

演示基于注册中心实现服集群:

  • 修改服务端代码,添加multicast 注册中心。
  • 修改客户端代码,添加multicast 注册中心。
  • 观察 多个服务时,客户端如何调用。
  • 观察 动态增减服务,客户端的调用。
# 服务端连接注册中心
serviceConfig.setRegistry(new RegistryConfig("multicast://224.1.1.1:2222"));
# 客户端连接注册中心
referenceConfig.setRegistry(new RegistryConfig("multicast://224.1.1.1:2222"));
查看 基于**UDP** 占用的2222 端口
netstat -ano|findstr 2222

基于spring IOC维护Dubbo 实例
在前面两个例子中 出现了,ApplicationConfig、ReferenceConfig、RegistryConfig、com.alibaba.dubbo.config.ServiceConfig等实例 ,很显然不需要每次调用的时候都去创建该实例那就需要一个IOC 容器去管理这些实例,spring 是一个很好的选择。

提供者配置----------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <!-- 应用配置  ApplicationConfig -->
    <dubbo:application name="simple-server"/>
    <!--register 默认等于true 把服务暴露到注册中心去-->
    <dubbo:registry address="zookeeper://192.168.59.2:2181"/>
    <!-- 服务配置  ServiceConfig-->
    <!--  service默认值 protocol默认值-->
    <dubbo:provider protocol="dubbo" port="-1" timeout="6000"/>

    <dubbo:service interface="huey.dubboserver.demo.UserService"
                   ref="userService" timeout="4000">
        <dubbo:method name="getUser" timeout="2000"/>
    </dubbo:service>
    <bean id="userService" class="huey.dubboserver.demo.impl.UserServiceImpl"></bean>

</beans>

提供者服务暴露代码:

ApplicationContext context = new ClassPathXmlApplicationContext("/spring-provide.xml");
((ClassPathXmlApplicationContext) context).start();
System.in.read();

消费者配置---------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <!-- 客户端应用名称-->
    <dubbo:application name="young-app"/>
    <!--注册中心地址  registryConfig-->
    <dubbo:registry address="zookeeper://192.168.59.2:2181"></dubbo:registry>
    <!--引用服务  referenceConfig-->
    <!--ID是必需项-->
    <dubbo:consumer timeout="5000"></dubbo:consumer>
    <dubbo:reference id="userService" interface="huey.dubboserver.demo.UserService"
                     timeout="3000">
    </dubbo:reference>

</beans>

消费者调用代码:

ApplicationContext context = new ClassPathXmlApplicationContext("/spring-consumer.xml");
UserService userService = context.getBean(UserService.class);
UserVo u = userService.getUser(1111);
System.out.println(u);

运行验证截图

image.png

image.png

二、Dubbo常规配置说明


Dubbo配置的整体说明:

| 标签 | 用途 | 解释 |
|:----|:----|
| <dubbo:application/> | 公共 | 用于配置当前应用信息,不管该应用是提供者还是消费者 |
| <dubbo:registry/> | 公共 | 用于配置连接注册中心相关信息 |
| <dubbo:protocol/> | 服务 | 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受 |
| <dubbo:service/> | 服务 | 用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心 |
| <dubbo:provider/> | 服务 | 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选 |
| <dubbo:consumer/> | 引用 | 当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选 |
| <dubbo:reference/> | 引用 | 用于创建一个远程服务代理,一个引用可以指向多个注册中心 |
| <dubbo:method/> | 公共 | 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息 |
| <dubbo:argument/> | 公共 | 用于指定方法参数配置 |

配置关系图:

image.png

配置分类
所有配置项分为三大类。

  1. 服务发现:表示该配置项用于服务的注册与发现,目的是让消费方找到提供方。
  2. 服务治理:表示该配置项用于治理服务间的关系,或为开发测试提供便利条件。
  3. 性能调优:表示该配置项用于调优性能,不同的选项对性能会产生影响。

dubbo 配置的一些套路:

先来看一个简单配置
<dubbo:service interface="huey.dubboserver.demo.UserService" timeout="2000">
通过字面了解 timeout即服务的执行超时时间。但当服务执行真正超时的时候 报的错跟timeout并没有半毛钱的关系,其异常堆栈如下:

image.png

可以看到错误表达的意思是 因为Channel 关闭导致 无法返回 Response 消息。
出现这情况的原因在于 虽然timeout 配置在服务端去是用在客户端,其表示的是客户端调用超时间,而非服务端方法的执行超时。当我们去看客户端的日志时候就能看到timeout异常了

image.png

类似这种配在服务端用在客户端的配置还有很多,如retries/riː'traɪ/(重试次数)、async/əˈsɪŋk/(是否异步)、loadbalance(负载均衡)。。。等。
套路一:服务端配置客户端来使用
注:其参数传递机制是 服务端所有配置都会封装到URL参数,在通过注册中心传递到客户端

如果需要暴露多个服务的时候,每个服务都要设置其超时时间,貌似有点繁琐。Dubbo中可以通过 <dubbo:provider> 来实现服务端缺省配置。它可以同时为 <dubbo:service> 和 <dubbo:protocol> 两个标签提供缺省配置。如:

#相当于每个服务提供者设置了超时时间 和重试次数
<dubbo:provider timeout="2000" retries="2"></dubbo:provider>

同样客户端也有缺省配置标签:<dubbo:consumer>,这些缺省设置可以配置多个 通过 <dubbo:service provider="providerId"> ,如果没指定就用第一个。

套路二:<dubbo:provider>与<dubbo:service> ,<dubbo:consumer>与<dubbo:reference>傻傻分不清楚

在服务端配置timeout 之后 所有客户端都会采用该方超时时间,其客户端可以自定义超时时间吗?通过 <dubbo:reference timeout="2000"> 可以设定或者在<dubbo:consumer timeout="2000"> 也可以设定 甚至可以设定到方法级别 <dubbo:method name="getUser" timeout="2000"/>。加上服务端的配置,超时总共有6处可以配置。如果6处都配置了不同的值,最后肯定只会有一个超时值生效,其优先级如下:

image.png

小提示:通过DefaultFuture的get 方法就可观测到实际的超时设置。
com.alibaba.dubbo.remoting.exchange.support.DefaultFuture

套路三:同一属性到处配置,优先级要小心。

总结

如果本地有虚拟网卡 注意本地虚拟网卡的坑,可根据Dubbo源代码追踪,设置本地物理Ip和本机名称(如hueydeMackBook.local)做映射

参考

官网:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
GitBook:https://dubbo.gitbooks.io/dubbo-user-book/content/preface/background.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • dubbo.xsd 文件说明 当我们要使用Dubbo进行 配置时,需要像下面那样引入dubbo.xsd这个文件. ...
    Mis_Gtw阅读 1,092评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,559评论 18 139
  • 0 准备 安装注册中心:Zookeeper、Dubbox自带的dubbo-registry-simple;安装Du...
    七寸知架构阅读 13,955评论 0 88
  • 要多吃水果 苹果橙子芒果 要多读书 小说历史哲学 要多表达爱 微笑拥抱亲吻 要多多努力 做一个可爱的人 在某人眼里...
    迷雾古巨基阅读 104评论 0 0
  • 一个客户成交了两个多小时[捂脸][捂脸][捂脸],他告诉我习惯不办卡,这习惯的力量好可怕!我给他分析习惯有很多优点...
    城市牧笛阅读 191评论 0 0