SpringBoot 07 —— 分布式:Dubbo+Zookeeper

系列文章

SpringBoot 01 —— HelloSpringBoot、yaml配置、数据校验、多环境切换
SpringBoot 02 —— Web简单探究、员工管理系统
SpringBoot 03 —— Spring Security
SpringBoot 04 —— Shiro
SpringBoot 05 —— Swagger
SpringBoot 06 —— 异步任务、邮件任务、定时任务
SpringBoot 07 —— 分布式:Dubbo+Zookeeper



一、分布式系统理论

1、什么是分布式系统?

分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个系统。

分布式系统是由一组计算机节点组成,利用网络通信来完成共同任务,从而协调工作的系统。

分布式系统的出现是为了用廉价、普通的机器完成单个计算机无法完成的计算、存储等任务,其目的是利用更多的机器来处理更多的数据。

image-20210404092046048

分布式系统(distributed system)是建立在网络之上的系统,就像上图,各个服务器通过网络连接起来(HTTP或者RPC)。

只有当单个计算机的处理能力无法满足日益增长的计算、存储等要求时,而硬件提升(例如增加内存、固态硬盘、更好CPU)又面临高昂价格,导致应用程序无法进一步优化,我们才会去考虑分布式系统。

因为分布式系统本身也面临着单个系统的问题,同时由于分布式系统多节点以及网络拓扑结构等,还会引入很多但系统没有的问题,所以一般情况下是不考虑分布式系统的。

 

2、Dubbo文档描述

官方文档:https://dubbo.apache.org/zh/docs/v2.7/user/

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

在这里插入图片描述

  • 单一应用架构

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

    image-20210404094049243

    这种架构适用于小型网站、小型的管理系统,它将所有的功能都部署在一个功能里,简单易用。

    缺点:性能扩展难、协同开发问题、不利于维护升级

  • 垂直应用架构

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

    image-20210404094057751

    通过切分业务来实现各个模块独立部署,降低了维护和部署的难度,团队各司其职更易管理,性能扩展也更方便,更有针对性。

    缺点:公用模块无法重复利用,开发性的浪费

  • 分布式服务架构

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

    image-20210404094517699
  • 流动计算架构

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

image-20210404094736074

 

3、什么是RPC?

且看另一篇文章:https://www.jianshu.com/p/2accc2840a1b

这里简单描述一下文章中的解释。

  1. RPC(Remote Procedure Call),中文是远程过程调用。
  2. 通俗含义就是,我们在服务器A上可以调用服务器B上的函数/方法等。
  3. RPC中的关键:通讯和序列化。(通讯是因为两个服务器不在一个地方,那为什么要序列化?因为我们的对象无法被网线识别,我们服务器A传输的数据只能是0和1,将对象序列化后变为0和1,再到服务器B上进行反序列化,将0和1变为对象。)

 

二、Dubbo+Zookeeper

1、Dubbo介绍

Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

Dubbo 架构特点:连通性、健壮性、伸缩性、以及向未来架构的升级性。

在这里插入图片描述

节点角色说明
Provider暴露服务的服务提供方
Consumer调用远程服务的服务消费方
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心
Container服务运行容器

流程:

  1. 服务容器负责启动,加载,运行服务提供者。

  2. 服务提供者在启动时,向注册中心注册自己提供的服务。

  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。

  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

 

2、Zookeeper

注册中心有很多都可以用,Nacos(阿里的)、Zookeeper、Multicast、Redis、Simple等,在Dubbo文档中,推荐我们使用Zookeeper,所以这里以Zookeeper为例。

Zookeeper就是前面图里的Register,引用百度百科的描述:

Zookeeper是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

  1. 下载地址:http://archive.apache.org/dist/zookeeper/stable/

    从3.5.5开始,我们就应该下载带有bin的包。其他tar.gz的包里面只是源码,无法直接使用。

image-20210404170100565
  1. 修改/conf/zoo_sample.cfg,将其名字改为zoo.cfg
image-20210404170941845
  1. 修改zoo.cfg里的内容,dataDir是后面用于存储数据的,改为自己的文件(data是我自己新建的)。clientPort是端口号。

    image-20210404171014016
  2. 启动测试:

    先启动zkServer.cmd服务器,再启动客户端zkCli.cmd。

    image-20210404171138835

    然后再服务器里试着输入命令进行测试:

    ls / :列出Zookeeper 根下保存的所有节点;

    create -e /zcy 123456:创建一个 /zcy节点,值为123456;

    get /zcy:获取/zcy节点的值

image-20210404171437953

 

3、安装Dubbo-admin

安装Dubbo-admin

dubbo本身并不是一个服务软件。它其实就是一个jar包,能够帮java程序连接到zookeeper,并利用zookeeper消费、提供服务。

