1.什么是dubbo?
1.1.简介
DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容。
1.2.RPC
1.3.官网
注意:我们此处演示使用的dubbo版本是2.5.3版本,2.6.x以上的版本主要是提供给springboot整合dubbo使用的。
关于dubbo源码的下载,以及dubbo-admin(管理控制台),dubbo-monitor-simple(简易监控中心),dubbo-registry-simple(简易注册中心)等war包的下载,可参考文档:https://blog.csdn.net/xuruanshun/article/details/102738098
3.Dubbo框架说明
3.1.背景
3.2.服务治理
3.3.架构
调用关系:
1. 服务容器负责启动,加载,运行服务提供者。
2. 服务提供者在启动时,向注册中心注册自己提供的服务。
3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
3.4.Dubbo的优缺点
3.5.Dubbo注册中心
对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;
对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。
而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。
通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。
Dubbo提供的注册中心有如下几种类型可供选择:
Zookeeper注册中心(推荐)
Redis注册中心(推荐)
Multicast注册中心
Simple注册中心
4.Dubbo快速入门
4.1.环境步骤:
- 安装Zookeepr启动
- 创建Maven项目搭建生产者和消费者
- 安装DubboAdmin平台,实现监控
4.2.Zookeeper介绍与安装
Dubbo注册中心采用的是Zookeeper。为什么采用Zookeeper呢?
Zookeeper是一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据 ,这里能很好的作为Dubbo服务的注册中心。
Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求
注:zookeeper的安装和启动,可以参考文档:https://blog.csdn.net/ring300/article/details/80446918
4.3.创建Maven工程
项目结构,分为三个项目:
itmayiedu-dubbo-provider-api 服务提供者对外接口
itmayiedu-dubbo-provider 服务提供者接口实现
itmayiedu-dubbo-consumer 服务消费者
1.创建maven项目 itmayiedu-dubbo-provider-api
2.MembeService接口
package com.itmayiedu.member.service;
public interface MemberService {
String getUser(String id);
}
3.创建maven项目 itmayiedu-dubbo-provider
4.pom文件添加依赖
<?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.itmayiedu</groupId>
<artifactId>itmayiedu-dubbo-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 依赖服务提供者对外接口-->
<dependency>
<groupId>com.itmayiedu</groupId>
<artifactId>itmayiedu-dubbo-provider-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--zookeeper客户端工具,用于连接zookeeper-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!--dubbo底层依赖netty框架实现-->
<dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
<version>3.2.5.Final</version>
</dependency>
<!--spring框架依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- dubbo依赖,排除spring,netty依赖,使用我们自己添加的依赖,dubbo提供的版本太低-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
注:如果无法引入itmayiedu-dubbo-provider-api依赖,则先将itmayiedu-dubbo-provider-api项目install到本地仓库。
5.MemberServiceImpl实现类
package com.itmayiedu.member.service.impl;
import com.itmayiedu.member.service.MemberService;
public class MemberServiceImpl implements MemberService {
public String getUser(String userId) {
System.out.println("订单服务调用会员服务userId = " + userId);
return "订单服务调用会员服务成功!";
}
}
6.配置文件 dubbo-provider.xml
<?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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--定义了提供方应用信息,服务名称,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识 -->
<dubbo:application name="member-provider" />
<!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper -->
<dubbo:registry address="zookeeper://localhost:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 使用 dubbo 协议实现定义好的 api.PermissionService 接口 -->
<!-- 定义服务接口 -->
<dubbo:service interface="com.itmayiedu.member.service.MemberService"
ref="memberService" protocol="dubbo" />
<!-- 定义服务接口实现类 -->
<bean id="memberService" class="com.itmayiedu.member.service.impl.MemberServiceImpl" />
</beans>
7.启动类MemberApp
package com.itmayiedu.member.service;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MemberApp {
public static void main(String[] args) throws Exception{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml");
context.start();
System.out.println("会员服务已经启动!!!");
System.in.read();//保持服务一直运行
}
}
8.先启动zookeeper,再启动MemberSApp启动类,查看控制台。
9.创建maven项目 itmayiedu-dubbo-consumer
10.pom文件添加依赖
<?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.itmayiedu</groupId>
<artifactId>itmayiedu-dubbo-consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 依赖服务提供者对外接口-->
<dependency>
<groupId>com.itmayiedu</groupId>
<artifactId>itmayiedu-dubbo-provider-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--zookeeper客户端工具,用于连接zookeeper-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!--dubbo底层依赖netty框架实现-->
<dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
<version>3.2.5.Final</version>
</dependency>
<!--spring框架依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- dubbo依赖,排除spring,netty依赖,使用我们自己添加的依赖,dubbo提供的版本太低-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
11.配置文件 dubbo-consumer.xml
<?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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--定义了提供方应用信息,服务名称,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识 -->
<dubbo:application name="order-consumer" />
<!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper -->
<dubbo:registry address="zookeeper://localhost:2181" />
<!-- 使用 dubbo 协议实现定义好的 api.PermissionService 接口 -->
<!-- 定义服务提供者接口,需要调用的接口api -->
<dubbo:reference id="memberService" interface="com.itmayiedu.member.service.MemberService"/>
</beans>
12.OrderService类,调用服务提供者对外接口。
package com.itmayiedu.order.service;
import com.itmayiedu.member.service.MemberService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class OrderService {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-consumer.xml");
context.start();
MemberService memberService = context.getBean(MemberService.class);
String result = memberService.getUser("1");
System.out.println("result:" + result);
}
}
13.启动OrderService类,查看控制台:
itmayiedu-dubbo-provider项目控制台:
远程调用成功!!!
5.监控
原理:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
5.1.搭建监控服务
监控服务的安装包就是前面说的三个模块包中的其中一个。
5.2.修改配置文件
修改注册中心的地址:意思是将监控中心注册到注册中心
5.3.在dubbo-b中配置监控
注意:监控服务本身也被注册到了注册中心,和提供者一样都是监控中心的一个服务。所以可以在注册中心自动查找监控服务,并发送统计数据。
当消费者调用提供者服务时,提供者和消费者都会向监控中心自动发送统计数据。
5.4.启动
启动成功:
5.5.查看界面
说明:端口在这里指定:
5.6.功能
查看服务:
统计:
图表:
6.管理
dubbo提供了一套在线管理整个服务的功能,管理控制台为阿里内部裁剪版本,开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。
dubbo-admin底层实现连接zookeeper信息,进行解析转换程页面进行展示。
6.1.安装
将dubbo-admin-2.5.3.war部署到tomcat的webapps目录下:
6.2.修改配置文件
6.3.启动zookeeper,再启动tomcat
6.4.查看管理界面
使用用户登录:
效果:
功能:
Dubbo服务信息以持久+临时混合进行存储。
服务基本信息以持久进行存储,服务接口信息一般不会发生改变,采用持久节点进行存储。
服务接口地址以临时节点进行存储,因为地址是动态,所以采用临时存放。