Spring Cloud(三) zookeeper实现服务治理

1.安装ZooKeeper

我这里直接使用docker安装zookeeper,docker是个好东西,推荐大家使用,安装docker和常用命令的使用可以去找找资料学习下

2. 服务注册和发现

1.1 Maven依赖

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>


    <!-- ZK依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    </dependency>

    <!--修改后立即生效,热部署-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>springloaded</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>

1.2 SpringBoot主程序

/**
 *
 * @author lpf
 */
@SpringBootApplication
@EnableDiscoveryClient
public class LemonZkApplication {


    public static void main(String[] args) {
        SpringApplication.run(LemonZkApplication.class, args);
    }
}

1.3 配置文件

server:
  port: 5001
endpoints:
  restart:
    enabled: true
spring:
  application:
    name: lemon-zk
  cloud:
    zookeeper:
      discovery:
        root: /lemon-service #服务注册的跟节点
        enabled: true
        register: true #是否需要进行服务注册
      connect-string: 192.168.199.156:2181 #zk集群主机,多个用逗号隔开

1.4 测试controller

这里注意getInstances方法参数是你配置的应用名称,区分大小写(因为Eureka的习惯我一直用大写,导致查找不到服务)

@RestController
public class TestController {
    @Autowired
    DiscoveryClient discoveryClient;

    @GetMapping("/test")
    public String test() {
        //获取实例化的注册节点
        List<ServiceInstance> list = discoveryClient.getInstances("lemon-zk");

        //获取实例化的服务
        StringBuffer sb = new StringBuffer();
        if (list != null && list.size() > 0 ) {
            sb.append(list.get(0).getUri()+",");
        }
        return "hello world  "+sb.toString();
    }
}

测试结果,这里有一个问题,怎么让注册的是服务的ip地址呢,这里显示的是服务的主机名,找了好久资料没发现,知道的大佬们告知一声

zookeeper下的节点信息

在这里介绍下Zookeeper与Eureka这两种服务治理框架的区别。Spring Cloud Eureka实现的服务治理机制强调了CAP原理中的AP,即可用性与可靠性,而Zookeeper这类强调CP(一致性、可靠性)。Eureka为了实现更高的服务可用性,牺牲了一定的一致性,在极端情况下它宁愿接受故障实例也不要丢掉“健康”实例,比如,当服务注册中心的网络发生故障断开时,由于所有的服务实例无法维持续约心跳,在强调CP的服务治理中将会把所有服务实例都剔除掉,而Eureka则会触发保护机制,保留此时的所有节点,以实现服务间依然可以进行互相调用的场景。

码云:https://gitee.com/lemonLove/lemon-cloud

猜你喜欢

转载自my.oschina.net/u/3737136/blog/1927660
今日推荐