分布式调用与高并发处理 Dubbo分布式调用(一)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 分布式调用与高并发处理 Dubbo分布式调用(一)

一、Dubbo概念

1.1 什么是分布式系统

单机架构

一个系统业务量很小的时候所有的代码都放在一个项目中就好了,然后这个项目部署在一台服务器上,整个项目所有的服务都由这台服务器提供。

缺点:

  • 服务性能存在瓶颈
  • 代码量庞大,系统臃肿,牵一发动全身
  • 单点故障问题

集群架构

单机处理到达瓶颈的时候,你就把单机复制几份,这样就构成了一个集群。

集群存在的问题:

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

什么是分布式

分布式架构就是将一个完整的系统,按照业务功能,拆分成一个个独立的子系统,在分布式结构中每个子系统就被称为“服务”。这些子系统能够独立运行在web容器中它们之间通过RPC方式通信。

分布式的优势:

  1. 系统之间的耦合度大大降低,可以独立开发独立部署独立测试系统与系统之间的边界非常明确排错也变得相当容易,开发效率大大提升。
  2. 系统之间的耦合度降低,从而系统更易于扩展。我们可以针对性地扩展某些服务。
  3. 服务的复用性更高。比如,当我们将用户系统作为单独的服务后,该公司所有的产品都可以使用该系统作为用户系统,无需重复开发。

三者区别

总结:

将一套系统拆分成不同子系统部署在不同服务器上(这叫分布式),然后部署多个相同的子系统在不同的服务器上(这叫集群)。

集群:多个人在一起作同样的事 。

分布式 :多个人在一起作不同的事 。

1.2 什么是RPC

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务。RPC是一种技术思想而非一种规范或协议。

大白话理解就是:RPC让你用别人家的东西就像自己家的一样。

RPC两个作用:

  • 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法
  • 隐藏底层网络通信的复杂性,让我们更加专注业务逻辑。

常见 RPC 技术和框架:

  • 阿里的 Dubbo/Dubbox、Google gRPC、Spring Cloud。

1.3 Dubbo简介

Dubbo是什么

Apache Dubbo是一款高性能、轻量级的开源服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

Dubbo能做什么

  1. 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
  2. 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
  3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者,就是将服务注册到zookeeper。

注意:

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可。

Dubbo支持的协议

协议是两个网络实体进行通信的基础,数据在网络上从一个实体传输到另一个实体,以字节流的形式传递到对端。在这个字节流的世界里,如果没有协议,就无法将这个一维的字节流重塑成为二维或者多维的数据结构以及领域对象。

Dubbo支持的协议

  • Dubbo协议
  • Hessian协议
  • HTTP协议
  • RMI协议
  • WebService协议
  • Memcached协议
  • Redis协议

推荐:

使用Dubbo协议。

1.4 Dubbo核心组件

注册中心Registry

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

其主要作用如下:

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

常见得注册发现服务

常见的注册中心有zookeeper 、eureka、consul、etcd。

服务提供者Provider

服务的提供方

服务消费者Consumer

调用远程服务的服务消费方,包租婆就是生产者,中介就是注册中心,租客就是消费者。

监控中心Monitor

主要负责监控统计调用次数和调用时间等。

Dubbo 工作流程

二、Dubbo配置开发环境

2.1 Docker安装zookeeper

下载Zookeeper镜像

docker pull zookeeper:3.5.9

启动运行容器

docker run --name zk -d -p 2181:2181 zookeeper:3.5.9

参数:

  • --name zk:镜像名称zk
  • -d:守护进程运行
  • -p:映射端口号

进入容器

docker exec -it zk /bin/bash

参数:

  • exec:在运行的容器中执行命令
  • -it:交互式

2.2 Docker安装Dubbo-Admin管理平台

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.100:2181 \
-e admin.config-center=zookeeper://192.168.66.100:2181 \
-e admin.metadata-report.address=zookeeper://192.168.66.100: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

需要注意的是需要将docker下的zookeeper和dubbo-admin服务都开启。

三、Dubbo入门案例

3.1 需求介绍

单体架构

分布式架构

订单服务

功能如下:

  • 创建订单
  • 根据用户id查询订单详情

用户服务

  • 创建订单
  • 根据用户id查询订单详情

3.2  配置开发环境

1.创建Maven项目

通过创建多模块项目实现不同的模块。

2.设置JDK版本

<profiles>
        <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>
    </profiles>

maven默认的jdk是1.5版本

3.设置项目Dubbo-demo为父项目

<packaging>pom</packaging>

只需要将项目的打包方式设置为pom即可。此时父项目的src可删除。

4.修改字符编码

File->Settings->Editor->File Encodings

5.配置忽略描述文件

File->Editor->File Types->Ignore Files and Folders

*.md;*.gitignore;.mvn;.idea;

6.设置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>

3.3 生产者工程配置

1.创建服务消费者SpringBoot项目模块

2.为生产者项目指定父项目

<parent>
        <groupId>com.zj</groupId>
        <artifactId>Dubbo-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

修改子模块的父项目。

3. 指定父项目的子模块

加入下面配置

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

4.父项目加入生产者模块

在pom.xml文件中加入

<modules>
        <module>dubbo-producer</module>
    </modules>

5.在生产者项目引入依赖

<!-- 整合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>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
4月前
|
消息中间件 Java Linux
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
|
4月前
|
监控 Dubbo 前端开发
快速入门分布式系统与Dubbo+zookeeper Demo
快速入门分布式系统与Dubbo+zookeeper Demo
469 0
|
3月前
|
消息中间件 数据挖掘 程序员
【建议收藏】高并发下的分布式事务:如何选择最优方案?
本文介绍了分布式事务的三种常见解决方案。在分布式系统中,事务处理变得复杂,需确保ACID特性。TCC(Try-Confirm-Cancel)方案适用于严格资金要求的场景,如银行转账,通过预留、确认和取消步骤确保一致性。可靠消息最终一致性方案适合一致性要求较低的场景,如电商积分处理,通过消息中间件实现最终一致性。最大努力通知方案则用于允许不一致的场景,如数据分析,通过重复通知尽可能达成一致性。选择合适的方案取决于具体应用场景。
107 5
|
2月前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
|
2月前
|
消息中间件 缓存 监控
如何设计一个秒杀系统,(高并发高可用分布式集群)
【7月更文挑战第4天】设计一个高并发、高可用的分布式秒杀系统是一个非常具有挑战性的任务,需要从架构、数据库、缓存、并发控制、降级限流等多个维度进行考虑。
84 1
|
3月前
|
存储 NoSQL Java
探索Java分布式锁:在高并发环境下的同步访问实现与优化
【6月更文挑战第30天】Java分布式锁在高并发下确保数据一致性,通过Redis的SETNX、ZooKeeper的临时节点、数据库操作等方式实现。优化策略包括锁超时重试、续期、公平性及性能提升,关键在于平衡同步与效率,适应大规模分布式系统的需求。
88 1
|
2月前
|
设计模式 安全 NoSQL
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
43 0
|
2月前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
42 0
|
2月前
|
存储 NoSQL Java
探索Java分布式锁:在高并发环境下的同步访问实现与优化
【7月更文挑战第1天】在分布式系统中,Java分布式锁解决了多节点共享资源的同步访问问题,确保数据一致性。常见的实现包括Redis的SETNX和过期时间、ZooKeeper的临时有序节点、数据库操作及Java并发库。优化策略涉及锁超时、续期、公平性及性能。选择合适的锁策略对高并发系统的稳定性和性能至关重要。
119 0
|
3月前
|
缓存 NoSQL 数据库
分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
83 0