最近新加入一个项目组,所使用的是Dubbo,采用的架构是分布式架构,数据库采用MySQL分片。之前也接触过一下,但为了能更好融入团队,所以找Dubbo官网看文档。

才发现Dubbo的官网已搬去apache。好吧,最近太关注于SpringCloud。

附上现在Dubbo地址 :http://dubbo.apache.org/zh-cn/docs/user/quick-start.html 。

Dubbo由于之前没咋更新,被人诟病。但无可争议,这是一个很强大的服务治理框架,历经双十一考验,有着非常完整的中文文档。

十月底,看到一则消息,Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器!附上阿里的spring-cloud地址:

https://github.com/spring-cloud-incubator/spring-cloud-alibaba 。

什么鬼, 似乎跑题了耶,废话不说,先来Dubbo试一波。

Dubbo 是什么

  一款分布式服务框架

  高性能和透明化的RPC远程服务调用方案

  SOA服务治理方案

顺便一提RPC:

来自百度百科:

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

大概意思可以这么理解:现在有两台服务器A、B,分别部署不同的应用a,b。当A服务器想要调用B服务器上应用b提供的函数或方法的时候,由于不在一个内存空间,不能直接调用,需要通过网络传输调用。 A可以通过使用参数将信息传送给B,而后可以通过传回的结果得到信息。而这一过程,对于开发人员来说是透明的。

官网Dubbo 架构图

节点角色说明
节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器

调用关系说明

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo使用

Dubbo是基于Spring的Schema进行扩展,对应用没有任何API侵入,就是说开发者采用只需要采用Spring即可开发。

本次Demo 采用maven+idea 进行开发,使用zookeeper作为服务注册中心。

Server 端开发

工程结构如下所示

maven工程一般第一步就是配置pom.xml,导入jar包。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6.  
  7. <groupId>dubbo</groupId>
  8. <artifactId>dubbo</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <dependencies>
  11. <dependency>
  12. <groupId>org.springframework</groupId>
  13. <artifactId>spring-context</artifactId>
  14. <version>4.2.6.RELEASE</version>
  15. </dependency>
  16.  
  17. <dependency>
  18. <groupId>com.alibaba</groupId>
  19. <artifactId>dubbo</artifactId>
  20. <version>2.5.3</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.101tec</groupId>
  24. <artifactId>zkclient</artifactId>
  25. <version>0.9</version>
  26. </dependency>
  27. </dependencies>
  28.  
  29. </project>

接下来是provider接口

  1. package com.dubbotest;
  2.  
  3. public interface Provider{
  4. String send(String name) throws Exception;
  5.  
  6. }

provider实现类

  1. package com.dubbotest.impl;
  2.  
  3. import com.dubbotest.Provider;
  4.  
  5. public class DemoServiceImpl implements Provider {
  6. public String send(String name) throws Exception {
  7. System.out.println(" got a argument: " + name);
  8. return "message from provider: " + name;
  9. }
  10. }

配置application.xml,使用Spring暴露服务

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://code.alibabatech.com/schema/dubbo
  8. http://code.alibabatech.com/schema/dubbo/dubbo.xsd
  9. ">
  10. <!-- 具体的实现bean -->
  11. <bean id="demoService"
  12. class="com.dubbotest.impl.DemoServiceImpl" />
  13. <!-- 提供方应用信息,用于计算依赖关系 -->
  14. <dubbo:application name="anyname_provider" />
  15. <!-- 使用zookeeper注册中心暴露服务地址 -->
  16. <dubbo:registry address="zookeeper://127.0.0.1:2181" />
  17. <!-- 用dubbo协议在20880端口暴露服务 -->
  18. <dubbo:protocol name="dubbo" port="20880" />
  19. <!-- 声明需要暴露的服务接口 -->
  20. <dubbo:service interface="com.dubbotest.Provider"
  21. ref="demoService" />
  22.  
  23. </beans>

启动类

  1. package com.dubbo.test;
  2.  
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4.  
  5. public class Test {
  6. public static void main(String[] args) throws Exception {
  7. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
  8. context.start();
  9. System.out.println(" provider run ");
  10. System.in.read(); // 按任意键退出
  11. }
  12. }

Client端开发

接下来,client差不多 ,工程结构如下所示

也需配置接口,正常来说,可以将server的接口打成jar包,然后client端导入即可。

配置application.xml,此处是consumer,用于远程服务调用。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://code.alibabatech.com/schema/dubbo
  8. http://code.alibabatech.com/schema/dubbo/dubbo.xsd
  9. ">
  10. <!-- 具体的实现bean -->
  11. <bean id="demoService"
  12. class="com.dubbotest.impl.DemoServiceImpl" />
  13. <!-- 提供方应用信息,用于计算依赖关系 -->
  14. <dubbo:application name="anyname_provider" />
  15. <!-- 使用zookeeper注册中心暴露服务地址 -->
  16. <dubbo:registry address="zookeeper://127.0.0.1:2181" />
  17. <!-- 用dubbo协议在20880端口暴露服务 -->
  18. <dubbo:protocol name="dubbo" port="20880" />
  19. <!-- 声明需要暴露的服务接口 -->
  20. <dubbo:service interface="com.dubbotest.Provider"
  21. ref="demoService" />
  22.  
  23. </beans>