为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin,不过这个监控即使不装也不影响使用。

  1. 下载Dubbo-admin:

    GitHub:https://github.com/apache/dubbo-admin/tree/master

    百度网盘:https://pan.baidu.com/s/1nRVsz-_ziGCZk1c5CY-Y_A 提取码: ztrh

    CSDN:https://download.csdn.net/download/qq_39763246/16487698

  2. 解压后用IDEA打开,修改dubbo-admin的appliaction.properties

server.port=7001
spring.velocity.cache=false
spring.velocity.charset=UTF-8
spring.velocity.layout-url=/templates/default.vm
spring.messages.fallback-to-system-locale=false
spring.messages.basename=i18n/message
spring.root.password=root
spring.guest.password=guest
# 这里的端口号要和前面Zookeeper一致
dubbo.registry.address=zookeeper://127.0.0.1:2181
  1. 在右侧Maven选择打包 ( 打包失败 )

    image-20210406094509599
image-20210406094519609

​ 成功后可看到一个jar包

image-20210406094545908
  1. 现启动Zookeeper,再启动该jar包,然后去浏览器输入localost:7001

    输入用户名:root,密码:root

    image-20210406094900401
image-20210406094926224

注:启动jar包可在IDEA中右键该jar包,或者cmd中输入java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

 

4、SpringBoot整合

这里用两个SpringBoot项目模拟两个分布式服务器,它们端口号不同。

创建一个空项目Empty,然后点左上角File—>New—>Module,创建两个SpringBoot项目。

image-20210406122249513

 
提供者

1、创建提供者项目并导入依赖

image-20210406112437367
<!-- Dubbo启动器   -->
<dependency>
  <groupId>org.apache.dubbo</groupId>
  <artifactId>dubbo-spring-boot-starter</artifactId>
  <version>2.7.8</version>
</dependency>

<!-- Zookeeper客户端 -->
<dependency>
  <groupId>com.github.sgroschupf</groupId>
  <artifactId>zkclient</artifactId>
  <version>0.1</version>
</dependency>

<!-- Zookeeper服务端 -->
<dependency>
  <groupId>org.apache.curator</groupId>
  <artifactId>curator-recipes</artifactId>
  <version>5.1.0</version>
</dependency>
<dependency>
  <groupId>org.apache.curator</groupId>
  <artifactId>curator-framework</artifactId>
  <version>5.1.0</version>
</dependency>
<dependency>
  <groupId>org.apache.zookeeper</groupId>
  <artifactId>zookeeper</artifactId>
  <version>3.6.2</version>
  <!-- 排除  slf4j-log4j12  -->
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
  </exclusions>
</dependency>

2、编写配置文件 application.properties

server.port=8081

# 服务应用名称
dubbo.application.name=provider-server
# 注册中心地址 (Zookeeper所在主机的地址,提供者向注册中心提供服务)
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 哪个包下的服务要被注册(即能被远程调用)[也可以在Application中使用@EnableDubbo]
dubbo.scan.base-packages=com.zcy.service

3、编写服务

//--------这是接口------------------------
package com.zcy.service;

public interface Hello {
    String hello();
}

//----------这是实现类--------------------
package com.zcy.service;

import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;

@Service//交给Spring容器
@DubboService//交给Zookeeper注册中心
public class HelloImpl implements Hello {
    @Override
    public String hello() {
        return "Hello, 分布式";
    }
}

 

消费者

1、创建消费者者项目并导入依赖(和提供者的依赖相同)

image-20210406122525959

2、编写配置文件 application.properties

server.port=8082

# 服务应用名称
dubbo.application.name=consumer-server
# 注册中心地址 (Zookeeper所在主机的地址,消费者向注册中心拿取服务)
dubbo.registry.address=zookeeper://127.0.0.1:2181

3、创建服务(和消费者的接口路径相同)

//只需要接口,无需实现类。具体实现在提供者里
package com.zcy.service;

public interface Hello {
    String hello();
}

4、编写MyController

package com.zcy.controller;

import com.zcy.service.Hello;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    //去注册中心引用Provider所提供的服务
    @DubboReference//两种方式:1. pom坐标 2.定义路径相同的接口名
    Hello hello;

    @RequestMapping("/test")
    public String test(){
        return hello.hello();
    }
}

 
执行顺序

  1. 开启Zookeeper 服务端

在这里插入图片描述

  1. 开启dubbo-admin(在cmd或者IDEA中打开)
    在这里插入图片描述

  2. 运行提供者和消费者

  3. 在浏览器输入localhost:7001

    image-20210406122840849
  4. 输入controller的链接

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老板来碗小面加蛋~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值