SpringCloud——Zookeeper(注册中心)

小咪咪 2021-06-24 16:00 673阅读 0赞

一、zookeeper简介

  1. ZooKeeper是一个[分布式][Link 1]的,开放源码的[分布式应用程序][Link 2]协调服务,是[Google][]的Chubby一个[开源][Link 3]的实现,是HadoopHbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
  2. ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

原理:

  1. ZooKeeper是以Fast Paxos算法为基础的,[Paxos 算法][Paxos]存在[活锁][Link 4]的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。

ZooKeeper的基本运转流程:

  • 1、选举Leader;
  • 2、同步数据;
  • 3、选举Leader过程中算法有很多,但要达到的选举标准是一致的;
  • 4、Leader要具有最高的执行ID,类似root权限;
  • 5、集群中大多数的机器得到响应并接受选出的Leader。

二、Zookeeper作为注册中心搭建SpringCloud实现服务注册及发现

1、创建工程,父pom.xml依赖文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example.demo</groupId>
  6. <artifactId>springcloud-zookeeper</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>pom</packaging>
  9. <name>springcloud-zookeeper</name>
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>1.4.5.RELEASE</version>
  14. </parent>
  15. <modules>
  16. <module>zookeeper-server</module>
  17. <module>zookeeper-client</module>
  18. </modules>
  19. <properties>
  20. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  21. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  22. <java.version>1.8</java.version>
  23. <spring-cloud.version>Camden.SR7</spring-cloud.version>
  24. </properties>
  25. <dependencies>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-test</artifactId>
  33. <scope>test</scope>
  34. </dependency>
  35. </dependencies>
  36. <dependencyManagement>
  37. <dependencies>
  38. <dependency>
  39. <groupId>org.springframework.cloud</groupId>
  40. <artifactId>spring-cloud-dependencies</artifactId>
  41. <version>${spring-cloud.version}</version>
  42. <type>pom</type>
  43. <scope>import</scope>
  44. </dependency>
  45. </dependencies>
  46. </dependencyManagement>
  47. <build>
  48. <plugins>
  49. <plugin>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-maven-plugin</artifactId>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>

2、服务提供者

pom.xml依赖文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example.demo.zookeeper</groupId>
  6. <artifactId>zookeeper-server</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>zookeeper-server</name>
  10. <description></description>
  11. <parent>
  12. <groupId>com.example.demo</groupId>
  13. <artifactId>springcloud-zookeeper</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. </parent>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. <java.version>1.8</java.version>
  20. </properties>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-actuator</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.cloud</groupId>
  32. <artifactId>spring-cloud-starter-hystrix</artifactId>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.cloud</groupId>
  36. <artifactId>spring-cloud-starter-ribbon</artifactId>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.springframework.cloud</groupId>
  40. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter-web</artifactId>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-test</artifactId>
  49. <scope>test</scope>
  50. </dependency>
  51. </dependencies>
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <groupId>org.springframework.boot</groupId>
  56. <artifactId>spring-boot-maven-plugin</artifactId>
  57. </plugin>
  58. </plugins>
  59. </build>
  60. </project>

application.yml配置文件:

  1. server:
  2. port: 8081
  3. spring:
  4. application:
  5. name: zookeeper-server
  6. cloud:
  7. zookeeper:
  8. connect-string: localhost:2181
  9. discovery:
  10. enabled: true
  11. register: true

暴露接口:

  1. package com.example.demo.zookeeper.controller;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import java.util.UUID;
  7. /**
  8. * 路径:com.example.demo.zookeeper.controller
  9. * 类名:
  10. * 功能:《用一句描述一下》
  11. * 备注:
  12. * 创建人:typ
  13. * 创建时间:2018/9/25 21:19
  14. * 修改人:
  15. * 修改备注:
  16. * 修改时间:
  17. */
  18. @RestController
  19. public class TestController {
  20. private static final Logger log = LoggerFactory.getLogger(TestController.class);
  21. private static final UUID INSTANCE_UUID = UUID.randomUUID();
  22. @GetMapping("/test")
  23. public String test(){
  24. log.info("test :" + INSTANCE_UUID.toString());
  25. return INSTANCE_UUID.toString();
  26. }
  27. }

启动类添加注解@EnableDiscoveryClient标注为服务发现注解

  1. package com.example.demo.zookeeper;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. @SpringBootApplication
  6. @EnableDiscoveryClient
  7. public class ZookeeperServerApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(ZookeeperServerApplication.class, args);
  10. }
  11. }

3、服务消费者

