【SpringCloud笔记】(3)服务注册中心之Zookeeper

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。【SpringCloud笔记】(3)服务注册中心之Zookeeper,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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文件

<artifactId>cloud-provider-payment8004</artifactId>

<dependencies>
    <!-- SpringBoot整合Web组件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <groupId>com.mzr.springcloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>${project.version}</version>
    </dependency>
    <!-- SpringBoot整合zookeeper客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    </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>

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版本

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        <!--先排除自带的zookeeper3.5.3-->
        <exclusions>
            <exclusion>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!--添加zookeeper3.4.9版本-->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.9</version>
        <!-- 排除和 slf4j 冲突的 jar包 -->
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency> 

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多个地址用逗号隔开即可

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/194582.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!