springCloud zookeeper整合,Java Zookeeper微服务注册中心整合

springCloud zookeeper整合,Java Zookeeper微服务注册中心整合

springCloud整合zookeeper代替Eureka

================================

©Copyright 蕃薯耀 2021-03-08

https://www.cnblogs.com/fanshuyao/

Eureka当前已经停止更新,部分项目只存在维护的状态,以后应该就是停止维护,所以有些项目使用了zookeeper作为服务注册中心。这只是其中的一种方式,还可以使用Consul或者Nacos代替

zookeeper将服务SPRINGCLOUD-ZK-CLIENT-SERVICE以节点的形式注册进来,zookeeper的服务节点是临时的并非持久的。

eureka和zookeeper上注册的服务,服务关闭了不会立马消失,会存在一个心跳。

但是eureka注册的服务停止,并不会删除,会在注册中心保留。而zookeeper上的服务停止,zookeeper会删除服务的节点。

服务再次启动注册到zookeeper中,会生成一个新的服务节点。从某种意义上可以说eureka是持久的,zookeeper是临时的

一、Zookeeper的安装和使用
详情见:

https://www.cnblogs.com/fanshuyao/p/13845076.html

二、springCloud zookeeper整合-服务提供者
1、pom.xml引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    <version>2.2.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.4.4</version>
</dependency>

2、application.properties文件配置

server.port=8611

#zookeeper的服务区分大小写
spring.application.name=SPRINGCLOUD-ZK-CLIENT-SERVICE
#zookeeper连接地址
spring.cloud.zookeeper.connect-string=192.168.170.14:2181
#服务实例ID
spring.cloud.zookeeper.discovery.instance-id=${spring.application.name}

3、启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringCloudZkClient8611Application {

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

}

4、服务提供类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ZkClientController {

    @Value("${server.port}")
    private String serverPort;
    
    @RequestMapping("/zk")
    public Result zk() {
        return Result.ok("端口:" + serverPort);
    }
}


5、返回结果类

import java.util.Date;

import cn.hutool.core.date.DateUtil;

public class Result {
    
    public static final String SUCCESS = "操作成功。";
    public static final String FAILURE = "操作失败!";
    
    private boolean result;
    private String timestamp;
    private String msg;
    private Object datas;
    
    private Result() {}
    
    public static Result ok() {
        return Result.ok(SUCCESS, null);
    }
    
    
    public static Result ok(Object datas) {
        return Result.ok(SUCCESS, datas);
    }
    
    
    public static Result okMsg(String msg) {
        return Result.ok(msg, null);
    }
    
    
    public static Result ok(String msg, Object datas) {
        Result result = new Result();
        result.setResult(true);
        result.setTimestamp(DateUtil.formatDateTime(new Date()));
        
        if(msg == null || msg == "" || msg.trim() == "") {
            result.setMsg(SUCCESS);
        }else {
            result.setMsg(msg);
        }
        
        result.setDatas(datas);
        return result;
    }
    
    public static Result fail() {
        return Result.fail(FAILURE, null);
    }
    
    
    public static Result failMsg(String msg) {
        return Result.fail(msg, null);
    }
    
    
    public static Result fail(Object datas) {
        return Result.fail(FAILURE, datas);
    }
    
    public static Result fail(String msg, Object datas) {
        Result result = new Result();
        result.setResult(false);
        result.setTimestamp(DateUtil.formatDateTime(new Date()));
        
        if(msg == null || msg == "" || msg.trim() == "") {
            result.setMsg(FAILURE);
        }else {
            result.setMsg(msg);
        }
        result.setDatas(datas);
        return result;
    }
    
    public boolean isResult() {
        return result;
    }
    public void setResult(boolean result) {
        this.result = result;
    }
    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public Object getDatas() {
        return datas;
    }
    public void setDatas(Object datas) {
        this.datas = datas;
    }
    

    public static void main(String[] args) {
        
    }

}

三、springCloud zookeeper整合-服务消费者
1、pom.xml引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    <version>2.2.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.4.4</version>
</dependency>


2、application.properties配置

server.port=8621

spring.application.name=springCloud-zk-web
spring.cloud.zookeeper.connect-string=192.168.170.14:2181
spring.cloud.zookeeper.discovery.instance-id=${spring.application.name}

3、启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringCloudZkWeb8621Application {

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

}

4、RestTemplate配置类

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestConfig {

    //@LoadBalanced实现负载均衡
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

5、Controller请求类

注意:zookeeper的服务名是区分大小写的

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ZkController {

    //zookeeper的服务区分大小写:No instances available for SPRINGCLOUD-ZK-CLIENT-SERVICE
    private String serviceUrl = "http://SPRINGCLOUD-ZK-CLIENT-SERVICE";
    
    @Autowired
    private RestTemplate restTemplate;
    
    @RequestMapping(value="/getzk", produces = MediaType.APPLICATION_JSON_VALUE)
    public Result getzk() {
        Result result = restTemplate.getForObject(serviceUrl + "/zk", Result.class);
        return result;
    }
}


6、结果返回类(省略,见上面服务提供者结果返回类)

(时间宝贵,分享不易,捐赠回馈,^_^)

================================

©Copyright 蕃薯耀 2021-03-08

https://www.cnblogs.com/fanshuyao/

今天越懒,明天要做的事越多。
原文地址:https://www.cnblogs.com/fanshuyao/p/14498366.html