当前位置: 首页 > news >正文

SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例

文章目录

  • SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例
  • Dubbo
    • 定义
      • 其核心部分包含:
    • 工作原理
    • 为什么要用dubbo
      • 各个节点角色说明:
      • 调用关系说明:
    • dubbo为什么需要和zookeeper结合使用,zookeeper在dubbo体系中起到什么作用?
  • ZooKeeper(注册中心):
    • 定义:
    • ZooKeeper的基本运转流程:
    • 一、准备环境
      • 1.下载配置并启动zookeeper
      • 2、在bin目录下启动zookeeper
    • 二、创建项目
      • 1、创建一个maven父项目dubbox_parent-Demo,然后再其中创建三个maven子模块工程==dubbox_interface==,==dubbox_provider==,==dubbox_consumer==
      • 2、父工程和各个子工程的pom.xml如下
      • 3、在dubbox_interface工程中创建service包,并在其中创建HelloService.java接口
      • 4、在dubbox_provider中创建service包实现service接口,并在resources下创建application.properties分配端口号和dubbo服务
      • 5、在dubbox_consumer中创建controller包编写控制类,并在resources下创建application.properties
      • 6、分别在dubbox_provider和dubbox_consumer中创建启动器
      • 7、先启动zookeeper,然后==不要关闭黑色的命令窗口==,然后对上面项目进行测试,先运行提供者即DubboxProviderApp然后再运行DubboxConsumerApp,==启动顺序不能换==会发现两个不同端口的服务都已经打开

SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例

Dubbo

定义

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求。其本质上是个远程服务调用的分布式框架

其核心部分包含:

Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制
RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能
Registry: 服务目录框架用于服务的注册和服务事件发布和订阅

远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
   集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及负载均衡、失败容错、地址路由、动态配置等集群支持。
   自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

工作原理

Provider :暴露服务方称之为“服务提供者”。

Consumer: 调用远程服务方称之为“服务消费者”。

Registry: 服务注册与发现的中心目录服务称之为“服务注册中心”。

Monitor: 统计服务的调用次数和调用时间的日志服务称之为“服务监控中心”。

为什么要用dubbo

随着互联网的发展,网站的应用规模不断扩大,常规的垂直架构已经无法应,分布式服务架构势在必行,亟需一个治理系统架构的方案。

在这里插入图片描述

1)单一架构,当网站流量很小,我们将所有的功能都部署到一起,减少部署节点和成本。此时,用于简化增删改工作量,ORM是关键

2)垂直架构,当访问逐渐增大,单一机器的速度显然不理想,将应用拆成几个不相干的应用,以便提升效率。此时,用于加速前端访问,MVC是关键。

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

4)当我们服务越来越多,容量评估以及小服务资源浪费的问题逐渐展现出来。此时就需要一个调度中心基于访问压力实时的去管理集群容量,提高集群利用率。此时用于提高集群利用率和资源问题soa是关键。
在这里插入图片描述
在这里插入图片描述

各个节点角色说明:

Provider: 暴露服务的服务提供方。

Consumer: 调用远程服务的服务消费方。

Registry: 服务注册与发现的注册中心。

Monitor: 统计服务的调用次调和调用时间的监控中心。

Container: 服务运行容器。

调用关系说明:

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

dubbo为什么需要和zookeeper结合使用,zookeeper在dubbo体系中起到什么作用?

dubbo是一个prc远程服务调用框架,需要一个注册中心去管理每个服务的集群。zookeeper在dubbo中扮演一个注册中心的角色(当然也可以不选择zookeeper),zookeeper用来注册服务和进行负载均衡。

详述:哪一个服务由哪一个机器来提供,必须让调用者知道。也就是ip地址和服务名对应关系。也可以把这种对应关系通过硬编码的方式加在调用者的业务中,但是一旦提供的服务挂掉调用者无法知晓。zookeeper通过心跳机制来检测并将挂掉的机器从列表中删除。可以在不更改代码的情况下通过添加机器来解决高并发。

ZooKeeper(注册中心):

定义:

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

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

ZooKeeper包含一个简单的原语集,[1]提供Java和C的接口。

ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本

ZooKeeper的基本运转流程:

1、选举Leader。

2、同步数据。

3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。

4、Leader要具有最高的执行ID,类似root权限。

5、集群中大多数的机器得到响应并接受选出的Leader。

一、准备环境

1.下载配置并启动zookeeper

ZooKeeper官方下载地址
官方网址不太容易下载,我将3.4.6版本的zookeeper放到了百度网盘中,大家直接通过网盘链接下载比较方便

链接:https://pan.baidu.com/s/19jC2Gju40uYKH7G9e9fwuw?pwd=wfpl
提取码:wfpl

解压zookeeper压缩包,修改conf下的配置文件名称为zoo.cfg;
在这里插入图片描述

2、在bin目录下启动zookeeper

在这里插入图片描述
在这里插入图片描述

二、创建项目

1、创建一个maven父项目dubbox_parent-Demo,然后再其中创建三个maven子模块工程dubbox_interfacedubbox_providerdubbox_consumer

在这里插入图片描述

2、父工程和各个子工程的pom.xml如下

dubbox_parent-Demo

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><modules><module>dubbox_interface</module><module>dubbox_provider</module><module>dubbox_consumer</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.0.RELEASE</version></parent><groupId>cn.fpl</groupId><artifactId>dubbox_parent-Demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Dubbo Spring Boot Starter --><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.1.0</version></dependency><!-- 由于使⽤了zookeeper作为注册中⼼,则需要加⼊zookeeper的客户端jar包: --><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.10</version></dependency></dependencies>
</project>

