一、Dubbo概念
1.1 什么是分布式系统
单机架构
一个系统业务量很小的时候所有的代码都放在一个项目中就好了,然后这个项目部署在一台服务器上,整个项目所有的服务都由这台服务器提供。
缺点:
- 服务性能存在瓶颈
- 代码量庞大,系统臃肿,牵一发动全身
- 单点故障问题
集群架构
单机处理到达瓶颈的时候,你就把单机复制几份,这样就构成了一个集群。
集群存在的问题:
当你的业务发展到一定程度的时候,你会发现一个问题无论怎么增加节点,貌似整个集群性能的提升效果并不明显了。这时候,你就需要使用分布式架构了。
什么是分布式
分布式架构就是将一个完整的系统,按照业务功能,拆分成一个个独立的子系统,在分布式结构中,每个子系统就被称为“服务”。这些子系统能够独立运行在web容器中,它们之间通过RPC方式通信。
分布式的优势:
- 系统之间的耦合度大大降低,可以独立开发、独立部署、独立测试,系统与系统之间的边界非常明确,排错也变得相当容易,开发效率大大提升。
- 系统之间的耦合度降低,从而系统更易于扩展。我们可以针对性地扩展某些服务。
- 服务的复用性更高。比如,当我们将用户系统作为单独的服务后,该公司所有的产品都可以使用该系统作为用户系统,无需重复开发。
三者区别
总结:
将一套系统拆分成不同子系统部署在不同服务器上(这叫分布式),然后部署多个相同的子系统在不同的服务器上(这叫集群)。
集群:多个人在一起作同样的事 。
分布式 :多个人在一起作不同的事 。
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能做什么
- 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
- 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
- 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的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>