ZooKeeper

zookeeper是一个分布式协调工具,可以实现注册中心功能关闭Linux服务器防火墙后动zookeeper服务器zookeeper服务器取代Eureka服务器,zk作为服务注册中心

docker安装Zookeeper

我们使用docker启动zookeeper镜像,因为使用比较方便

拉取镜像:docker pull zookeeper

查看本地镜像:docker images

启动镜像:docker run --network host --name zookeeper -d zookeeper3.4.9

zookeeper:3.4.9使用host网络模式启动

查看正在运行的容器:docker ps

启动完容器后进入交互模式:docker exec -it 容器ID bash

cd到bin目录下执行zkCli.sh脚本开启客户端

接下来的操作与常规安装zookeeper后的操作一致

SpringCloud整合zookeeper

新建服务提供者cloud-provider-payment8004

1、pom文件

cloud-provider-payment8004

org.springframework.boot

spring-boot-starter-web

com.mzr.springcloud

cloud-api-commons

${project.version}

org.springframework.cloud

spring-cloud-starter-zookeeper-discovery

org.springframework.boot

spring-boot-devtools

runtime

true

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-test

test

2、yml文件

#8004表示注册到zookeeper服务器的支付服务提供者端口号

server:

port: 8004

#服务别名----注册zookeeper到注册中心名称

spring:

application:

name: cloud-provider-payment

cloud:

zookeeper:

#ip根据自己虚拟机ip调整

connect-string: 192.168.254.130:2181

3、主启动类

@SpringBootApplication

@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为服务注册中心时注册服务,不再使用@EnableEurekaClient

public class PaymentMain8004 {

public static void main(String[] args) {

SpringApplication.run(PaymentMain8004.class, args);

}

}

4、controller层

@Slf4j

@RestController

public class PaymentController {

@Value("${server.port}")

private String serverPort;

@RequestMapping(value = "/payment/zk")

public String paymentzk()

{

return "springcloud with zookeeper: "+serverPort+"\t"+ UUID.randomUUID().toString();

}

}

5、启动微服务

发现有报错,微服务启动失败 原因:因为引入spring-cloud-starter-zookeeper-discovery依赖,自带的zookeeper版本与我们启动的zookeeper版本不一致(我们启动的版本:3.4.9) 如何解决版本jar包冲突问题? 修改pom文件,排除自带的zookeeper3.5.3,添加zookeeper3.4.9版本

org.springframework.cloud

spring-cloud-starter-zookeeper-discovery

org.apache.zookeeper

zookeeper

org.apache.zookeeper

zookeeper

3.4.9

org.slf4j

slf4j-log4j12

6、启动应用,测试

访问到最后一层返回了一个json字符串

在zookeeper服务器上存在着znode节点

每一个注册的微服务都作为一个节点放在zookeeper服务器上,那么服务节点是临时节点还是持久节点?

答案:临时节点

当微服务在一定时间内没有向zookeeper发送心跳,那么zookeeper会将该znode踢掉,重新连接zookeeper服务器后,微服务id流水号会重新生成(没有自我保护机制)

新建服务消费者cloud-consumerzk-order80

pom文件、yml文件、主启动类与cloud-provider-payment8004相似,便不再展示

config文件

@SpringBootConfiguration

public class ApplicationContextConfig {

@Bean

@LoadBalanced

public RestTemplate getTemplate(){

return new RestTemplate();

}

}

controller层

@RestController

@Slf4j

public class OrderController {

public static final String INVOKE_URL = "http://cloud-provider-payment";

@Resource

private RestTemplate restTemplate;

@RequestMapping("/customer/payment/zk")

public String paymentInfo(){

String result = restTemplate.getForObject(INVOKE_URL + "/payment/zk",String.class);

return result;

}

}

启动测试

可以看到服务消费者已经注册到zookeeper里

如果使用zookeeper集群版,那么yml文件zookeeper多个地址用逗号隔开即可

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: