Springboot整合Dubbo + zookeeper

本文深入探讨分布式系统概念,解析Dubbo微服务框架的核心需求与架构,指导如何整合Spring Boot与Dubbo,实现服务注册、发现及调用,助力企业级应用的高效开发。

1、什么是分布式系统

​ 分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统)而不是硬件。

​ 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

​ 首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。

image

单一应用架构

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

分布式服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

流动计算架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

2、Dubbo可以满足的需求

image

​ 在大规模服务化之前,应用可能只是通过 RMI 或 Hessian 等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过 F5 等硬件进行负载均衡。

1.当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。

​ 此时需要一个服务注册中心,动态地注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover,降低对 F5 硬件负载均衡器的依赖,也能减少部分成本。

2.当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。

​ 这时,需要自动画出应用间的依赖关系图,以帮助架构师理清关系。

3.接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?

​ 为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阈值,记录此时的访问量,再以此访问量乘以机器数反推总容量。

以上是 Dubbo 最基本的几个需求。此时Dubbo就应运而生了

3.dubbo的基本架构

img

init:初始化

async:异步调用

sync:同步调用

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

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图形界面管理工具,相当于监控中心。

我们发现服务已经正常注册到注册中心了,并且消费者已经正常发现了该服务。

接下来我们就调用该接口
在这里插入图片描述

一切正常,查到了相关数据,调用成功。

收工!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值