Dubbo(基础)——学习笔记

Dubbo(基础)——学习笔记

  • 一、拓展知识
    • 1.1 分布式系统
    • 1.2 流动计算架构
    • 1.3 RPC
  • 二、Dubbo 简介和安装
    • 2.1 什么是Dubbo?
    • 2.2 Dubbo 环境搭建
      • 2.2.1 安装和配置zookeeper
      • 2.2.2 启动,停止,查看 命令
    • 2.3 安装 dubbo-admin 管理控制台
      • 2.3.1 下载 dubbo-admin
      • 2.3.2 修改 dubbo-admin 配置
      • 2.3.3 打包 dubbo-admin
      • 2.3.4 上传到服务器并运行
  • 三、Dubbo -(XML 配置)
    • 3.1 分包
    • 3.2 粒度
    • 3.3 创建模块(案例)
  • 四、Dubbo -(注解 配置)
  • 五、Dubbo 整合 SpringBoot
    • 5.1 公共接口
    • 5.2 服务提供模块
    • 5.3 服务消费模块
    • 5.4 项目运行效果

一、拓展知识

1.1 分布式系统

  “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”。分布式系统(distributed system)是建立在网络之上的软件系统。

1.2 流动计算架构

  当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)[ Service Oriented Architecture(面向服务的体系结构)]是关键。
Dubbo(基础)——学习笔记_第1张图片
Dubbo(基础)——学习笔记_第2张图片
图片来自“李金葵 来源:51CTO技术栈”

1.3 RPC

  RPC(Remote Procedure Call)远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
Dubbo(基础)——学习笔记_第3张图片
  一个完整的RPC架构里面包含了四个核心的组件,分别为ClientClient StubServerServer Stub。RPC 两个核心模块:通讯序列化

  • 客户端(Client):服务的调用方。
  • 客户端存根(Client Stub):存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
  • 服务端(Server):真正的服务提供者。
  • 服务端存根(Server Stub):接收客户端发送过来的消息,将消息解包,并调用本地的方法。

远程调用过程:

  • (1) 客户端(client)以本地调用方式(即以接口的方式)调用服务;
  • (2) 客户端存根(client stub)接收到调用后,负责将方法、参数等组装成能够进行网络传输的消息体(将消息体对象序列化为二进制);
  • (3) 客户端通过sockets将消息发送到服务端;
  • (4) 服务端存根( server stub)收到消息后进行解码(将消息对象反序列化);
  • (5) 服务端存根( server stub)根据解码结果调用本地的服务;
  • (6) 本地服务执行并将结果返回给服务端存根( server stub);
  • (7) 服务端存根( server stub)将返回结果打包成消息(将结果消息对象序列化);
  • (8) 服务端(server)通过sockets将消息发送到客户端;
  • (9) 客户端存根(client stub)接收到结果消息,并进行解码(将结果消息反序列化);
  • (10) 客户端(client)得到最终结果。

RPC的主要作用在2、3、4、7、8、9这些步骤。

【注意】无论是何种类型的数据,最终都需要转换成二进制流在网络上进行传输,数据的发送方需要将对象转换为二进制流,而数据的接收方则需要把二进制流再恢复为对象。

二、Dubbo 简介和安装

2.1 什么是Dubbo?

  Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC(远程过程调用) 实现服务的输出和输入功能,可以和Spring框架无缝集成。
  Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用智能容错负载均衡,以及服务自动注册和发现
Dubbo(基础)——学习笔记_第4张图片

  • 服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
  • 服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  • 监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

调用关系

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

2.2 Dubbo 环境搭建

2.2.1 安装和配置zookeeper

  ZooKeeper 是用 Java 编写的,运行在 Java 环境上,因此,在部署 zookeeper 的机器上需要安装Java 运行环境。zookeeper 是作为 duboo 的注册中心
Dubbo(基础)——学习笔记_第5张图片
1) 下载安装包,上传并解压
Dubbo(基础)——学习笔记_第6张图片
Dubbo(基础)——学习笔记_第7张图片
2) 进入conf文件夹下将 zoo_simple.cfg 改名为 zoo.cfgmv zoo_sample.cfg zoo.cfg 这样zookeeper就能读取到该配置文件。(建议在zookeeper目录下新建一个 data目录用于存放zookeeper快照日志目录)其主要配置项如下:
Dubbo(基础)——学习笔记_第8张图片
修改完后按:Esc,在输入:wq(保存退出)。
在这里插入图片描述

配置项 解释
tickTime 用于计算的时间单元,以毫秒为单位。
initLimit 用于集群,允许从节点连接并同步到 master 结点的初始化连接时间,以 tickTime 的倍数表示。
syncLimit 用于集群,master 主节点从从节点之间发送消息,请求和应答时间长度。
dataDir 快照日志目录,是存放内存数据库快照的位置,必须配置。
dataLogDir 事务日志目录,如果不配置会和 dataDir 公用。
clientPort 连接服务器的端口,默认 2181。

2.2.2 启动,停止,查看 命令

