spring Boot环境下dubbo+zookeeper的一个基础讲解与示例

一、  Dubbo 概述
1.    为什么需要Dubbo
        互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的。现在核心业务抽取出来,作为独立的服务,使前端应用能更快速和稳定的响应。

2.   Dubbo是什么
      Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容

3.   Dubbo能做什么
      当网站变大后,不可避免的需要拆分应用进行服务化(微服务),以提高开发效率,调优性能,节省关键竞争资源等。 当服务越来越多时,服务的URL地址信息就会爆炸式增长,配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。 
当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?等等…… 在遇到这些问题时,都可以用Dubbo来解决。

二、   Dubbo 原理
1.   Dubbo架构图  

spring Boot环境下dubbo+zookeeper的一个基础讲解与示例

上述图所描述的调用流程关系如下:

   0. 服务容器负责启动,加载,运行服务提供者,这个图上没标识出来,服务端启动就是0.

   1. 服务提供者在启动时,向注册中心注册自己提供的服务。

   2. 服务消费者在启动时,向注册中心订阅自己所需的服务。

   3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

   4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

   5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

三.   Dubbo与zookeeper
     Dubbo为什么要与zookeeper/Consule一起使用?dubbo主要是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的。告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册。zookeeper用来注册服务和进行负载均衡,哪一个服务由哪一个机器来提供必需让调用者知道,简单来说就是ip地址和服务名称的对应关系。zookeeper通过心跳机制可以检测挂掉的机器并将挂掉机器的ip和服务对应关系从列表中删除。

      利用zookeeper生成的节点树,服务器提供者在启动的时候,将提供的服务名称和地址以节点的方式注册都服务器zookeeper服务器配置中心,消费者通过服务器配置中心获取需要的服务名称节点下的服务地址。因为znode有非持久节点的特性,服务器可以动态的从服务配置中心一处,并且触发消费者的watcher方法!!!

      消费者只有在第一次调用的时候直接本地缓存服务器列表信息,而不需要重新发起请求到服务器配置中心区获取相应 的服务器列表,直到服务器地址列表有变化(机器下线或者上线),变更之后消费者watcher进行服务地址的重新查询。正是因为这种无中心化的结构,使得服务消费者在服务信息没变更时候,几乎不依赖配置中心,解决了负载均衡设备导致的单点故障的问题,大大减少了服务配置中心的压力 

四.    Zookeeper的安装,此处以windows环境下为例。

  在apache的官方网站提供了好多镜像下载地址,然后找到对应的版本,目前最新的是3.4.5。

  把下载的zookeeper的文件解压到指定目录

spring Boot环境下dubbo+zookeeper的一个基础讲解与示例

 修改conf下增加一个zoo.cfg

spring Boot环境下dubbo+zookeeper的一个基础讲解与示例

进入到bin目录,并且启动zkServer.cmd,这个脚本中会启动一个Java进程

这个时候zookeeper已经安装成功了.

五.   服务提供者
演示工程结构如下:

spring Boot环境下dubbo+zookeeper的一个基础讲解与示例

首先看下咱们的pom文件,引入Dubbo和Zookeeper的jar包.没啥好说的。

<dependency>
	<groupId>io.dubbo.springboot</groupId>
	<artifactId>spring-boot-starter-dubbo</artifactId>
	<version>1.0.0</version>
</dependency>		 
<dependency>
    <groupId>org.apache.zookeeper</groupId>
	<artifactId>zookeeper</artifactId>
	<version>3.4.6</version>			 
</dependency> 
<dependency>
	<groupId>com.github.sgroschupf</groupId>
	<artifactId>zkclient</artifactId>
	<version>0.1</version>
</dependency>

然后我们写自己的接口与实现,通常分布式设计下接口应该与实现分开,让接口与bean单独起工程模块,以便服务提供者与消费者都可以调用。如果服务端有自己不暴漏的方法,可单写接口类,也可中间加层,看业务而定。

接口

public interface UserService {
	/**
	 * 提供分布式业务的测试方法
	 */
	public User createUser(String name,int age);
}

接口实现

import com.alibaba.dubbo.config.annotation.Service; 
import com.icss.springbootfuwu.entity.User;
import com.icss.springbootfuwu.service.UserService;

@Service  //关键注解,表示可注册的服务  com.alibaba.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {
	@Override
	public User createUser(String name, int age) {
		User user = new User(name, age);
		return user;
	}	
}

重点看下我们dobbo配置 ,application.properties 配置:

server.port=8083
#在DubboAdmin管理中心展示的应用名称
spring.dubbo.application.name=p-provider
#向注册中心注册服务
spring.dubbo.registry.address=zookeeper://172.17.4.82:2181
spring.dubbo.protocol.name=dubbo
#向外暴露Dubbo端口
spring.dubbo.protocol.port=20888
#扫描接口所在的包
spring.dubbo.scan=com.icss.springbootfuwu.service

   接下来我们启动服务提供者服务,这里我们常用的应该是启动一个java程序,因为我们的工程中并没有涉及web方面的业务,尽量不适用tomcat 启动Web容器。服务完成。

六.   服务消费者
  我们再创建一个消费者工程项目,结构如下:

spring Boot环境下dubbo+zookeeper的一个基础讲解与示例

Pom文件与服务者要引用的基本一样,都是dubbo与zookeeper。

<dependency>
	<groupId>io.dubbo.springboot</groupId>
	<artifactId>spring-boot-starter-dubbo</artifactId>
	<version>1.0.0</version>
</dependency>
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>dubbo</artifactId>
	<version>2.6.0</version>
	<exclusions>
		<exclusion>
			<groupId>org.springframework</groupId>
			<artifactId>spring</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.apache.zookeeper</groupId>
	<artifactId>zookeeper</artifactId>
	<version>3.4.6</version>
	<type>pom</type>
</dependency>

我们原样拷贝服务端的接口目录到客户端,看项目结构图。

我们编写一个业务类代码,调取接口。

import org.springframework.stereotype.Service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.icss.springbootfuwu.entity.User;
import com.icss.springbootfuwu.service.UserService;
@Service  //SpringMVC 业务类
public class UserClientService {
	@Reference   //关键注解,表示引用服务端接口代理对象
	UserService userService;
	public User getUser(String name,int age) {
		return userService.createUser(name, age);
	}
}

配置我们dubbo配置文件,让zookeeper给我们订阅需要的服务。在application.properties文件中配置。

server.port=8082
#DubboAdmin管理工具显示的应用名称
spring.dubbo.application.name=c-consumer
#订阅服务
spring.dubbo.registry.address=zookeeper://172.17.4.82:2181
#订阅服务
spring.dubbo.scan=com.icss.springbootfuwu.service

运行客户端程序,调用控制器->业务类,可看到服务端返回的数据结果。

程序案例请下载:https://download.****.net/download/dange_h/10747192