1、什么是分布式系统
分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统)而不是硬件。
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。
首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。

单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
2、Dubbo可以满足的需求

在大规模服务化之前,应用可能只是通过 RMI 或 Hessian 等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过 F5 等硬件进行负载均衡。
1.当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。
此时需要一个服务注册中心,动态地注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover,降低对 F5 硬件负载均衡器的依赖,也能减少部分成本。
2.当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
这时,需要自动画出应用间的依赖关系图,以帮助架构师理清关系。
3.接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?
为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阈值,记录此时的访问量,再以此访问量乘以机器数反推总容量。
以上是 Dubbo 最基本的几个需求。此时Dubbo就应运而生了
3.dubbo的基本架构

init:初始化
async:异步调用
sync:同步调用
节点角色说明
| 节点 | 角色说明 |
|---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
4.springboot整合dubbo
通过以上了解,相信我们都对dubbo有了一个基本的了解,下面我们就来讲如何使用dubbo
要使用dubbo,通过上面对dubbo架构图的了解,注册中心是必不可少的。现在注册中心有很多,而dubbo官方推荐我们使用zookeeper注册中心。
4.1 zookeeper的安装
zookeeper在windows和linux都可以使用,而作为开发者,我们当然是优先使用linux环境。
首先我们去官网下载好zookeeper压缩包。
下载地址http://mirror.bit.edu.cn/apache/zookeeper/
然后登陆自己的服务器,将压缩包上传入自己的服务器
然后使用cd命令进入压缩包所在文件夹

输入解压命令
tar -zxvf zookeeper-3.4.14.tar.gz
cd /zookeeper-3.4.14
进入该文件夹,再进入配置文件文件夹
cd /conf

将zoo_sample.cfg 复制一份并命名为zoo.cfg

cp zoo_sample.cfg zoo.cfg
然后进入该文件修改配置
vim zoo.cfg

修改dataDir属性 ,改为上图所示,路径可以自定义。tickTime根据个人需求修改。最好改长一点。个人经验。
复制完之后也可以忽略上一步,不做修改.
zookeeper安装和配置好之后就可以搭建环境了。
5.整合dubbo
5.1、环境搭建
首先搭建一个父工程,然后搭建相关子模块。

所有的子模块都依赖于父模块。
分别是接口模块、实体类模块、服务生产者模块和消费者模块,如上图所示。
具体搭建可以自行百度springboot如何搭建maven父子工程。
在父工程中引入dubbo相关依赖
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!--zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- 引入zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
版本可以统一管理
5.2 定义接口以及服务注册
在接口模块common-interface中定义接口

public interface UserService {
List<User> findAll();
}
dubbo中服务提供者的配置
server:
port: 8081
#dubbo配置
dubbo:
application:
#服务名
name: service-provider
registry:
#注册中心地址 就是自己zookeeper所在服务器的ip加端口号
address: zookeeper://127.0.0.1:2181
#扫描注解包的路径
scan:
base-packages: com.anxin
在服务生产者模块中实现该接口,前提是该模块要在pom文件中依赖于接口模块

@Component
@Service// 注意这里的@service注解不是spring的注解,用于向zookeeper注册中心注册服务
//而是 org.apache.dubbo.config.annotation.Service包下的service的注解
//低版本的dubbo是org.alibaba.dubbo.config.annotation.Service包
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAll() {
return userMapper.selectList(null);
}
}
dao层我使用了mybatis-plus,查询user表中的所有信息

在这里就不多说了
5.3、服务发现与调用
相关配置
server:
port: 8180
dubbo:
application:
name: consumer
registry:
address: zookeeper://123.57.153.14:2181

@RestController
@RequestMapping("/user")
public class UserController {
//服务发现,使用dubbo的@Reference注解
@Reference
private UserService userService;
@GetMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
}
代码编写已经完成了,接下来我们就可以测试了
5.4 测试
启动服务提供者模块和消费者模块

这里使用dubbo admin图形界面管理工具,相当于监控中心。
我们发现服务已经正常注册到注册中心了,并且消费者已经正常发现了该服务。
接下来我们就调用该接口

一切正常,查到了相关数据,调用成功。
收工!
本文深入探讨分布式系统概念,解析Dubbo微服务框架的核心需求与架构,指导如何整合Spring Boot与Dubbo,实现服务注册、发现及调用,助力企业级应用的高效开发。

331

被折叠的 条评论
为什么被折叠?



