1.理论概述

1.1.分布式

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

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

起源

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

分布式使用

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

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

集群与分布式区别

【集群】:多个相同的微服务,提供同一个功能

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

1.2.RPC

Remote Procedure Call 远程过程调用

远程调用另外一台机器上的方法,RPC只是一种理论,不是协议。

1.3.Dubbo

概念

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

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

执行流程

调用关系说明:

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

2.Linux下安装zookeeper和dubbo-admin

软件说明

zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。 (==类似于Eureka==)。

dubbo-admin是管理控制台,可以实现服务监控 (即查看注册中心情况),不安装也是可以的。

2.1.下载并安装zookeeper

①到zookeeper官网镜像:https://mirror.bit.edu.cn/apache/zookeeper/,下载zookeeper

注意3.5.x版本以上需要下载:

apache-zookeeper-3.5.9-bin.tar.gz 15-Jan-2021 03:46  9.2M  
tar.gz是源码包,执行启动无法运行

②下载完毕后通过Xftp发送到Linux服务器上的home目录下(目录可根据个人喜好),解压并进入conf目录下复制配置文件;

cp zoo.zoo_sample.cfg zoo.cfg

③需要同步修改zoo.cfg文件:

④返回上一层目录并进入bin子目录,执行命令:./zkServer.sh start启动zookeeper

操作zookeeper其余命令:

./zkServer.sh stop
./zkServer.sh restart
./zkServer.sh status

启动zookeeper过程中可能由于远端Linux云服务器防火墙未关闭报:java.net.NoRouteToHostException: No route to host dubbo-admin,

需要关闭防火墙:解决方法

2.2.下载安装dubbo-admin

①下载dubbo-admin并修改配置:

进入GitHub下载:https://github.com/apache/dubbo-admin/tree/master

解压并修改application.properties文件,配置文件在dubbo-admin\src\main\resources目录下

②打包dubbo-admin项目,将dubbo-admin项目编译打成jar包:

在项目目录下执行cmd命令:

打包:

输入命令:mvn clean package -Dmaven.test.skip=true

将项目target目录下生成的jar上传到Linux系统并执行java -jar dubbo-admin-0.0.1-SNAPSHOT.jar &命令,开放7001端口,在浏览器便可访问。

初始登录账户和密码都是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();
} }

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

本博客写作参考文档相关:

https://dubbo.apache.org/zh/docs/v2.7/user/preface/architecture/

https://www.kuangstudy.com/bbs/1355164021359243266

https://www.kuangstudy.com/bbs/1371400397700218882

示例代码已上传至Github地址:

https://github.com/devyf/SpringBoot_Study/springboot_dubbo_zk

【java框架】SpringBoot(5)--SpringBoot整合分布式Dubbo+Zookeeper的更多相关文章

  1. SpringBoot分布式 - Dubbo+ZooKeeper

    一:介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. Dubbo是Alib ...

  2. springboot和quartz整合分布式多节点

    虽然单个Quartz实例能给予我们很好的任务job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应用的一 ...

  3. java框架篇---spring hibernate整合

    在会使用hibernate 和spring框架后 两个框架的整合就变的相当容易了, 为什么要整合Hibernate?1.使用Spring的IOC功能管理SessionFactory对象 LocalSe ...

  4. java框架之SpringCloud(7)-Config分布式配置中心

    前言 分布式系统面临的配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中标会出现大量的服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的.动 ...

  5. JAVA框架 Spring 和Mybatis整合(动态代理)

    一.使用传统方式的dao的书写方式,不建议.目前采用的是动态代理的方式交给mybatis进行处理. 首先回顾下动态代理要求: 1)子配置文件的中,namespace需要是接口的全路径,id是接口的方法 ...

  6. JAVA框架 Spring 和Mybatis整合(传统dao)

    一:我们使用spring处理service,mybaits处理dao层. 二:导入jar包 pom.xml文件内容: <?xml version="1.0" encoding ...

  7. java框架之SpringBoot(16)-分布式及整合Dubbo

    前言 分布式应用 在分布式系统中,国内常用 Zookeeper + Dubbo 组合,而 SpringBoot 推荐使用 Spring 提供的分布式一站式解决方案 Spring + SpringBoo ...

  8. Spring-boot:5分钟整合Dubbo构建分布式服务

    概述: Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常 ...

  9. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

随机推荐

  1. TypeScript Generics All In one

    TypeScript Generics All In one TypeScript 泛型 代码逻辑复用 扩展性 设计模式 方法覆写, 直接覆盖 方法重载,参数个数或参数类型不同 test " ...

  2. free website generator by google

    free website generator by google https://sites.google.com/view/webgeeker-xyz/首页 https://sites.google ...

  3. H.265 & H.264

    H.265 & H.264 HEVC (H.265) vs. AVC (H.264) https://en.wikipedia.org/wiki/High_Efficiency_Video_C ...

  4. VSCode & Node.js & debugger & inspector

    VSCode & Node.js & debugger & inspector F5 ws 元信息 (UUID) ws://127.0.0.1:46912/efa91bda-1 ...

  5. Flutter 删除AppBar的返回icon

    设置automaticallyImplyLeading: false即可,替换可以修改"leading"参数 ... appBar: AppBar( automaticallyIm ...

  6. 【java】ObjectOutputStream & ObjectInputStream 多次写入发生重复写入相同数据的问题

    今日份代码,解决 ObjectOutputStream 多次写入发生重复写入相同数据的问题 核心区别如下: package com.sxd.swapping.objoutputstream; impo ...

  7. ROS等下载时无法连接问题的解决方法

    资料参考: https://blog.csdn.net/weixin_44692299/article/details/105869229

  8. java自学第5期——Object、Date、Calender、System、StringBuilder、基本类型包装类

    一.Object类 作用:对象操作 位置:java.lang.Object 方法: public String toString() :返回对象的字符串表示形式. public boolean equ ...

  9. Why GraphQL? 6个问题

    Why GraphQL? 6个问题 GraphQL, 是一个API的标准: specification. 对于每个新技术, 要搞清楚的6个问题: 1.这个技术出现的背景, 初衷, 要达到什么样的目标或 ...

  10. 1060 Are They Equal——PAT甲级真题

    1060 Are They Equal If a machine can save only 3 significant digits, the float numbers 12300 and 123 ...