dubbox_interface

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>dubbox_parent-Demo</artifactId><groupId>cn.fpl</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>dubbox_interface</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties></project>

dubbox_provider

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>dubbox_parent-Demo</artifactId><groupId>cn.fpl</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>dubbox_provider</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>cn.fpl</groupId><artifactId>dubbox_interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>

dubbox_consumer

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>cn.fpl</groupId><artifactId>dubbox_parent-Demo</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>dubbox_consumer</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>cn.fpl</groupId><artifactId>dubbox_interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

3、在dubbox_interface工程中创建service包,并在其中创建HelloService.java接口

package cn.fpl.service;public interface HelloService {String hello();
}

4、在dubbox_provider中创建service包实现service接口,并在resources下创建application.properties分配端口号和dubbo服务

HelloServiceImpl.java

package cn.fpl.service;import com.alibaba.dubbo.config.annotation.Service;@Service //发布服务:把当前service注册到zookeeper
public class HelloServiceImpl implements HelloService{@Overridepublic String hello() {return "师姐你好";}
}

application.properties

server.port=8080
#zookeeper的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#通讯协议:rmi、http、dubbo
dubbo.protocol.name=dubbo
#当前服务的名称
dubbo.application.name=dubbox-provider

5、在dubbox_consumer中创建controller包编写控制类,并在resources下创建application.properties

HelloController.java

/** Copyright (c) 2020, 2024, fpl1116.cn All rights reserved.**/
package cn.fpl.controller;import cn.fpl.service.HelloService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** <p>Project: dubbox_parent-Demo - HelloController</p>* <p>Powered by fpl1116 On 2024-01-17 15:38:21</p>* <p>描述:<p>** @author fpl1116 [2391940642@qq.com]* @version 1.0* @since 1.8*/
@Controller
public class HelloController {@Referenceprivate HelloService helloService;@RequestMapping("/hello")@ResponseBodypublic String hello(){return helloService.hello();}}

application.properties

server.port=8081
#zookeeper的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#通讯协议:rmi、http、dubbo
dubbo.protocol.name=dubbo
#当前服务的名称
dubbo.application.name=dubbox-consumer

6、分别在dubbox_provider和dubbox_consumer中创建启动器

DubboxProviderApp.java

package cn.fpl;import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableDubbo //开启dubbo注解的扫描
public class DubboxProviderApp {public static void main(String[] args) {SpringApplication.run(DubboxProviderApp.class, args);}
}

DubboxConsumerApp.java

/** Copyright (c) 2020, 2024, fpl1116.cn All rights reserved.**/
package cn.fpl;/*** <p>Project: dubbox_parent-Demo - DubboConsumerApp</p>* <p>Powered by fpl1116 On 2024-01-17 15:47:55</p>* <p>描述:<p>** @author fpl1116 [2391940642@qq.com]* @version 1.0* @since 1.8*/
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableDubbo
public class DubboConsumerApp {public static void main(String[] args) {SpringApplication.run(DubboConsumerApp.class, args);}
}

7、先启动zookeeper,然后不要关闭黑色的命令窗口,然后对上面项目进行测试,先运行提供者即DubboxProviderApp然后再运行DubboxConsumerApp,启动顺序不能换会发现两个不同端口的服务都已经打开

在这里插入图片描述

然后用浏览器打开消费者即consumer的服务端口
在这里插入图片描述

相关文章:

  • MySQL 索引(下)
  • QQ数据包解密
  • Vue与React:核心异同点解析
  • 【ARM 嵌入式 编译系列 2.5 -- GCC 编译参数学习 --specs=nano.specs选项 】
  • 深度解析Python关键字:掌握核心语法的基石(新版本35+4)
  • kubeadm 安装k8s集群后,master节点notready问题解决方案
  • JavaEE中的监听器的作用和工作原理
  • Spring Boot3.2.2整合MyBatis Plus3.5.5
  • 在Nginx中配置实现动静分离
  • C++中的static(静态)
  • 分布式锁4 :数据库DB实现分布式锁的悲观锁和乐观锁,unique实现方式
  • Spring、Spring-MVC、Mybatis、Mybatis-generator整合核心配置文件记录
  • 如何发布自己的npm包
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • 大数据技术原理及应用课实验4: NoSQL和关系数据库的操作比较
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • canvas 绘制双线技巧
  • Flex布局到底解决了什么问题
  • java中的hashCode
  • Js基础——数据类型之Null和Undefined
  • laravel with 查询列表限制条数
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Swoft 源码剖析 - 代码自动更新机制
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 安卓应用性能调试和优化经验分享
  • 分享一份非常强势的Android面试题
  • 记录一下第一次使用npm
  • 判断客户端类型,Android,iOS,PC
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 使用 QuickBI 搭建酷炫可视化分析
  • 用quicker-worker.js轻松跑一个大数据遍历
  • HanLP分词命名实体提取详解
  • Prometheus VS InfluxDB
  • 阿里云重庆大学大数据训练营落地分享
  • ​香农与信息论三大定律
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (floyd+补集) poj 3275
  • (function(){})()的分步解析
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (LeetCode C++)盛最多水的容器
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)springboot教学评价 毕业设计 641310
  • (十)T检验-第一部分
  • ***测试-HTTP方法
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • [20170713] 无法访问SQL Server
  • [20190401]关于semtimedop函数调用.txt
  • [Asp.net mvc]国际化
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [CDOJ 1343] 卿学姐失恋了
  • [codevs1288] 埃及分数
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)