Dubbo从入门到实战
一. 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-impl,dubbo-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-impl和order-impl,可以看到zk客户端注册了生产者和消费者的信息
此时,订单服务访问接口 http://localhost:8082/orderToMember,可以成功从会员服务拿到信息
三. 搭建DubboAdmin监控平台
下载dubbo-admin.zip,解压到tomcat的webapps目录下,并修改dubbo.properties的连接地址即可,启动tomcat:
可以看到服务的信息,以及调用链;DubboAdmin底层实现连接ZooKeeper信息,进行解析转化成页面进行展示。
【小结】:Dubbo在zookeeper注册采用持久节点+临时节点,下图红色箭头的为持久节点,因为接口一般都不会变,蓝色箭头为临时节点,当项目停了,下面的子文件就不存在了,见右图。
Dubbo从入门到实战相关推荐
- Dubbo 一篇文章就够了:从入门到实战
一 为什么需要 dubbo 很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知 ...
- (Java每日一谈:第四日——幸福的四象限)主流框架:Dubbo基础实战篇--Dubbo快速入门
在昨天的Dubbo基础篇中,小编对Dubbo的相关基础理论知识进行了一个详细的解释,如果大家对这一块的知识感到好奇,推荐大家可以去阅读一下小编昨天写的Dubbo相关知识点,今天小编会进行Dubbo实用 ...
- 开放下载 | 和 4000+Java 开发者共读《Spring Cloud Alibaba 从入门到实战》
Spring Cloud Alibaba 脱胎于阿里中间件团队内部,经受了阿里多年海量业务场景的考验,是目前最成熟.功能最丰富也最有前景的 Spring Cloud 实现.相信在未来 Spring C ...
- 阿里云开发者学院电子书《Dubbo分布式服务治理实战》重磅来袭!
简介:Dubbo 是阿里巴巴开源的高性能分布式 RPC 服务治理框架,已经捐献给 Apache 开源组织,最新的版本是 3.0.在阿里巴巴.工行.电信.银联.中国人寿.网易.滴滴.当当等互联网公司中大 ...
- 开发工具篇第三讲:Maven从入门到实战
本文是开发工具篇第三讲:maven 从入门到实战 文章目录 1.什么是maven? 2.Maven能为我们解决什么问题? 3.说说maven有什么优缺点? 4.什么是Maven的坐标? 5.讲一下ma ...
- 【技术手册】Java 开发者必备手册《Spring Cloud Alibaba 从入门到实战》
Java 开发者必备手册<Spring Cloud Alibaba 从入门到实战> 简介 大咖寄语 目录 精彩导读 基础知识篇 分布式配置 服务注册与发现 分布式服务调用 服务熔断和限流 ...
- 《Go语言从入门到实战》学习笔记(1)——Go语言学习路线图、简介
非常有幸在<极客时间>上看到<Go语言从入门到实战>这门课程,本课程的作者给出了较为详细的学习路线图,具体如下: 学习路线图 学习目的 个人学习的目的主要是了解Go语言的基本 ...
- PyTorch深度学习入门与实战(案例视频精讲)
作者:孙玉林,余本国 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2020-07-01 PyTorch深度学习入门与实战(案例视频精讲)
- 7-Python3从入门到实战—基础之数据类型(字典-Dictionary)
Python从入门到实战系列--目录 字典的定义 字典是另一种可变容器模型,且可存储任意类型对象:使用键-值(key-value)存储,具有极快的查找速度: 字典的每个键值(key=>value ...
最新文章
- Window10 64位,通过Python读取.mif, shp文件
- 前端学习路线_前端学习路线图
- 怎么把python结果全部显示-python – 如何展开输出显示以查看更多列?
- strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
- java抛异常 代替返回_请问业务层方法是抛出一个异常好还是返回一个结果更好...
- 设计模式之开放封闭原则
- [原] insert into … on duplicate key update / replace into 多行数据
- CSS:input输入框以及button按钮初始细节
- 查看dll函数接口的参数的方法
- 夏普打印机提示需要维护请联系服务器,夏普打印机错误代码fk3的解决办法
- 电子信息产业发展研究院副主任杨春立:基于数字孪生的智慧城市顶层设计探索与实践...
- 性能优化实战-sql递归查询效率低下
- IOS开发之——硬件开发-加速计传感器(03)
- 用自己的域名配置动态域名解析(DDNS)
- HTML常用标签(上)
- C++ P1082 同余方程
- 在外包干了几年,感觉自己都快费了
- 信号与系统_第二章 连续系统的时域分析
- 拆解「千言数据集:文本相似度」竞赛第一背后的故事
- Word插入的表格如何拆分单元格
热门文章
- DEFT: Detection Embeddings for Tracking论文解读
- DOS命令不需格式化U盘-FAT32轻松转换成NTFS
- 99、插值法,函数逼近,曲线拟和,数值积分,数值微分,解线性方程组的直接方法,解线性方程组的迭代法,非线性方程求根,常微分方程的数值解法...
- 如何判断linux使用的是HDD还是SSD、HHD;磁盘阵列RAID
- [CDQ分治与整体二分]个人对CDQ分治与整体二分的理解
- LOAM算法(论文+代码)详解(一)—— 引言+特征提取
- 语法练习:left2
- javad八大基本数据类型
- 【unity】性能优化之——视锥体剔除(Frustum Culling)(一)
- Ant是什么东西(初级)