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文件
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版本
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多个地址用逗号隔开即可
推荐链接
发表评论