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

news2024/10/6 10:27:05

文章目录

  • 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{
    @Override
    public 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 {
	@Reference
	private HelloService helloService;
	@RequestMapping("/hello")
	@ResponseBody
	public 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.coloradmin.cn/o/1400502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0基础开发EtherNet/IP:协议格式,JAVA、C#、C++处理

经过一阵倒腾&#xff0c;把CIP、Ethernet/ip协议搞到手 协议的概念和理论就不提及了&#xff0c;上网随便一搜索EtherNet/IP遍地都是。 直接将协议关键点列举出来吧。 更多协议资料 www.jngbus.com 通讯软件群 30806722 这里讲解的是TCP和UDP协议的格式&#xff0c;EtherN…

【标准IO】fseek函数、ftell函数、fflush函数、getline函数

目录 fseekftellrewindfflushgetline 橙色 当你在文件中写入了10个字符后&#xff0c;又想把这10个字符读出来&#xff0c;该怎么做呢&#xff1f;因为有文件操作符指针的存在&#xff0c;此时该指针已经指在了这10个字符末尾&#xff0c;所以需要把该指针重定向&#xff0c;这…

RT-Thread Studio学习(十七)虚拟串口

RT-Thread Studio学习&#xff08;十七&#xff09;虚拟串口 一、简介二、新建RT-Thread项目并使用外部时钟三、启用USB设备功能四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下实现USB虚拟串口。 硬件及开发环境如下&#xff1a; OS WI…

油管公式(全)

原文&#xff1a;The Youtube Formula 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 每个人都应该有一个 YouTube 频道。真的每个人&#xff0c;尤其是品牌。当我看到没有在 YouTube 上存在的品牌时&#xff0c;我觉得他们疯了。任何人都不利用这个机会是难以想…

python-基础篇-变量

文章目录 变量的基本使用目标01. 变量定义1) 变量演练1 —— iPython2) 变量演练 2 —— PyCharm3) 变量演练 3 —— 超市买苹果思考题 02. 变量的类型2.1 变量类型的演练 —— 个人信息2.2 变量的类型2.3 不同类型变量之间的计算1) **数字型变量** 之间可以直接计算2) **字符串…

从零开始:直播电商APP开发全流程解析

本篇文章&#xff0c;小编将从零开始&#xff0c;全面解析直播电商APP的开发流程&#xff0c;涵盖了关键的技术要点和开发阶段的关键步骤。 第一阶段&#xff1a;需求分析与规划 此阶段的关键任务包括&#xff1a; 1.用户需求调研 2.功能规划 3.技术选型 第二阶段&#xf…

安卓平板局域网内远程控制工控机方法

安卓平板局域网内远程控制工控机方法 将所需要远程控制的工控机通过网线连接到具有WiFi功能的路由器上&#xff0c;将安卓平板连接上WiFi&#xff0c;如下图所示 下载NoMachine远程软件安装包&#xff0c;官网地址&#xff1a;https://www.nomachine.com/ 点击Download now按钮…

图论:最短路(dijkstra算法、bellman算法、spfa算法、floyd算法)详细版

终于是学完了&#xff0c;这个最短路我学了好几天&#xff0c;当然也学了别的算法啦&#xff0c;也是非常的累啊。 话不多说下面看看最短路问题吧。 最短路问题是有向图&#xff0c;要求的是图中一个点到起点的距离&#xff0c;其中我们要输入点和点之间的距离&#xff0c;来求…

【Docker】安装Nginx容器并部署前后端分离项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

代码随想录算法训练营第十一天|● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值

文章目录 20.有效的括号思路&#xff1a;代码&#xff1a; 1047. 删除字符串中的所有相邻重复项思路代码1:栈储存代码2&#xff1a;双指针 150. 逆波兰表达式求值思路&#xff1a;题外话代码 20.有效的括号 思路&#xff1a; 由于栈结构的特殊性&#xff0c;非常适合做对称匹配…

单体架构、微服务和无服务器架构

前言 在这篇文章中&#xff0c;我将演示在决定使用单体架构、微服务架构和无服务器架构时的权衡的简化心智模型。目标是突显每种风格的固有优势和缺陷&#xff0c;并提供关于何时选择哪种架构风格的指导。 单体架构 对于小团队或项目来说是理想的入门架构。它简单易上手&…

Python sleep函数用法:线程睡眠

如果需要让当前正在执行的线程暂停一段时间&#xff0c;并进入阻塞状态&#xff0c;则可以通过调用 time 模块的 sleep(secs) 函数来实现。该函数可指定一个 secs 参数&#xff0c;用于指定线程阻塞多少秒。 当前线程调用 sleep() 函数进入阻塞状态后&#xff0c;在其睡眠时间…

131. 分割回文串 - 力扣(LeetCode)

问题描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 输入示例 s "aab"输出示例 [["a","a","b"],["…

面试2024.1.20

简单介绍下你做的项目。 这个神领物流项目是一个前后端分离的项目&#xff0c;前段他有3个客户端&#xff08;用户端为微信小程序、司机端和快递员端为app&#xff09;一个管理端&#xff08;pc&#xff09;&#xff0c;后端用的技术栈用的是SpringAlibabaCloud、数据库用的是M…

《Aspect-Sentiment-Multiple-Opinion Triplet Extraction》论文阅读

文章目录 文章介绍文章模型encoder部分ATE任务TOWE任务ATSA任务 番外 文章地址&#xff1a; https://arxiv.org/abs/2110.07303v1 文章介绍 目前的关于ASTE三元组提取的方面级情感分析论文大多关注于简单的句式&#xff0c;比如一个方面实体仅有一个意见词加以修饰&#xff0c…

CCC数字钥匙设计【NFC基础】--LPCD相关介绍

关于NFC卡检测&#xff0c;主要可以分成两个步骤&#xff1a; 1、LPCD低功耗检测&#xff0c;唤醒NFC读卡器。 2、唤醒后&#xff0c;NFC读卡器或MCU控制器轮询Type A、Type B、Type F、Type V&#xff08;ISO15693&#xff09;等卡类型。 本文主要介绍LPCD相关功能&#xff…

AI向所有的绝症宣战?2024年将被AI颠覆的行业-医疗健康

近年来&#xff0c;人工智能技术在我国得到了迅猛发展&#xff0c;不仅在互联网、金融、交通、零售、农业等领域取得了显著成果&#xff0c;还逐渐渗透到了医疗健康行业。预测2024年&#xff0c;人工智能将在医疗领域的应用发挥更深远的影响&#xff0c;甚至有可能颠覆整个医疗…

【MySQL】where和having的区别

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;数据库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 用途: 使用位置: 操作对象: 聚合函数: 示例&#xff1a; 结语 我的其他博客 前言 数据库中的 WHERE 和 HAVING 子句在 SQL 查…

【Linux】python版本控制

文章目录 1.查看目前python的版本2.添加软件源并更新3.选择你想要下载的版本4.警示&#xff1a;没必要设置默认版本误区千万千万不要覆盖python3软链接解决办法 5.安装pip换源 6.环境管理 网上有很多教程都是教导小白去官方下载之后编译安装。但是&#xff0c;小白连cmake是什么…

【LeetCode: 295. 数据流的中位数 + 堆】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…