 
 
目录
Dubbo概念_什么是分布式系统
什么是分布式
Dubbo概念_什么是RPC
Dubbo概念_简介
Dubbo概念_核心组件
Dubbo配置开发环境_Zookeeper注册中心
Dubbo配置开发环境_管理控制台
Dubbo入门案例_需求介绍
Dubbo入门案例_配置开发环境
Dubbo入门案例_服务生产者配置
Dubbo入门案例_服务生产者代码编写
Dubbo概念_什么是分布式系统
 
 
单机架构
一个系统业务量很小的时候所有的代码都放在一个项目中就好了, 然后这个项目部署在一台服务器上,整个项目所有的服务都由这台 服务器提供。
缺点:
- 服务性能存在瓶颈
- 代码量庞大,系统臃肿,牵一发动全身
- 单点故障问题
集群架构
单机处理到达瓶颈的时候,你就把单机复制几份,这样就构成了一 个集群。

集群存在的问题:
当你的业务发展到一定程度的时候,你会发现一个问题无论怎 么增加节点,貌似整个集群性能的提升效果并不明显了。这时 候,你就需要使用分布式架构了。
什么是分布式

分布式架构就是将一个完整的系统,按照业务功能,拆分成一个个 独立的子系统,在分布式结构中,每个子系统就被称为“服务”。这 些子系统能够独立运行在web容器中,它们之间通过RPC方式通信。
分布式的优势:
1、系统之间的耦合度大大降低,可以独立开发、独立部署、独立测试,系统与系统之间的边界 非常明确,排错也变得相当容易,开发效率大大提升。
2、系统之间的耦合度降低,从而系统更易于扩展。我们可以针对性地扩展某些服务。
3、服务的复用性更高。比如,当我们将用户系统作为单独的服务后,该公司所有的产品都可以 使用该系统作为用户系统,无需重复开发。
三者区别

总结: 将一套系统拆分成不同子系统部署在不同服务器上(这叫分布 式),然后部署多个相同的子系统在不同的服务器上(这叫集 群)。
集群:多个人在一起作同样的事 。
分布式 :多个人在一起作不同的事 。
实时学习反馈
1.下列属于分布式的优势的是___。
A 系统之间的耦合度大大降低
B 服务的复用性更高
C 独立部署、独立测试
D 以上都是正确
2. 下列描述分布式架构正确的是____。
A 将一套系统拆分成不同子系统部署在不同服务器上
B 所有的代码都放在一个项目中
C 多个相同的子系统部署在不同的服务器上
D 以上都是错误
Dubbo概念_什么是RPC

什么是RPC
RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务。
 
大白话理解就是:RPC让你用别人家的东西就像自己家的一样。
 
 
RPC两个作用:
- 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法
- 隐藏底层网络通信的复杂性,让我们更加专注业务逻辑。
常用的RPC框架
RPC是一种技术思想而非一种规范或协议。
常见 RPC 技术和框架:
阿里的 Dubbo/Dubbox、Google gRPC、Spring Cloud。
实时效果反馈
1. RPC是_____技术。
A 本地调用
B 远程过程调用
C 过程调用
D 服务调用
2. 下列__框架不是RPC框架。
A Dubbo
B Spring Cloud
C GooglegRPC
D Spring MVC
Dubbo概念_简介

Dubbo是什么
Apache Dubbo是一款高性能、轻量级的开源服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
Dubbo能做什么
1、透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵 入。
2、软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3、服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地 址,并且能够平滑添加或删除服务提供者

注意:
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有 任何API侵入,只需用Spring加载Dubbo的配置即可。
Dubbo支持的协议
协议是两个网络实体进行通信的基础,数据在网络上从一个实体传 输到另一个实体,以字节流的形式传递到对端。在这个字节流的世 界里,如果没有协议,就无法将这个一维的字节流重塑成为二维或 者多维的数据结构以及领域对象。