配置consumer 启动类

  1. package com.dubbo.test;
  2.  
  3. import com.dubbotest.Provider;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. import java.text.Format;
  7. import java.text.SimpleDateFormat;
  8. import java.util.Date;
  9.  
  10. public class Consumer {
  11. public static void main(String[] args)throws Exception {
  12. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
  13. context.start();
  14. Provider demoService = (Provider) context.getBean("demoService"); // 获取远程服务代理
  15. Format sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  16. String mgs = demoService.send(sdf.format(new Date()));// 执行远程方法
  17. System.out.println( mgs);// 显示结果
  18.  
  19. }
  20. }

OK,接下来,就是测试是否发送成功。先启动ZK,再启动Test类,在控制台可以看到  provider run ,说明启动成功。

再启动consumer 类。可看到控制台,

说明调用成功。

总结

通过这个Demo,我们可以看到,使用Dubbo,我们只需使用Spring配置即可开发,对应用无入侵性。

其次我们无需关注底层的线程IO模型,网络通讯问题。

还有就是服务自动注册与发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

Dubbo 体验(一)的更多相关文章

  1. 阿里 RPC 框架 DUBBO 初体验

    最近研究了一下阿里开源的分布式RPC框架dubbo,楼主写了一个 demo,体验了一下dubbo的功能. 快速开始 实际上,dubbo的官方文档已经提供了如何使用这个RPC框架example代码,基于 ...

  2. dubbo实战之一:准备和初体验

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. Dubbo基础一之实战初体验

    本以为写这个小作文没什么难度的,可是好像并不是.前段时间重心放在驾考科目二,就想着小作文科二考过了再写也不是事,因为都实战过了.今天想着写却发现脑袋里啥都想不起来了,得翻项目和笔记回忆一下.所以还是那 ...

  4. dubbo初体验

    最近需要开发部门中某个大数据量的提取的功能,加到了一个ElasticSearch的群.在群里听说到一个框架叫dubbo,阿里系开源软件.听到群友谈的神乎其神的,什么什么功能切分多协议栈,高并发等等等. ...

  5. dubbo初学,快速体验

    本篇是基于spring框架的XML配置开发的dubbo应用程序,开发工具intellij idea,旨在对dubbo的快速理解和上手. 废话不多说,代码撸起来!!! 1.首先,新建一个maven工程, ...

  6. Dubbo(一) -- 初体验

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架. 一.Dubbo出现的背景 随着互联网的发展,网站应用的规模不断扩大,常规的 ...

  7. 【微服务】Dubbo初体验

    一.前言 之前微服务这块只用过SpringCloud搭建,但是最近面试会被问到dubbo框架,虽然之前也学了但是都忘了,故写此博客加深印象. 二.原理简介 Dubbo是一个分布式服务框架,以及阿里巴巴 ...

  8. Spring Cloud Alibaba 初体验(三) Nacos 与 Dubbo 集成

    一.新建项目 新建项目,只放置接口,用于暴露 Dubbo 服务接口 public interface GreetingService { String greeting(); } 二.provider ...

  9. DubboSPI机制二之Dubbo中SPI初体验

    Dubbo高级之一SPI机制之JDK中的SPI - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中阐述了JDK标准的SPI,并对其应用做了相应的实践.在实际应用中,很多框架都会对其进行扩展 ...

随机推荐

  1. python接口自动化发送get请求 详解(一)

    前言:接口自动化实现自动化脚本比较稳定,主要用到requests模块,后面我会把这个模块单独拉出来写一下. 一.环境安装 1.用pip安装requests模块 >>pip install ...

  2. Ambiguous mapping found. Cannot map 'XXXController' bean method

    springMVC报错,原因方法之间@RequestMapping()到了同一个地址,导致springmvc无法定位

  3. 链路层寻址与 ARP

    一. MAC 地址 不是主机或路由器具有链路层地址,而是它们的适配器(即网络接口)具有链路层地址.因此,具有多个网络接口的主机或路由器将具有与之相关联的多个链路层地址. 然而,链路层交换机并不具有与它 ...

  4. jenkins+appium android app自动化测试

    jenkins安装 pytest+jenkins安装+allure报告 新建任务 其他默认,保存 立即构建 test_login.py from src.pages import login_page ...

  5. 认识CSS3新增选择器和样式

    前端之HTML5,CSS3(二) CSS3新增选择器和样式 CSS3新增选择器 结构伪类选择器 :first-child:选取父元素中的第一个子元素的指定选择器 :last-child:选取父元素中的 ...

  6. 使用NHibernate(5)-- Linq To NHibernate

    Linq是NHibernate所支持的查询语言之一,对于Linq的实现在源码的src/Linq目录下.以下是一个使用Linq进行查询数据的示例: var users = session.Query&l ...

  7. python-fifo管道文件通信

    #!/usr/bin/python #coding=utf-8 import os,sys,multiprocessing,time try: os.mkfifo('file') except :pa ...

  8. ubuntu下终端路径显示的修改

    环境:ubuntu16.04 ubuntu在默认情况下是显示绝对路径的,进入目录过长的时候让人感觉很不舒服,现在修改成只显示当前目录 vim ~/.bashrc 找到这句 # If this is a ...

  9. InterView之C/CPP

    CPP 引用 什么是"引用"?申明和使用"引用"要注意哪些问题? 答:引用就是某个目标变量的别名(alias),对应用的操作与对变量直接操作效果完全相同.申明一 ...

  10. 【JVM调优系列】----CPU过高的分析与解决方案

    1.首先通过top命令查询当前进程所占cpu的一个比重