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

发布时间:2024年01月20日

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

文章来源:https://blog.csdn.net/qq_62124267/article/details/135707841
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。