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的服务端口
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/417590.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 部署

jdk&tomcat安装 1.上传jdk、tomcat安装包 2.解压两个工具包 #解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 3.配置并且测试jdk安装 #配置环境变量 vim /etc/profile #java environment export JAVA_HOME/root/soft/…

MySQL主从复制原理与实践:从配置到故障监控

文章目录 前言主从复制原理复制源主节点的工作从节点的工作复制流程的设计 主从复制环境搭建一、主从节点配置二、从节点开启复制步骤1、备份主节点的数据2、将数据同步到从节点3、从节点复制参数配置 三、验证复制环境 主从复制故障监控监控主从复制状态监控主从复制延迟 总结…

无/自监督去噪(1)——一个变迁:N2N→N2V→HQ-SSL

目录 1. 前沿2. N2N3. N2V——盲点网络&#xff08;BSNs&#xff0c;Blind Spot Networks&#xff09;开创者3.1. N2V实际是如何训练的&#xff1f; 4. HQ-SSL——认为N2V效率不够高4.1. HQ-SSL的理论架构4.1.1. 对卷积的改进4.1.2. 对下采样的改进4.1.3. 比N2V好在哪&#xff…

《软件方法》强化自测题-杂项(3)-少林足球巴别塔-不属于“软件方法建模师”考察范围

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 本套自测题不属于“软件方法建模师”考察范围。 自测链接&#xff1a;https://www.101test.com/cand/index?paperIdQR6CGK 1. [单选] 著名歌曲《橄榄树》&#xff08;不要问我从那…

【印象深刻的实战经历】学期末乐跑真实现状分析(以及解决方案)——开发一款期末顺利过关的简易功能乐跑软件soeasy面向初学安卓开发的人

目录 期末乐跑老师审查机制 总结如下 1. 老师会看你的乐跑次数够了没也就是这个页面 2. 老师会检查你的手机是否是自己的&#xff0c;也就是要看你乐跑的实名认证&#xff0c;也就是这个页面 以下是应对学期末乐跑的具体方法 第一步&#xff1a; 第二步&#xff1a; 第…

【 Qt 快速上手】-②- Qt 环境搭建

文章目录 1. Qt 开发工具概述1.1 Qt Creator 介绍1.2 Visual Studio 介绍1.3 Eclipse 介绍 2. Qt SDK 的下载与安装2.1 Qt SDK 的下载2.2 Qt SDK 的安装2.3 验证 Qt SDK 安装是否成功2.4 Qt 环境变量配置 1. Qt 开发工具概述 Qt 开发环境需要安装三个部分&#xff1a; C编译器…

CVE2020-1938漏洞复现

这个漏洞是tomcat的 然后我们先了解漏洞产生的原理 首先我们先来看tmocat纠结是干什么的 tomcat是个中间件 最主要的两个结构、 servlet的定义和部分源码&#xff0c; 漏洞就是从这来的 tomcat处理http请求 源码分析 tomcat 8.5.46 哎 这教学视频讲半天看不懂 不看原…

Windows使用docker安装redis

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;十二&#xff09;——Windows系统下使用docker安装redis 文章目录 win系统环境搭建&#xff08;十二&#xff09;——Windows系统下使用docker安装redis1.创建文件夹2.docker-compose.yaml配置文件3.red…

力扣70. 爬楼梯(动态规划 Java,C++解法)

Problem: 70. 爬楼梯 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 由于本题目中第i层台阶只能由于第i- 1层台阶和第i-2层台阶走来&#xff0c;所以可以联想到动态规划&#xff0c;具体如下&#xff1a; 1.定义多阶段决策模型&#xff1a;对于每一上台阶看作一种状…

Hadoop3完全分布式搭建

一、第一台的操作搭建 修改主机名 使用hostnamectl set-hostname 修改当前主机名 关闭防火墙和SELlinux 1&#xff0c;使用 systemctl stop firewalld systemctl disable firewalld 关闭防火墙 2&#xff0c;使用 vim /etc/selinux/config 修改为 SELINUXdisabled 使用N…

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server

在Pycharm上部署项目到远程服务器&#xff0c;有时候需要启动SSH会话&#xff0c;启动的时候发现没反应&#xff0c;且事件日志显示&#xff1a;无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边&#xff0c;发现“无默…

canvas能压缩图片?

之前写过一篇使用命令行工具压缩图片的博文&#xff1a;使用yx-tiny命令行工具进行图片压缩&#xff0c;大家感兴趣可以去瞅一眼。 这篇简单说一下使用canvas压缩图片 其实思路很简单&#xff0c;我们选择了图片之后&#xff0c;会获取到对应的文件流对象&#xff0c;然后我们…