pom.xml依赖文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example.demo.zookeeper</groupId>
  6. <artifactId>zookeeper-client</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>zookeeper-client</name>
  10. <parent>
  11. <groupId>com.example.demo</groupId>
  12. <artifactId>springcloud-zookeeper</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. </parent>
  15. <properties>
  16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  17. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  18. <java.version>1.8</java.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-actuator</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.cloud</groupId>
  31. <artifactId>spring-cloud-starter-hystrix</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.cloud</groupId>
  35. <artifactId>spring-cloud-starter-ribbon</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.cloud</groupId>
  39. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-starter-web</artifactId>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.springframework.cloud</groupId>
  47. <artifactId>spring-cloud-starter-feign</artifactId>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-starter-test</artifactId>
  52. <scope>test</scope>
  53. </dependency>
  54. </dependencies>
  55. <build>
  56. <plugins>
  57. <plugin>
  58. <groupId>org.springframework.boot</groupId>
  59. <artifactId>spring-boot-maven-plugin</artifactId>
  60. </plugin>
  61. </plugins>
  62. </build>
  63. </project>

application.yml配置文件:

  1. server:
  2. port: 8082
  3. spring:
  4. application:
  5. name: zookeeper-client
  6. cloud:
  7. zookeeper:
  8. connect-string: localhost:2181
  9. discovery:
  10. enabled: true
  11. register: false

基于Feign的实现接口

  1. package com.example.demo.zookeeper.service;
  2. import com.example.demo.zookeeper.service.fallback.FeignFallback;
  3. import org.springframework.cloud.netflix.feign.FeignClient;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RequestMethod;
  6. /**
  7. * 路径:com.example.demo.zookeeper.service
  8. * 类名:
  9. * 功能:《用一句描述一下》
  10. * 备注:
  11. * 创建人:typ
  12. * 创建时间:2018/9/25 21:39
  13. * 修改人:
  14. * 修改备注:
  15. * 修改时间:
  16. */
  17. @FeignClient(value = "zookeeper-server",fallback = FeignFallback.class)
  18. public interface FeignService {
  19. @RequestMapping(value = "/test",method = RequestMethod.GET)
  20. public String test();
  21. }

fallback为断路器回调:

  1. package com.example.demo.zookeeper.service.fallback;
  2. import com.example.demo.zookeeper.service.FeignService;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * 路径:com.example.demo.zookeeper.service.fallback
  6. * 类名:
  7. * 功能:《用一句描述一下》
  8. * 备注:
  9. * 创建人:typ
  10. * 创建时间:2018/9/25 21:49
  11. * 修改人:
  12. * 修改备注:
  13. * 修改时间:
  14. */
  15. @Component
  16. public class FeignFallback implements FeignService {
  17. @Override
  18. public String test() {
  19. return "servie error!";
  20. }
  21. }

消费服务:

  1. package com.example.demo.zookeeper.controller;
  2. import com.example.demo.zookeeper.service.FeignService;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import java.util.UUID;
  9. /**
  10. * 路径:com.example.demo.zookeeper.controller
  11. * 类名:
  12. * 功能:《用一句描述一下》
  13. * 备注:
  14. * 创建人:typ
  15. * 创建时间:2018/9/25 21:43
  16. * 修改人:
  17. * 修改备注:
  18. * 修改时间:
  19. */
  20. @RestController
  21. public class TestController {
  22. private static final Logger log = LoggerFactory.getLogger(TestController.class);
  23. private static final UUID INSTANCE_UUID = UUID.randomUUID();
  24. @Autowired
  25. private FeignService feignService;
  26. @GetMapping("/test")
  27. public String test(){
  28. log.info("test :" +INSTANCE_UUID.toString());
  29. return feignService.test();
  30. }
  31. }

启动类添加注解@EnableCircuitBreaker为断路器的支持,@EnableFeignClients为Feign客户端的支持。

  1. package com.example.demo.zookeeper;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import org.springframework.cloud.netflix.feign.EnableFeignClients;
  6. @SpringBootApplication
  7. @EnableDiscoveryClient
  8. @EnableFeignClients
  9. public class ZookeeperClientApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(ZookeeperClientApplication.class, args);
  12. }
  13. }

启动工程,访问 http://localhost:8082/test,浏览显示:

  1. 09969381-2857-455c-b9f2-6fd5d3d25b16

消费者接口日志显示:

  1. 2018-09-26 10:27:32.195 INFO 12176 --- [nio-8082-exec-1] c.e.d.z.controller.TestController : test :ae5bdfce-887d-433f-a90a-cb4b8a1f109d

服务者接口日志显示:

  1. 2018-09-26 10:27:33.188 INFO 8204 --- [nio-8081-exec-1] c.e.d.z.controller.TestController : test :09969381-2857-455c-b9f2-6fd5d3d25b16

源码下载:https://download.csdn.net/download/typ1805/10687809

发表评论

表情:
评论列表 (有 0 条评论,673人围观)

还没有评论,来说两句吧...

相关阅读

    相关 注册中心zookeeper

    概念 Zookeeper是一个分布式、可靠的、可扩展的协调服务,为分布式应用提供一致性服务。它是树型结构,能做到集群管理数据,当提供者出现断电等异常停机时,zk能自动删除