SpringCloud之Zookeeper服务注册与发现

141 阅读3分钟

Cloud技术栈

Linux安装Zookeeper

zookeeper是一个分布式协调工具,可以实现注册中心功能

zookeeper服务器取代Eureka服务器,zk作为服务注册中心

windows安装可以看www.kylin.show/1129.html

Zookeeper官网zookeeper.apache.org/

image-20200706213812897

下载地址zookeeper.apache.org/releases.ht…

image-20200706213833499

下载后安装上传到Linux系统中,解压即可tar -zxvf 压缩包名

解压zookeeper,运行/bin/zkServer.sh ,初次运行会报错,**没有zoo.cfg配置文件。**将zoo_sample.cfg复制一份并改名成zoo.cfg即可

接着cd到bin目录sh zkServer.sh start运行zookeeper,运行在2181端口。(记得开放端口)

image-20200706214835671

sh zkServer.sh status查看运行状态

使用sh zkCli.sh连接zookeeper

image-20200706215201178

安装完成!

  • 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
  • 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
  • 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串
  • 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
  • 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置
  • 删除文件: delete /zk 将刚才创建的 znode 删除
  • 退出客户端: quit
  • 帮助命令: help

当前只有zookeeper一个节点

image-20200707070859082

服务提供者注册

新建cloud-provider-payment8004

image-20200707065437023

pom

<dependencies>
    <dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
        <groupId>com.kylin</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <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>
    <!--SpringBoot整合Zookeeper客户端-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    </dependency>
    <!--添加zookeeper3.4.14版本-->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.14</version>
    </dependency>
    <!--热部署-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

yml

image-20200707065749999

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

#服务别名---注册zookeeper到注册中心名称
spring:
  application:
    name: cloud-provider-payment
  cloud:
    zookeeper:
      connect-string: icloud.kylin.show:2181 #zookepper服务地址

主启动类

使用@EnableDiscoveryClient注解,该注解1.可以获取服务信息,2.用于向consul或者zookeeper作为注册中心的时候提供注册服务。

image-20200707070353496

@SpringBootApplication
//用于向consul或者zookeeper作为注册中心的时候提供注册服务
@EnableDiscoveryClient
public class PaymentMain8004 {

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

controller

image-20200707070544025

@RestController
public class PaymentController {


    @Value("${server.port}")
    private String serverPort;

    @RequestMapping("/payment/zk")
    public String paymentzk(){
        return "SpringCloud with zookeeper:" + serverPort+"\t"+ UUID.randomUUID().toString();
    }
}

测试

启动进行测试

image-20200707071642573

ls /查看zookeeper,多了一个services节点

image-20200707071720440

查看该节点ls /services

image-20200707071802620

注册成功,继续深挖

image-20200707072125090

可以看到该节点的详细信息,端口号,地址等等

访问http://localhost:8004/payment/zk查看

GIF719

全部正常,测试成功!

临时节点

服务节点是临时节点还是持久节点?我们先关掉8004,然后等待一段时间,查看zookeeper节点

image-20200707072637346

image-20200707072726507

可以发现已经没有相关信息了,是临时节点

重新启动,查看节点

image-20200707072928051

成功注册,并且有了一个新的流水号

image-20200707072946679

服务消费者注册

新建cloud-consumerzk-order80

image-20200707073207139

pom

<dependencies>
    <dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
        <groupId>com.kylin</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <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>
    <!--SpringBoot整合Zookeeper客户端-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        <exclusions>
            <!--先排除自带的zookeeper3.5.3-->
            <exclusion>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!--添加zookeeper3.4.14版本-->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.14</version>
    </dependency>
    <!--热部署-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

yml

image-20200707073403347

server:
  port: 80

spring:
  application:
    name: cloud-consumer-order
  cloud:
    #注册到zookeeper地址
    zookeeper:
      connect-string: icloud.kylin.show:2181

主启动类

image-20200707074321293

@EnableDiscoveryClient这里作用是如果要用到服务发现功能

@SpringBootApplication
@EnableDiscoveryClient//这里作用是如果要用到服务发现功能
public class OrderZKMain80 {

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

RestTemplate

配置RestTemplate,编写ApplicationContextConfig

image-20200707074621187

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced//使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

controller

使用RestTemplate调用服务

image-20200707074749268

@RestController
@Slf4j
public class OrderZKController {

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

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/zk")
    public String paymentInfo(){

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

        return result;
    }
}

测试

启动ZK80(8004启动)

image-20200707074954966

查看zookeeper注册中心,服务消费者成功注册

image-20200707075023505

访问http://localhost/consumer/payment/zk

GIF751

成功!

篇幅较短,主要重点是Nacos