3.1 注册中心概述
对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。
而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即需要提供服务,有需要消费服务。 通过将服务统一管理起来,可以有效地优化内部应用对服务发布使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo 提供的注册中心有如下几种类型可供选:
1)、Multicast 注册中心: 组播方式 2)、Redis 注册中心: 使用 Redis 作为注册中心 3)、Simple 注册中心: 就是一个 dubbo 服务。作为注册中心。提供查找服务的功能。 4)、Zookeeper 注册中心: 使用 Zookeeper 作为注册中心 5)、推荐使用 Zookeeper 注册中心。
3.2 注册中心工作方式

3.3 Zookeeper 注册中心
Zookeeper 是一个高性能的,分布式的,开放源码的分布式应用程序协调服务。简称 zk。Zookeeper 是翻译管理是动物管理员。可以理解为 windows 中的资源管理器或者注册表。他是一个树形结构。这种树形结构和标准文件系统相似。ZooKeeper 树中的每个节点被称为Znode。和文件系统的目录树一样,ZooKeeper 树中的每个节点可以拥有子节点。每个节点表示一个唯一服务资源。Zookeeper 运行需要 java 环境。
3.3.1 下载安装文件
官网下载地址: http://zookeeper.apache.org/

进入官网地址,首页找到下载地址,最新版本 3.5.4
https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz

3.3.2 安装配置 Zookeeper
A、Windows 平台 Zookeeper 安装,配置
**
下载的文件 zookeeper-3.5.4-beta.tar.gz. 解压后到目录就可以了,例如 d:/servers/ zookeeper-3.5.4
修改 zookeeper-3.5.4/conf/ 目录下配置文件
复制 zoo-sample.cfg 改名为 zoo.cfg
文件内容:
**
tickTime: 心跳的时间,单位毫秒. Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。表明存活状态。
dataDir: 数据目录,可以是任意目录。存储 zookeeper 的快照文件、pid 文件,默认为
/tmp/zookeeper,建议在 zookeeper 安装目录下创建 data 目录,将 dataDir 配置改为/usr/local/zookeeper- 3.4.10/data
- clientPort: 客户端连接 zookeeper 的端口,即 zookeeper 对外的服务端口,默认为 2181
配置内容:
**
- dataDir : zookeeper 数据的存放目录
- admin.serverPort=8888
原因:zookeeper 3.5.x 占用 8080
B、 Linux 平台 Zookeeper 安装、配置
**
Zookeeper 的运行需要 jdk。使用前 Linux 系统要安装好 jdk
①:上传 zookeeper-3.5.4-beta.tar.gz.并解压,执行命令:tar -zxvf zookeeper-3.5.4-beta.tar.gz. -C /usr/local/
②:配置文件在 zookeeper 的 conf 目录下, 将 zoo_sample.cfg 改名为 zoo.cfg,cp zoo_sample.cfg zoo.cfg zookeeper 启动时会读取该文件作为默认配置文件。 进入 zookeeper 目录下的 conf 拷贝样例文件 zoo-sample.cfg 为 zoo.cfg

③:启动 Zookeeper 启动(切换到安装目录的 bin 目录下):./zkServer.sh start

④:关闭 Zookeeper
关闭(切换到安装目录的 bin 目录下):./zkServer.sh stop

