SpringBoot整合分布式Dubbo+Zookeeper

1.理论概述

1.1.分布式

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

由多个系统集成成一个整体,提供多个功能,组合成一个板块,用户在使用上看起来是一个服务。(比如淘宝网)。

起源
分布式系统出现的原因是:用多个廉价的、普通的机器完成单个计算机无法完成的计算、存储任务

分布式使用
只有单个节点处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(内存、磁盘、CPU)高昂得不偿失的时候,应用程序也不能进一步优化的时候,才考虑分布式。

因为分布式系统是建立在网络之上的软件系统,网络是不安全不稳定的,所以会带来单系统没有的问题,为了解决这些问题,又引入更多的机制、协议,带来更多的问题。

集群与分布式区别

在这里插入图片描述
【集群】:多个相同的微服务,提供同一个功能

【分布式】:多个不同功能的微服务,提供不同的功能

1.2.RPC

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。

也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。RPC就是要像调用本地的函数一样去调远程函数;

推荐阅读文章:https://www.jianshu.com/p/2accc2840a1b

RPC基本原理
在这里插入图片描述
步骤解析:

在这里插入图片描述
RPC两个核心模块:通讯序列化

1.3.Dubbo

概念
Dubbo是一个高性能、轻量级、开源的Java RPC框架。

提供三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、服务自动注册与发现。

执行流程

在这里插入图片描述
调用关系说明:

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

2.Dubbo环境搭建

点进dubbo官方文档,推荐我们使用Zookeeper 注册中心

什么是zookeeper呢?可以查看官方文档

Window下安装zookeeper

(我自己下载的时候下载3.6.x版本的,但一直提示:找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain 怎么怎么的,所以这里选用了3.4版本的)

1、下载zookeeper :地址, 我们下载3.4.14 , 最新版!解压zookeeper

2、运行/bin/zkServer.cmd ,初次运行会报错,没有zoo.cfg配置文件;

可能遇到问题:闪退 !

解决方案:
1、编辑zkServer.cmd文件末尾添加pause 。这样运行出错就不会退出,会提示错误信息,方便找到原因。
2、修改zoo.cfg配置文件

将conf文件夹下面的zoo_sample.cfg复制一份改名为zoo.cfg即可。

在这里插入图片描述
然后重新启动就ok了。

在此说一下,我启动后报了一堆信息,跟狂神的不太一样。

3、使用zkCli.cmd测试
(懒得截图,直接用狂神的图)

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

[zk: 127.0.0.1:2181(CONNECTED) 4] ls /
[zookeeper]

create –e /kuangshen 123:创建一个kuangshen节点,值为123
在这里插入图片描述
get /kuangshen:获取/kuangshen节点的值

在这里插入图片描述
(啧,还是有点不一样,所以还是截一张吧)

window下安装dubbo-admin

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

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

我们这里来安装一下:

1、下载dubbo-admin

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

2、解压进入目录

修改 dubbo-admin\src\main\resources \application.properties 指定zookeeper地址

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
 
dubbo.registry.address=zookeeper://127.0.0.1:2181

3、在项目目录下打包dubbo-admin

mvn clean package -Dmaven.test.skip=true 

……我又遇到错误了:
在这里插入图片描述

不过问题不大,我没理这个错误,jar包也有了,就直接下一步了。

3、执行 dubbo-admin\target 下的dubbo-admin-0.0.1-SNAPSHOT.jar

java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

【注意:zookeeper的服务一定要打开!】

执行完毕,我们去访问一下 http://localhost:7001/ , 这时候我们需要输入登录账户和密码,我们都是默认的root-root;

登录成功后,查看界面

在这里插入图片描述

3.SpringBoot整合Dubbo+Zookeeper

3.1.创建服务提供者provider

①先创建一个空项目,在空项目下以SpringBoot为基础创建一个子模块。

在这里插入图片描述
②导入dubbo、zookeeper相关依赖包:

<!-- 导入依赖 Dubbo + Zookeeper -->
   <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
   <dependency>
       <groupId>org.apache.dubbo</groupId>
       <artifactId>dubbo-spring-boot-starter</artifactId>
       <version>2.7.3</version>
   </dependency>
   <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
   <dependency>
       <groupId>com.github.sgroschupf</groupId>
       <artifactId>zkclient</artifactId>
       <version>0.1</version>
   </dependency>
   <!-- 日志冲突 -->
   <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
   <dependency>
       <groupId>org.apache.curator</groupId>
       <artifactId>curator-framework</artifactId>
       <version>2.12.0</version>
   </dependency>
   <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
   <dependency>
       <groupId>org.apache.curator</groupId>
       <artifactId>curator-recipes</artifactId>
       <version>2.12.0</version>
   </dependency>
   <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
   <!--zookeeper的版本与自己安装的保持一致-->
   <dependency>
       <groupId>org.apache.zookeeper</groupId>
       <artifactId>zookeeper</artifactId>
       <version>3.5.9</version>
       <exclusions>
           <exclusion>
               <groupId>org.slf4j</groupId>
               <artifactId>slf4j-log4j12</artifactId>
           </exclusion>
       </exclusions>
   </dependency>

application.properties配置:

server.port=8001

#服务应用名字
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://139.155.203.191:2181
#哪些包下面的服务需要被注册
dubbo.scan.base-packages=com.fengye.service

或yml格式:

server:
  port: 8080
dubbo:
  # 服务应用名字
  application:
    name: provider-server  
  # 注册中心地址(zookeeper地址)
  registry:
    address: zookeeper://ip:2181
  # 哪些服务要被注册
  scan:
    base-packages: com.fengye.service

③创建接口并实现接口提供服务(模拟售票):

//接口
public interface TicketService {
    public String buyTicket();
}

@Component  //使用dubbo后尽量不要使用Service注解
@Service  //标识可以被dubbo扫描到,项目启动后就注册到注册中心
public class TicketServiceImpl implements TicketService {
    @Override
    public String buyTicket() {
        return "成功购票一张";
    }
}

④启动此服务,便可以在dubbo-admin中发现服务:

在这里插入图片描述

3.2.创建服务消费者consumer

①第一步、第二步与provider模块创建、导入依赖坐标相同;

配置application.properties:

server.port=8002
#消费者去哪里取服务需要暴露自己的名称
dubbo.application.name=consumer-service
#配置注册中心的地址
dubbo.registry.address=zookeeper://139.155.203.191:2181

②创建消费者接口(必须和服务提供者接口方法名一样,表示引用远端、执行方法调用):

public interface TicketService {
    //定义和远端服务提供者provider相同的接口名称
    public String buyTicket();
}

③创建消费者UserServie:

@Service
public class UserService {
    //在消费者中使用dubbo订阅远程服务:使用dubbo提供的@Refence注解
    @Reference
    private TicketService ticketService;

    public void getTicket(){
        String ticket = ticketService.buyTicket();
        System.out.println("从注册中心拿到:" + ticket);
    }
}

④启动消费者服务,可以看到服务在dubbo-admin中已经注册:

在这里插入图片描述

3.3.测试消费者远程调用服务者拿数据

①在消费者方本地创建测试方法,执行方法:

@SpringBootTest
class ConsumerServerApplicationTests {

    @Autowired
    private UserService userService;
    @Test
    void contextLoads() {
        //获取售票数据
        userService.getTicket();
    }

}

成功调用可以看到远端服务提供者方法已被调用:

在这里插入图片描述

参考:
狂神说SpringBoot17:Dubbo和Zookeeper集成
【java框架】SpringBoot(5)–SpringBoot整合分布式Dubbo+Zookeeper

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胡小冰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值