服务注册中心(Zookeeper)

1、Zookeeper的安装

①、拉取Zookeeper镜像

#拉取Zookeeper镜像
docker pull zookeeper

image-20210206113831652

#启动Zookeeper
docker run --name zookeeper_1 -p 2181:2181 --restart always -d zookeeper

image-20210206114005915

image-20210206120400990

②、开放安全组

此步骤针对云服务器,本地虚拟机可关闭防火墙

image-20210206114607215

2、注册服务提供者

①、建module

image-20210206114955949

②、POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloudDemo</artifactId>
        <groupId>com.phz.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>CloudProviderPayment8004</artifactId>

    <dependencies>
        <!--SpringBoot整合Zookeeper客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>
        <!--web和actuator在spring-boot中几乎是绑定到一块的,后面的图形化显示和坐标监控,图形处理都非常重要-->
        <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>
        <dependency>
            <groupId>com.phz.springcloud</groupId>
            <artifactId>CloudAPI</artifactId>
            <version>1.0-SNAPSHOT</version>
        </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>
        </dependency>
    </dependencies>

</project>

③、YML

server:
  port: 8004

spring:
  application:
    name: cloud-payment-service
  cloud:
    zookeeper:
      connect-string: 39.105.43.3:2181
      discovery:
      	enabled: true
      	#这是本机IP
      	instance-host: 192.168.1.6

④、主启动类

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/6 11:55
 * @projectName SpringCloudDemo
 * @className PaymentMain8004.java
 * @description TODO
 */
@SpringBootApplication
@EnableDiscoveryClient//该主解用于向使用consul或者zookeeper作为注册中心注册服务
public class PaymentMain8004 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(PaymentMain8004.class, args);
    }
}

⑤、业务

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/6 11:59
 * @projectName SpringCloudDemo
 * @className PaymentController.java
 * @description TODO
 */
@RestController
@Slf4j
public class PaymentController {
    
    
    @Value("${server.port}")
    private String serverPort;

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

⑥、测试

image-20210206121814361

在容器中查看服务

#以交互模式进入容器
docker exec -it zookeeper_1 /bin/bash

#进去zookeeper
zkCli.sh

#查看启动的服务
ls /service

image-20210206132331148

image-20210206132438854

如果你的Zookeeper版本和你引入的spring-cloud-starter-zookeeper-discovery依赖中自带的Zookeeper包版本不一致,就会因为jar包冲突而启动不起来

image-20210206122603028

这里就应该手动排除这个冲突,并手动引入指定版本的jar

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    <!--排除自带的zookeeper3.5.3-->
    <exclusion>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
    </exclusion>
    </exclusions>
</dependency>
<!--添加zookeeper3.4.9版本(引入对应版本的依赖)-->
<dependency>-->
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
</dependency>

查看zookeeper中服务的流水号

#可以打印出该服务的流水号
ls /services/cloud-payment-service 

image-20210206132805471

根据流水号查看服务的详细信息

#查看详细信息
get /services/cloud-payment-service/3d1ddb0d-89c5-46d9-8376-c7dbcd2a1909

image-20210206132853684

//解析出来就是这样的
{
    
    
  "name": "cloud-payment-service",
  "id": "3d1ddb0d-89c5-46d9-8376-c7dbcd2a1909",
  "address": "1",
  "port": 8004,
  "sslPort": null,
  "payload": {
    
    
    "@class": "org.springframework.cloud.zookeeper.discovery.ZookeeperInstance",
    "id": "cloud-payment-service",
    "name": "cloud-payment-service",
    "metadata": {
    
    
      "instance_status": "UP"
    }
  },
  "registrationTimeUTC": 1612585018184,
  "serviceType": "DYNAMIC",
  "uriSpec": {
    
    
    "parts": [
      {
    
    
        "value": "scheme",
        "variable": true
      },
      {
    
    
        "value": "://",
        "variable": false
      },
      {
    
    
        "value": "address",
        "variable": true
      },
      {
    
    
        "value": ":",
        "variable": false
      },
      {
    
    
        "value": "port",
        "variable": true
      }
    ]
  }
}

⑦、结论

我们的每一个微服务作为一个节点保存在Zookeeper中,且这个微服务是一个临时节点,当这个微服务节点停止以后,Zookeeper也会像Eureka一样持续给它发送心跳包,当连续的一段时间没有收到回应后,Zookeeper也会把它干掉,当服务重新启动后,它再次会加入到Zookeeper节点中,但是流水号就不再和以前一样了

3、注册服务消费者

①、建module

image-20210206133928777

②、POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloudDemo</artifactId>
        <groupId>com.phz.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>CloudConsumerOrder8005</artifactId>

    <dependencies>
        <!--SpringBoot整合Zookeeper客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>
        <!--web和actuator在spring-boot中几乎是绑定到一块的,后面的图形化显示和坐标监控,图形处理都非常重要-->
        <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>
        <dependency>
            <groupId>com.phz.springcloud</groupId>
            <artifactId>CloudAPI</artifactId>
            <version>1.0-SNAPSHOT</version>
        </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>
        </dependency>
    </dependencies>
</project>

③、YML

server:
  port: 8005

spring:
  application:
    name: cloud-consumer-order
  cloud:
    #注册到zookeeper中
    zookeeper:
      connect-string: 39.105.43.3:2181
      discovery:
      	enabled: true
      	#这是本机IP
      	instance-host: 192.168.1.6

④、主启动类

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/6 13:44
 * @projectName SpringCloudDemo
 * @className OrderMain8005.java
 * @description TODO
 */
@SpringBootApplication
@EnableDiscoveryClient
public class OrderMain8005 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(OrderMain8005.class, args);
    }
}

⑤、全局配置类

注入RestTemplate

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/6 13:46
 * @projectName SpringCloudDemo
 * @className ApplicationContextConfig.java
 * @description TODO
 */
@Configuration
public class ApplicationContextConfig {
    
    

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
    
    
        return new RestTemplate();
    }
}

⑥、业务类

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/6 13:48
 * @projectName SpringCloudDemo
 * @className OrderController.java
 * @description TODO
 */
@RestController
@Slf4j
public class OrderController {
    
    
    @Resource
    private RestTemplate restTemplate;

    //调用地址
    private static final String INVOKE_URL = "http://localhost:8004";

    @GetMapping(value = "/consumer/payment/zookeeper")
    public String paymentInfo() {
    
    
        return restTemplate.getForObject(INVOKE_URL + "/payment/zookeeper", String.class);
    }
}

⑦、测试

image-20210206150457775

4、关于集群

注意到我已经添加了@LoadBalanced,已经可以通过负载均衡依赖服务名从注册中心拉取服务URL了,所以集群相当于也搭建成功,区别仅仅在于我只添加了一个服务而已,新增一个毫无疑问也是可以成功的。

猜你喜欢

转载自blog.csdn.net/qq_43509535/article/details/113726089