一. Dubbo概述

1. 什么是Dubbo?

一款分布式服务框架,高性能和透明化的RPC远程服务调用方案,SOA服务治理方案。

每天为2千多个服务提供大于30亿次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点以及别的公司的业务中。

2. Dubbo优缺点

优点: 透明化的远程方法调用   像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。 ② 软负载均衡及容错机制   可在内网替代nginx lvs等硬件负载均衡器。 服务注册中心自动注册 & 配置管理  不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。 使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。 ④ 服务接口监控与治理 -Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。

缺点: 只支持Java语言

3. Dubbo架构原理

角色区分:

① Provider: 暴露服务的服务提供方(生产者)

② Consumer: 调用远程服务的服务消费方(消费者)

③ Registry: 服务注册与发现的注册中心(zookeeper,redis等)

④ Monitor: 统计服务的调用次数和调用时间的监控中心(dubbo-admin)

调用流程:

0>服务容器负责启动,加载,运行服务提供者。

1>服务提供者在启动时,向注册中心注册自己提供的服务。

2>服务消费者在启动时,向注册中心订阅自己所需的服务。

3>注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

4>服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用

5>服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

4. Dubbo与SpringCloud的区别

相同点:SpringCloud 和Dubbo可以实现RPC远程调用框架,可以实现服务治理。

不同点:SpringCloud是一套目前比较网站微服务框架了,整合了分布式常用解决方案遇到了问题注册中心Eureka、负载均衡器Ribbon ,客户端调用工具Rest和Feign,分布式配置中心Config,服务保护Hystrix,网关Zuul Gateway ,服务链路Zipkin,消息总线Bus等。 从架构上分析,Dubbo内部实现功能没有SpringCloud强大,只是实现服务治理,缺少分布式配置中心、网关、链路、总线等,如果需要用到这些组件,需要整合其他框架。从更新迭代速度分析,Dubbo目前更新速度没有SpringCloud快,到SpringCloud2.0后SpringCloud会越来完善和稳定。从开发背景角度分析,Dubbo的开发背景是阿里巴巴, 在中国也推出了非常多的优秀的开源框架,但是在SpringCloud的背景是Spring家族,Spring是专注于企业级开源框架开发,在中国,或者在整个世界上Spring框架都应用的非常广泛。所有相对来说SpringCloud的背景比Dubbo更加强大。

二. Dubbo实战(SpringBoot整合Dubbo)

准备工作:本地需要安装zookeeper,并用ZooInspector工具连接成功。

项目结构图:(基于maven的聚合项目)

dubbo-parent为根目录,pom类型;dubbo-api-service为服务接口目录,其下的dubbo-member-service为会员接口服务;dubbo-member-service-impldubbo-order-service-impl为别为会员,订单接口实现(springboot项目)。

