3.1 注册中心概述

对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。

而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即需要提供服务,有需要消费服务。 通过将服务统一管理起来,可以有效地优化内部应用对服务发布使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo 提供的注册中心有如下几种类型可供选:

1)、Multicast 注册中心: 组播方式 2)、Redis 注册中心: 使用 Redis 作为注册中心 3)、Simple 注册中心: 就是一个 dubbo 服务。作为注册中心。提供查找服务的功能。 4)、Zookeeper 注册中心: 使用 Zookeeper 作为注册中心 5)、推荐使用 Zookeeper 注册中心。

3.2 注册中心工作方式

3. 注册中心-Zookeeper - 图1

3.3 Zookeeper 注册中心

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

3.3.1 下载安装文件

官网下载地址: http://zookeeper.apache.org/

3. 注册中心-Zookeeper - 图2

进入官网地址,首页找到下载地址,最新版本 3.5.4

https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz

3. 注册中心-Zookeeper - 图3

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

文件内容:
**
3. 注册中心-Zookeeper - 图4

  • tickTime: 心跳的时间,单位毫秒. Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。表明存活状态。

  • dataDir: 数据目录,可以是任意目录。存储 zookeeper 的快照文件、pid 文件,默认为

/tmp/zookeeper,建议在 zookeeper 安装目录下创建 data 目录,将 dataDir 配置改为/usr/local/zookeeper- 3.4.10/data

  • clientPort: 客户端连接 zookeeper 的端口,即 zookeeper 对外的服务端口,默认为 2181

配置内容:
**

  1. dataDir : zookeeper 数据的存放目录
  2. 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

3. 注册中心-Zookeeper - 图5

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

3. 注册中心-Zookeeper - 图6

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

3. 注册中心-Zookeeper - 图7

3.4 改造 Dubbo项目(使用 Zookeeper方式实现)

1)、dubbo官方推荐使用的一个模式,将实体bean和业务接口存放到接口工程中
**

  1. 创建一个maven 普通Java工程
  2. 创建一个实体bean查询的结果
  3. 提供一个服务接口:xxxx

2)、服务的提供者
**

  1. 创建一个maven web工程:服务的提供者

  2. 创建一个实体bean查询的结果

  3. 实现这个服务接口:xxxxImpl

  4. 配置dubbo服务提供者的核心配置文件

    1. 声明dubbo服务提供者的名称:保证唯一


  1. 声明dubbo使用的协议和端口号


  1. 指定注册中心地址和端口号


  1. 暴露服务,使用直连方式


  1. 添加监听器

  2. 导入接口工程的jar到工程中

配置dubbo服务提供者的pom文件所需要的依赖如下:

  1. <dependencies>
  2. <!--Spring依赖-->
  3. <dependency>
  4. <groupId>org.springframework</groupId>
  5. <artifactId>spring-context</artifactId>
  6. <version>4.3.16.RELEASE</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-webmvc</artifactId>
  11. <version>4.3.16.RELEASE</version>
  12. </dependency>
  13. <!--Dubbo依赖-->
  14. <dependency>
  15. <groupId>com.alibaba</groupId>
  16. <artifactId>dubbo</artifactId>
  17. <version>2.6.2</version>
  18. </dependency>
  19. <!--接口工程依赖-->
  20. <dependency>
  21. <groupId>com.bjpowernode.dubbo</groupId>
  22. <artifactId>006-zk-interface</artifactId>
  23. <version>1.0.0</version>
  24. </dependency>
  25. <!--zookeeper依赖-->
  26. <dependency>
  27. <groupId>org.apache.curator</groupId>
  28. <artifactId>curator-framework</artifactId>
  29. <version>4.1.0</version>
  30. </dependency>
  31. </dependencies>

配置JDK1.8编译插件如下:

  1. <build>
  2. <plugins>
  3. <!--JDK1.8编译插件-->
  4. <plugin>
  5. <artifactId>maven-compiler-plugin</artifactId>
  6. <version>3.1</version>
  7. <configuration>
  8. <source>1.8</source>
  9. <target>1.8</target>
  10. </configuration>
  11. </plugin>
  12. </plugins>
  13. </build>

配置dubbo服务提供者的核心配置文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  4. 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">
  5. <!--声明dubbo服务提供者的名称:保证唯一性-->
  6. <dubbo:application name="007-zk-userservice-provider"/>
  7. <!--声明dubbo使用的协议名称和端口号-->
  8. <dubbo:protocol name="dubbo" port="20880"/>
  9. <!--现在要使用zookeeper注册中心-->
  10. <!--指定注册中心地址和端口号-->
  11. <dubbo:registry address="zookeeper://localhost:2181"/>
  12. <!--使用linux系统中的zookeeper服务-->
  13. <!--<dubbo:registry address="zookeeper://192.168.154.128:2181"/>-->
  14. <!--暴露服务接口-->
  15. <dubbo:service interface="com.bjpowernode.dubbo.service.UserService" ref="userServiceImpl"/>
  16. <!--加载接口实现类-->
  17. <bean id="userServiceImpl" class="com.bjpowernode.dubbo.service.impl.UserServiceImpl"/>
  18. </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)、服务消费者
**

  1. 创建一个maven web工程:服务的消费者
  2. 配置pom文件:添加需要的依赖(spring,dubbo)
  3. 设置dubbo的核心配置文件()
  4. 编写controller
  5. 配置中央调度器(就是一个servlet:DispatcherServlet)
  6. 导入接口工程的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 运行应用

  1. 先启动注册中心
  2. 再启动 tomcat 服务器
  3. 访问 zk-node-shop-web 的 index.jsp

3.6 注册中心的高可用

概念:
**

高可用性(High Availability):通常来描述一个系统经过专门的设计,从而减少不能提供服务的时间,而保持其服务的高度可用性。

Zookeeper 是高可用的,健壮的。Zookeeper 宕机,正在运行中的 dubbo 服务仍然可以正常访问。

健壮性:
**

  1. 监控中心宕掉不影响使用,只是丢失部分采样数据
  2. 注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  3. 服务提供者无状态,任意一台宕掉后,不影响使用
  4. 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

演示操作:
**

  1. 先启动 zookeeper, dubbo 服务提供者,dubbo 服务消费者。
  2. 测试正常访问胸
  3. 停止 zookeeper
  4. 测试消费者仍然可以访问提供者