功能 命令(目录:/zookeeper/bin)
启动 zookeeper 服务 ./zkServer.sh start
停止 zookeeper 服务 ./zkServer.sh stop
启动 zookeeper 服务 ./zkServer.sh status

Dubbo(基础)——学习笔记_第9张图片

2.3 安装 dubbo-admin 管理控制台

  Dubbo 本身并不是一个服务软件。它其实就是一个 jar 包能够帮你的 java 程序连接到zookeeper,并利用 zookeeper 消费、提供服务。所以你不用在 Linux 上启动什么 dubbo 服务。但是为了让用户更好的管理监控众多的 dubbo 服务,官方提供了一个可视化的监控程序,不过这个监控即使不装也不影响使用。

2.3.1 下载 dubbo-admin

https://github.com/apache/dubbo-admin
下载得到 incubator-dubbo-ops-master.zip

2.3.2 修改 dubbo-admin 配置

  进入目录,修改 src\main\resources\application.properties 指定 zookeeper 地址。
Dubbo(基础)——学习笔记_第10张图片

【提示】如果我们打包部署在虚拟机上,这个 address 的ip是不用改的。(因为zookeeper服务也在虚拟机上运行的)。

2.3.3 打包 dubbo-admin

Dubbo(基础)——学习笔记_第11张图片
Dubbo(基础)——学习笔记_第12张图片

2.3.4 上传到服务器并运行

1) 上传文件到服务器上。(可以重新给文件命名)
在这里插入图片描述
2) 开启 zookeeper 服务器;
3) 在 /root/jars 目录下使用命令运行该项目文件:java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

  • 提示:可以使用 Ctrl+C命令结束项目进程;或者在运行命令后面加上& 使其进入后台执行,当想结束进程的时候可以使用相应的 pid 来结束进程。

4) 开启 7001 端口,并重启防火墙;
5) 在浏览器中输入地址:192.168.238.66:7001
Dubbo(基础)——学习笔记_第13张图片
6) 进入 dubbo-admin 管理控制台的首页面。
Dubbo(基础)——学习笔记_第14张图片

【注意】

  1. dubbo 的默认端口号是 20880,别忘记防火墙端口放行。

三、Dubbo -(XML 配置)

3.1 分包

  建议将服务接口(service),服务模型(model),服务异常(exception)等均放在 API 包中,因为服务模型及异常也是 API的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。
  如果需要,也可以考虑在 API 包中放置一份 spring 的引用配置,这样使用方只需在spring 加载过程中引用此配置即可,配置建议放在模块的包目录下,以免冲突。

3.2 粒度

  服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo 暂未提供分布式事务支持
  服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸。建议使用有明确语义的接口,以免给后期维护带来不便。

3.3 创建模块(案例)

1) 公共接口 Module(model、service、exception、…)
Dubbo(基础)——学习笔记_第15张图片
2) 服务提供者模块(对上面公共接口的实现,注册在zookeeper,并暴露服务)

    <dependencies>
    	
        <dependency>
            <groupId>com.ccbxgroupId>
            <artifactId>common-interfaceartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
        
        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>dubboartifactId>
            <version>2.6.2version>
        dependency>
        
        <dependency>
            <groupId>org.apache.curatorgroupId>
            <artifactId>curator-frameworkartifactId>
            <version>2.12.0version>
        dependency>
	dependencies>

Dubbo(基础)——学习笔记_第16张图片

【注意】

  1. 服务提供者的xml配置中其中ref是当前模块的注册进容器中的实例bean的名字一致。(默认为bean实例接口或类的首字母小写)
  2. 相反消费者的xml配置中其中id是当前模块要从远程的注册进容器中获取的暴露服务的实例bean的名字一致。

3) 服务消费者模块(订阅 zookeeper 中心提供者暴露的服务接口)
Dubbo(基础)——学习笔记_第17张图片

    
    <dependencies>
        <dependency>
            <groupId>com.ccbxgroupId>
            <artifactId>common-interfaceartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
        
        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>dubboartifactId>
            <version>2.6.2version>
        dependency>
        
        <dependency>
            <groupId>org.apache.curatorgroupId>
            <artifactId>curator-frameworkartifactId>
            <version>2.12.0version>
        dependency>
    dependencies>

4) 运行测试

  1. 将服务提供模块开启;(不要让进程中断,否则服务也就中断了)
  2. 开启消费者模块;从当前 IoC 容器中注入要引用的服务提供模块的接口,调用查看是否正常远程供注册中心订阅服务成功。(不要让进程中断,否则消费服务执行完就也中断了)
    在这里插入图片描述
  3. 在可视化注册中心查看相关服务情况:
    Dubbo(基础)——学习笔记_第18张图片
    Dubbo(基础)——学习笔记_第19张图片
    Dubbo(基础)——学习笔记_第20张图片

四、Dubbo -(注解 配置)

  用 Dubbo 注解配置时,Provider 方和 Consumer 方配置修改如下:

  • a. 在 Provider 方的 xml 配置文件中使用 dubbo:annotation 标签,它的 package 指定要扫描的包,再在 Service 实现类上添加 dubbo 提供的注解@Service,它能注册并暴露服务。
  • b. 在 Consumer 方的 xml 配置文件中使用 dubbo:annotation 标签package 指定要扫描的包,并用 dubbo 提供的 reference 注解把远程服务代理对象注入进来。