Dubbo支持的协议
- Dubbo协议
- Hessian协议
- HTTP协议
- RMI协议
- WebService协议
- Memcached协议
- Redis协议
推荐: 使用Dubbo协议。
实时效果反馈
1. Apache Dubbo是_____框架。
A 高性能Web服务框架
B 高性能Web平台
C 高性能RPC分布式服务框架
D RPC框架
2. 使用分布式架构主要原因___。
A 加快响应速度
B 提高系统的高可用性
C 可以承受更大规模的并发流量
D 提高系统的安全性
Dubbo概念_核心组件

注册中心Registry
在Dubbo微服务体系中,注册中心是其核心组件之一。Dubbo通过 注册中心实现了分布式环境中各服务之间的注册与发现,是各个分布式节点之间的纽带。

其主要作用如下:
动态加入:一个服务提供者通过注册中心可以动态地把自己暴露给其他消费者,无须消费者 逐个去更新配置文件。
动态发现:一个消费者可以动态地感知新的配置、路由规则和新的服务提供者,无须重启服 务使之生效。
动态调整:注册中心支持参数的动态调整,新参数自动更新到所有相关服务节点。
统一配置:避免了本地配置导致每个服务的配置不一致问题。
常见得注册发现服务
常见的注册中心有zookeeper 、eureka、consul、etcd。

服务提供者Provider
服务的提供方
服务消费者Consumer
调用远程服务的服务消费方

监控中心Monitor
主要负责监控统计调用次数和调用时间等。
工作流程

实时效果反馈
1. Apache Dubbo技术中下列____技术可以做服务注册发现服务。
A Spring
B Nginx
C zookeeper
D Redis
Dubbo配置开发环境_Zookeeper注册中心

下载Zookeeper镜像
docker pull zookeeper:3.5.9启动运行容器
docker run --name zk -d -p 2181:2181
zookeeper:3.5.9参数:
-d:守护进程运行
-p:映射端口号
进入容器
docker exec -it zk /bin/bash参数:
exec:在运行的容器中执行命令
-it:交互式
Dubbo配置开发环境_管理控制台

介绍
Dubbo-admin管理平台,图形化的服务管理页面,安装时需要指定注册中心地址,即可从注册中心中获取到所有的提供者/消费者进行配置管理。
下载Dubbo-Admin镜像
docker pull docker.io/apache/dubbo-admin启动运行容器
docker run -d \
--name dubbo-admin \
-p 9600:8080 \
-e
admin.registry.address=zookeeper://192.168.66.102:2181 \
-e admin.config-center=zookeeper://192.168.66.102:2181 \
-e admin.metadata-report.address=zookeeper://192.168.66.102:2181 \
--restart=always \ docker.io/apache/dubbo-admin参数:
- --restart:always 容器退出时总是重启
- admin.registry.address:注册中心
- admin.config-center:配置中心
- admin.metadata-report.address:元数据中心
可视化界面
浏览器输入http://192.168.66.100:9600,用户名root 密码 root

Dubbo入门案例_需求介绍
单体架构

项目架构

订单服务
功能如下:
创建订单
根据用户id查询订单详情
用户服务
功能如下:
创建订单
根据用户id查询订单详情
Dubbo入门案例_配置开发环境
创建Maven项目

创建项目

设置JDK版本
  <profile>
        <id>jdk-1.8</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>
        </activation>
        <properties>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
          <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </properties>
    </profile>设置项目为父类型

<packaging>pom</packaging>修改字符编码
File->Settings->Editor->File Encodings

配置忽略文件
File->Editor->File Types->Ignore Files and Folders
*.md;*.gitignore;.mvn;.idea;设置aliyun阿里云maven本地仓库镜像
<repositories>
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
</repositories>Dubbo入门案例_服务生产者配置
创建服务消费者SpringBoot项目

创建SpringBoot项目

创建子模块

选择组件