3.4 改造 Dubbo项目(使用 Zookeeper方式实现)
1)、dubbo官方推荐使用的一个模式,将实体bean和业务接口存放到接口工程中
**
- 创建一个maven 普通Java工程
- 创建一个实体bean查询的结果
- 提供一个服务接口:xxxx
2)、服务的提供者
**
创建一个maven web工程:服务的提供者
创建一个实体bean查询的结果
实现这个服务接口:xxxxImpl
配置dubbo服务提供者的核心配置文件
- 声明dubbo服务提供者的名称:保证唯一
- 声明dubbo使用的协议和端口号
- 指定注册中心地址和端口号
- 暴露服务,使用直连方式
添加监听器
导入接口工程的jar到工程中
配置dubbo服务提供者的pom文件所需要的依赖如下:
<dependencies><!--Spring依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.16.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.16.RELEASE</version></dependency><!--Dubbo依赖--><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.2</version></dependency><!--接口工程依赖--><dependency><groupId>com.bjpowernode.dubbo</groupId><artifactId>006-zk-interface</artifactId><version>1.0.0</version></dependency><!--zookeeper依赖--><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>4.1.0</version></dependency></dependencies>
配置JDK1.8编译插件如下:
<build><plugins><!--JDK1.8编译插件--><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
配置dubbo服务提供者的核心配置文件如下:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!--声明dubbo服务提供者的名称:保证唯一性--><dubbo:application name="007-zk-userservice-provider"/><!--声明dubbo使用的协议名称和端口号--><dubbo:protocol name="dubbo" port="20880"/><!--现在要使用zookeeper注册中心--><!--指定注册中心地址和端口号--><dubbo:registry address="zookeeper://localhost:2181"/><!--使用linux系统中的zookeeper服务--><!--<dubbo:registry address="zookeeper://192.168.154.128:2181"/>--><!--暴露服务接口--><dubbo:service interface="com.bjpowernode.dubbo.service.UserService" ref="userServiceImpl"/><!--加载接口实现类--><bean id="userServiceImpl" class="com.bjpowernode.dubbo.service.impl.UserServiceImpl"/></beans>
配置监听器如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dubbo-zk-userservice-provider.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
2)、服务消费者
**
- 创建一个maven web工程:服务的消费者
- 配置pom文件:添加需要的依赖(spring,dubbo)
- 设置dubbo的核心配置文件()
- 编写controller
- 配置中央调度器(就是一个servlet:DispatcherServlet)
- 导入接口工程的jar到工程中
配置dubbo服务消费者的pom文件所需要的依赖如下:
<dependencies>
<!--Spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<!--dubbo依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!--接口工程-->
<dependency>
<groupId>com.bjpowernode.dubbo</groupId>
<artifactId>006-zk-interface</artifactId>
<version>1.0.0</version>
</dependency>
<!--注册中心依赖-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency>
</dependencies>
配置dubbo服务消费者的核心配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!--声明dubbo服务消费者名称:保证唯一性-->
<dubbo:application name="008-zk-consumer"/>
<!--指定注册中心-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!--使用linux系统中的zookeeper服务-->
<!--<dubbo:registry address="zookeeper://192.168.154.128:2181"/>-->
<!--引用远程接口服务-->
<dubbo:reference id="userService" interface="com.bjpowernode.dubbo.service.UserService"/>
</beans>
配置SpringMVC核心配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描组件-->
<context:component-scan base-package="com.bjpowernode.dubbo.web"/>
<!--配置注解驱动-->
<mvc:annotation-driven/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
配置web.xml中央调度器(DispatcherServlet)如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml,classpath:dubbo-zk-consumer.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
编写controller如下:
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/userDetail")
public String userDetail(Model model,Integer id, String username) {
User user = userService.queryUserById(id, username);
model.addAttribute("user",user);
return "userDetail";
}
}
3.5 运行应用
- 先启动注册中心
- 再启动 tomcat 服务器
- 访问 zk-node-shop-web 的 index.jsp
3.6 注册中心的高可用
概念:
**
高可用性(High Availability):通常来描述一个系统经过专门的设计,从而减少不能提供服务的时间,而保持其服务的高度可用性。
Zookeeper 是高可用的,健壮的。Zookeeper 宕机,正在运行中的 dubbo 服务仍然可以正常访问。
健壮性:
**
- 监控中心宕掉不影响使用,只是丢失部分采样数据
- 注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
- 服务提供者无状态,任意一台宕掉后,不影响使用
- 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
演示操作:
**
- 先启动 zookeeper, dubbo 服务提供者,dubbo 服务消费者。
- 测试正常访问胸
- 停止 zookeeper
- 测试消费者仍然可以访问提供者