服务提供方:


<dubbo:application name="hello-movie-provider">dubbo:application>

<dubbo:registry address="zookeeper://192.168.238.66:2181" />

<dubbo:protocol name="dubbo" port="20880" />

<dubbo:annotation package="com.ccbx.hello.service.impl">dubbo:annotation>
/**
 * 使用 dubbo 提供的service注解,注册并暴露服务。
 * 注意:加了 Dubbo 的@Service 的类必须实现接口,否则报错。
 */
@Service
public class MovieServiceImpl implements MovieService {
    //省略实现接口的代码
}

服务消费者:


<dubbo:application name="hello-user-consumer">dubbo:application>

<dubbo:registry address="zookeeper://192.168.238.66:2181" />

<dubbo:annotation package="com.ccbx.hello.service" >dubbo:annotation>

<context:component-scan base-package="com.ccbx.hello.service">context:component-scan>
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

@Service //这里使用的是 spring的 @Service 注解
public class OrderService {

    @Reference //使用dubbo提供的reference注解引用远程服务
    private MovieService movieService;
    
    //省略相关业务调用代码
}

【注意】

  1. 如果 1 个接口有多个实现类,建议给@Service 添加 version 属性指定类的版本,如version = "1.0.0",@Service 设定版本号后,@Reference 也要设定版本号进行引用。
  2. 加了 Dubbo 的@Service 的类必须实现接口,否则报错:@Service interfaceClass() or interfaceName() or interface class must be present!
  3. 要区分 Dubbo 的@Service 和 Spring 的@Service。

五、Dubbo 整合 SpringBoot

Dubbo(基础)——学习笔记_第21张图片

5.1 公共接口

创建一个普通 maven 工程,里面定义 User 类,UserService 接口。

//注意:要进行序列化远程调用的实体类必须实现序列化接口 Serializable
public class Users implements Serializable {
	//省略代码
}
//公共接口规范
public interface UserService {
    List<Users> getUsersList(Integer uid);
}

5.2 服务提供模块

创建 SpringBoot 项目,命名 server-provider,pom.xml 中添加整合 Dubbo 的起步依赖。

	<dependencies>
		
		
        
        <dependency>
            <groupId>com.ccbxgroupId>
            <artifactId>public-apiartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>

        
        <dependency>
            <groupId>com.alibaba.bootgroupId>
            <artifactId>dubbo-spring-boot-starterartifactId>
            <version>0.2.0version>
        dependency>
    dependencies>
#dubbo配置
dubbo:
  application:
    name: server-provider #程序名称
  registry:
    address: zookeeper://192.168.238.66:2181 #注册中心的地址
  protocol:
    name: dubbo #通信协议
    port: 20880 # 通信端口(本机通信的端口)

创建 Service 实现类,并用 Dubbo 注解@Service 标注该类。

@Service //使用 dubbo的@Service注解
public class UserServiceImpl implements UserService {
	//省略具体实现代码
}
@SpringBootApplication
//启用 Dubbo 组件作为 Spring Beans,相当于DubboComponentScan和EnableDubboConfig组合。
@EnableDubbo
public class ServerProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServerProviderApplication.class, args);
    }
}

5.3 服务消费模块

pom.xml

	<dependencies>
		
        
        <dependency>
            <groupId>com.ccbxgroupId>
            <artifactId>public-apiartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
        
        <dependency>
            <groupId>com.alibaba.bootgroupId>
            <artifactId>dubbo-spring-boot-starterartifactId>
            <version>0.2.0version>
        dependency>
    dependencies>

全局配置文件:

#dubbo配置
dubbo:
  application:
    name:  server-consumer #程序名称
  registry:
    address: zookeeper://192.168.238.66:2181 #注册中心的地址
  protocol:
    name: dubbo #通信协议
    port: 20880 # 通信端口(本机通信的端口)

后端控制器类:

@RestController
public class UserController {

    @Reference //dubbo的注解
    private UserService userService;

    @RequestMapping("getuser/{uid}")
    public List<Users> getUser(@PathVariable("uid") String id){
        return userService.getUsersList(Integer.parseInt(id));
    }
}

消费服务模块的启动类:

@SpringBootApplication
//启用 Dubbo 组件作为 Spring Beans,相当于DubboComponentScan和EnableDubboConfig组合。
@EnableDubbo
public class ServerConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServerConsumerApplication.class, args);
    }
}

5.4 项目运行效果

浏览器请求消费服务接口:
Dubbo(基础)——学习笔记_第22张图片
dubbo-admin 可视化控制台查看:
Dubbo(基础)——学习笔记_第23张图片
Dubbo(基础)——学习笔记_第24张图片
Dubbo(基础)——学习笔记_第25张图片

springboot 整合 dubbo的三种方式请查看(dubbo进阶——学习笔记)。

你可能感兴趣的:(分布式,服务器,zookeeper,分布式,java)