文章目录
- 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: 服务运行容器。
调用关系说明:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
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_interface,dubbox_provider,dubbox_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的服务端口