修改父项目配置
服务生产者修改父项目配置
<parent>
 <groupId>com.tong</groupId>
 <artifactId>dubbo-demo</artifactId>
 <version>1.0-SNAPSHOT</version>
</parent>父项目加入配置
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
        <relativePath/>
</parent>父项目加入模块
在pom.xml文件中加入
<modules>
     <module>dubbo-provider</module>
</modules>引入依赖
<!-- 整合dubbo -->
<dependency>
     <groupId>io.dubbo.springboot</groupId>
     <artifactId>spring-boot-starter-dubbo</artifactId>
     <version>1.0.0</version>
</dependency>
<!-- zookeeper客户端 -->
<dependency>
     <groupId>com.101tec</groupId>
     <artifactId>zkclient</artifactId>
     <version>0.7</version>
</dependency>Dubbo入门案例_服务生产者代码编写
创建订单实体类
/**
* 订单模型
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order implements Serializable {
    // 订单id
    private Long id;
    // 用户id
    private Long userId;
    // 订单总价格
    private Double prict;
    // 收货人手机号
    private String mobile;
    // 收货人地址
    private String address;
    // 支付类型 1:微信 2:支付宝
    private Integer pay_method;
}编写订单接口
public interface IOrderService {
    //创建订单
    void createOrders(Orders orders);
    //根据用户id查询订单详情
    Orders findByuserId(Long userid);
}创建统一返回结果集实体类
/**
 * 统一返回结果集
 * @param <T>
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> implements Serializable {
   // 返回结果编码
   private Integer code;
   // 返回结果描述
   private String message;
   // 数据
   private T data;
   private CommonResult(Integer code,String message){
       this(code,message,null);
   }
}编写订单业务实现类
import com.alibaba.dubbo.config.annotation.Service;
import com.tong.entity.CommonResult;
import com.tong.entity.Order;
import com.tong.service.IOrderService;
/**
* 订单功能业务层
*/
@Service
public class OrderServiceImpl implements IOrderService {
    /**
     * 创建订单
     * @param order
     * @return
     */
    @Override
    public void create(Orders order) {
        CommonResult commonResult = new CommonResult();
        // 返回结果编码
        commonResult.setCode(200);
        // 返回结果描述信息
        commonResult.setMessage("创建成功");
        return commonResult;
   }
   /**
     * 根据用户id查询订单详情
     * @param userId
     * @return
     */
    @Override
    public CommonResult<Orders> findByUserId(Long userId) {
        //TODO 模拟数据库操作
        CommonResult commonResult = new CommonResult();
         // 返回结果编码
        commonResult.setCode(200);
        // 返回结果描述信息
        commonResult.setMessage("查询成功");
        // 返回结果集
        Orders orders = new Orders();
        orders.setId(1L);
        orders.setUserId(1L);
        orders.setPrict(121.1);
        orders.setMobile("18588888888");
        orders.setAddress("北京市海淀区中关村");
        orders.setPay_method(1);
        commonResult.setData(order);
        return commonResult;
   }
}服务生产者编写配置文件
# 端口号
server.port=9090
# 1. 配置项目名称
spring.dubbo.application.name=user-service
# 2. 配置注册中心地址
spring.dubbo.registry.address=zookeeper://192.168.66.100
spring.dubbo.registry.port=2181
# 3. 指定dubbo使用的协议、端口
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
# 4. 指定注册到zk上超时时间,ms
spring.dubbo.registry.timeout=10000
# 5. 配置Dubbo包扫描
spring.dubbo.scan=com.tong.service接口实现类编写Dubbo注解
import com.alibaba.dubbo.config.annotation.Service;
@service // 将这个类提供的方法(服务) 对外发布。将访问的地址 ip 端口路径 注册到注册中心
//@Service //将该类的对象创建出来放到spring的IOC容器中。 bean定义
public class OrderServiceImpl implements IOrderService {
}可视化平台





