本案例即为模拟订单服务调用会员服务,下面开始搭建:


 首先配置各个服务pom依赖关系:

  dubbo-parent

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>dubbo-parent</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>dubbo-api-service</module><module>dubbo-member-service-impl</module><module>dubbo-order-service-impl</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><curator-framework.version>4.0.1</curator-framework.version><zookeeper.version>3.4.13</zookeeper.version><dubbo.starter.version>0.2.0</dubbo.starter.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.starter.version}</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${curator-framework.version}</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>${zookeeper.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
</project>

  dubbo-api-service

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>dubbo-parent</artifactId><groupId>com.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>dubbo-service</artifactId><packaging>pom</packaging><modules><module>dubbo-member-service</module></modules>
</project>

  dubbo-member-service

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>dubbo-service</artifactId><groupId>com.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>dubbo-member-service</artifactId>
</project>

  dubbo-member-service-impl

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>dubbo-parent</artifactId><groupId>com.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>dubbo-member-service-impl</artifactId><dependencies><dependency><groupId>com.example</groupId><artifactId>dubbo-member-service</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>

  dubbo-order-service-impl

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>dubbo-parent</artifactId><groupId>com.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>dubbo-order-service-impl</artifactId><dependencies><dependency><groupId>com.example</groupId><artifactId>dubbo-member-service</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>

  在会员服务接口dubbo-member-service新建MemberService

package com.example.service;
public interface MemberService {String getUser(Long userId);
}

  dubbo-member-service-impl新建MemberServiceImpl,实现MemberService

package com.example.impl;import com.alibaba.dubbo.config.annotation.Service;
import com.example.service.MemberService;
import org.springframework.web.bind.annotation.RequestParam;/*** @Service 发布服务,表示将该接口注册到注册中心上去* @author zhaobin* @date 2019/11/26*/
@Service
public class MemberServiceImpl implements MemberService {public String getUser(@RequestParam Long userId) {System.out.println("会员服务实现,userId为:" + userId);return "会员服务实现,userId为:" + userId;}// dubbo服务发布的时候,采用dubbo注解方式,使用@Service注解进行注入,注意是dubbo提供的@Service注解
}

  会员实现启动类:

package com.example;import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @EnableDubbo 开启Dubbo服务* @author zhaobin* @date 2019/11/26*/
@EnableDubbo
@SpringBootApplication
public class AppMember {public static void main(String[] args) {SpringApplication.run(AppMember.class, args);}
}

  会员实现配置类

server:port: 8081
dubbo:application:name: memberprotocol:# 使用dubbo协议name: dubbo# 发布dubbo端口号为20880port: 20880registry:address: zookeeper://127.0.0.1:2181scan:# dubbo实现类扫包范围base-packages: com.example.impl

  dubbo-order-service-impl新建OrderController

package com.example.controller;import com.alibaba.dubbo.config.annotation.Reference;
import com.example.service.MemberService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** @Reference Dubbo提供 - 调用服务*/
@RestController
public class OrderController {@Reference // 不能用@Autowired注解private MemberService memberService;@RequestMapping("/orderToMember")public String orderToMember(@RequestParam Long userId) {System.out.println("订单服务实现");return memberService.getUser(userId);}}

  订单实现启动类

package com.example;import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@EnableDubbo
@SpringBootApplication
public class AppOrder {public static void main(String[] args) {SpringApplication.run(AppOrder.class, args);}
}

订单实现配置类

server:port: 8082
dubbo:application:name: order
#  protocol:  # 不注册服务,不用加
#    name: dubbo
#    port: 20880registry:address: zookeeper://localhost:2181consumer:timeout: 5000

至此,项目环境搭建完毕,分别启动member-implorder-impl,可以看到zk客户端注册了生产者和消费者的信息

此时,订单服务访问接口 http://localhost:8082/orderToMember,可以成功从会员服务拿到信息

三. 搭建DubboAdmin监控平台

下载dubbo-admin.zip,解压到tomcat的webapps目录下,并修改dubbo.properties的连接地址即可,启动tomcat:

可以看到服务的信息,以及调用链;DubboAdmin底层实现连接ZooKeeper信息,进行解析转化成页面进行展示。

【小结】:Dubbo在zookeeper注册采用持久节点+临时节点,下图红色箭头的为持久节点,因为接口一般都不会变,蓝色箭头为临时节点,当项目停了,下面的子文件就不存在了,见右图。

    

Dubbo从入门到实战相关推荐

  1. Dubbo 一篇文章就够了:从入门到实战

    一 为什么需要 dubbo 很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知 ...

  2. (Java每日一谈:第四日——幸福的四象限)主流框架:Dubbo基础实战篇--Dubbo快速入门

    在昨天的Dubbo基础篇中,小编对Dubbo的相关基础理论知识进行了一个详细的解释,如果大家对这一块的知识感到好奇,推荐大家可以去阅读一下小编昨天写的Dubbo相关知识点,今天小编会进行Dubbo实用 ...

  3. 开放下载 | 和 4000+Java 开发者共读《Spring Cloud Alibaba 从入门到实战》

    Spring Cloud Alibaba 脱胎于阿里中间件团队内部,经受了阿里多年海量业务场景的考验,是目前最成熟.功能最丰富也最有前景的 Spring Cloud 实现.相信在未来 Spring C ...

  4. 阿里云开发者学院电子书《Dubbo分布式服务治理实战》重磅来袭!

    简介:Dubbo 是阿里巴巴开源的高性能分布式 RPC 服务治理框架,已经捐献给 Apache 开源组织,最新的版本是 3.0.在阿里巴巴.工行.电信.银联.中国人寿.网易.滴滴.当当等互联网公司中大 ...

  5. 开发工具篇第三讲:Maven从入门到实战

    本文是开发工具篇第三讲:maven 从入门到实战 文章目录 1.什么是maven? 2.Maven能为我们解决什么问题? 3.说说maven有什么优缺点? 4.什么是Maven的坐标? 5.讲一下ma ...

  6. 【技术手册】Java 开发者必备手册《Spring Cloud Alibaba 从入门到实战》

    Java 开发者必备手册<Spring Cloud Alibaba 从入门到实战> 简介 大咖寄语 目录 精彩导读 基础知识篇 分布式配置 服务注册与发现 分布式服务调用 服务熔断和限流 ...

  7. 《Go语言从入门到实战》学习笔记(1)——Go语言学习路线图、简介

    非常有幸在<极客时间>上看到<Go语言从入门到实战>这门课程,本课程的作者给出了较为详细的学习路线图,具体如下: 学习路线图  学习目的 个人学习的目的主要是了解Go语言的基本 ...

  8. PyTorch深度学习入门与实战(案例视频精讲)

    作者:孙玉林,余本国 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2020-07-01 PyTorch深度学习入门与实战(案例视频精讲)

  9. 7-Python3从入门到实战—基础之数据类型(字典-Dictionary)

    Python从入门到实战系列--目录 字典的定义 字典是另一种可变容器模型,且可存储任意类型对象:使用键-值(key-value)存储,具有极快的查找速度: 字典的每个键值(key=>value ...

最新文章

  1. Window10 64位,通过Python读取.mif, shp文件
  2. 前端学习路线_前端学习路线图
  3. 怎么把python结果全部显示-python – 如何展开输出显示以查看更多列?
  4. strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
  5. java抛异常 代替返回_请问业务层方法是抛出一个异常好还是返回一个结果更好...
  6. 设计模式之开放封闭原则
  7. [原] insert into … on duplicate key update / replace into 多行数据
  8. CSS:input输入框以及button按钮初始细节
  9. 查看dll函数接口的参数的方法
  10. 夏普打印机提示需要维护请联系服务器,夏普打印机错误代码fk3的解决办法
  11. 电子信息产业发展研究院副主任杨春立:基于数字孪生的智慧城市顶层设计探索与实践...
  12. 性能优化实战-sql递归查询效率低下
  13. IOS开发之——硬件开发-加速计传感器(03)
  14. 用自己的域名配置动态域名解析(DDNS)
  15. HTML常用标签(上)
  16. C++ P1082 同余方程
  17. 在外包干了几年,感觉自己都快费了
  18. 信号与系统_第二章 连续系统的时域分析
  19. 拆解「千言数据集:文本相似度」竞赛第一背后的故事
  20. Word插入的表格如何拆分单元格

热门文章

  1. DEFT: Detection Embeddings for Tracking论文解读
  2. DOS命令不需格式化U盘-FAT32轻松转换成NTFS
  3. 99、插值法,函数逼近,曲线拟和,数值积分,数值微分,解线性方程组的直接方法,解线性方程组的迭代法,非线性方程求根,常微分方程的数值解法...
  4. 如何判断linux使用的是HDD还是SSD、HHD;磁盘阵列RAID
  5. [CDQ分治与整体二分]个人对CDQ分治与整体二分的理解
  6. LOAM算法(论文+代码)详解(一)—— 引言+特征提取
  7. 语法练习:left2
  8. javad八大基本数据类型
  9. 【unity】性能优化之——视锥体剔除(Frustum Culling)(一)
  10. Ant是什么东西(初级)