写点什么

SpingCloud 集成 zookeeper 实现服务注册并访问

作者:AI乔治
  • 2022 年 7 月 03 日
  • 本文字数:6801 字

    阅读完需:约 22 分钟

SpingCloud集成zookeeper实现服务注册并访问

前言:

zookeeper 是一个分布式协调工具,可以实现注册中心功能。换而言之,zookeeper 和 eureka 一样,是用于充当服务注册功能服务器的一个 springcloud 插件。而随着 eureka 停止更新,zookeeper 也成为了市面大量使用的替代 eureka 的一门技术,为分布式项目实现注册中心的功能。

一.环境准备

1.linux 环境下的 zookeeper 环境

如果还未配置 zookeeper 环境的同学可以移步我的另外一篇文章喔,那里对如何在 Linux 环境下安装 zookeeper 有着很详细的介绍~

Linux 环境下 zookeeper 的安装教程(超详细!!)

https://blog.csdn.net/weixin_47025166/article/details/125405156?spm=1001.2014.3001.5502

2.一个简单的 springcloud 父项目环境

在 cloud2022 项目中的 pom.xml 导入 springcloud 依赖和一些常规依赖


<?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"> <modelVersion>4.0.0</modelVersion> <groupId>com.canrioyuan</groupId> <artifactId>cloud2022</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <!--父工程的打包方式必须为pom:表示父工程不写代码,只在父工程的pom.xml文件中使用配置版本, 子工程的打包方式才是war:发布在服务器上的工程,如网站或者是服务,maven会自动帮助我们指明这个工程为web工程 jar:默认打程jar工程,相当于打包--> <modules> <module>cloud-provider-payment8001</module> <module>cloud-consumer-order80</module> <module>cloud-api-commons</module> <module>cloud-eureka-server7001</module> <module>cloud-eureka-server7002</module> <module>cloud-provider-payment8002</module> <module>cloud-provider-payment8004</module> </modules> <!-- 统一管理jar包版本 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <lombok.version>1.18.24</lombok.version> <mysql.version>8.0.21</mysql.version> <druid.version>1.1.21</druid.version> <mybatis-plus.spring.boot.version>3.5.1</mybatis-plus.spring.boot.version> </properties> <!-- 子模块继承之后,提供作用:锁定版本+子module不用写groupId和version --> <dependencyManagement> <!--只是声明依赖,并不实现引入--> <dependencies> <!--spring boot 2.2.2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud Hoxton.SR1--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.spring.boot.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <optional>true</optional> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build> </project>
复制代码

二.编写服务提供者模块

1.在 cloud2022 下创建一个 cloud-provider-payment8004 作为服务提供者



 2.在 pom.xml 文件中添加常规依赖和 zookeeper、springboot 整合 zookeeper 客户端等依赖

        <!-- SpringBoot整合Web组件 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- SpringBoot整合zookeeper客户端 -->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>            <!--除去自带的zookeeper依赖-->            <exclusions>                <exclusion>                    <groupId>org.apache.zookeeper</groupId>                    <artifactId>zookeeper</artifactId>                </exclusion>            </exclusions>        </dependency>         <!--导入符合安装版本的zookeeper依赖-->        <dependency>            <groupId>org.apache.zookeeper</groupId>            <artifactId>zookeeper</artifactId>            <version>3.7.1</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>
复制代码


3.编写 application.yaml

#8004表示注册到zookeeper服务器的支付服务提供者端口号server:  port: 8004#服务别名----注册zookeeper到注册中心名称spring:  application:    name: cloud-provider-payment    #连接zookeeper  cloud:    zookeeper:      connect-string: 192.168.154.133:2181  #此处为对应的zookeeper客户端地址 
复制代码


4.编写主启动类 PaymentMain8004

package com.canrioyuan; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication@EnableDiscoveryClient   //该注解用于向使用consul或者zookeeper作为注册中心时注册服务public class PaymentMain8004 {     public  static void main(String[] args){        SpringApplication.run(PaymentMain8004.class,args);    }}
复制代码

5.编写 PaymentController

package com.canrioyuan.controller; import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; import java.util.UUID; @RestController@Slf4jpublic class PaymentController {        //获取配置文件中端口对应的值    @Value("${server.port}")    private String serverPort;     @RequestMapping(value = "/payment/zk")    public String paymentzk()    {        return "springcloud with zookeeper: "+serverPort+"\t"+ UUID.randomUUID().toString();    } }
复制代码

三.测试服务提供者模块是否搭建成功

1.运行 zookeeper 的客户端

进入 zookeeper 安装目录下的 bin 目录,启动 zookeeper 服务器

[root@zookeeper1 bin]# ./zkServer.sh start

启动 zookeeper 客户端

[root@zookeeper1 bin]# zkCli.sh

启动成功


可以看到,此时 zookeeper 中的节点只有 locks 和 zookeeper:


2.运行 PaymentMain8004

运行成功后如下图所示:


3.查看 zookeeper 中的节点

我们再一次查看 zookeeper 下的节点,可以看到 services 已经被注册且 services 下的节点即为我们 application.yaml 为该模块配置的名字



4.访问 http://localhost:8004/payment/zk

出现如下字符串则证明搭建成功


四.编写服务消费者模块

1.在 cloud2022 下创建一个 cloud-consumerzk-order80 作为服务消费者


2.在 pom.xml 文件中添加常规依赖和 zookeeper、springboot 整合 zookeeper 客户端等依赖

 <dependencies>        <!-- SpringBoot整合Web组件 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- SpringBoot整合zookeeper客户端 -->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>            <!--先排除自带的zookeeper-->            <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.7.1</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>
复制代码

3.编写 application.yaml

server:  port: 80 spring:  application:    name: cloud-consumer-order  cloud:    #注册到zookeeper地址    zookeeper:      connect-string: 192.168.154.133:2181   #zookeeper环境所在的Ip地址
复制代码


4.编写主启动类 OrderZk80

package com.canrioyuan; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplicationpublic class OrderZk80 {    public static void main(String[] args) {        SpringApplication.run(OrderZk80.class,args);    }}
复制代码


5.编写配置类 ApplicationContextConfig(用于注册 RestTemplate)

package com.canrioyuan.controller; 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; @Configurationpublic class ApplicationContextConfig {    /**     * RestTemplate是Spring提供的用于访问Rest服务的客户端,     * 它提供了很多可以方便访问远程http服务的方法,这些方法可以帮助开发人员减少编写客户端代码的工作量。     * @return     */    @Bean  //将RestTemplate注册到容器中    /**     * @LoadBalanced注解,我们在使用这个注解后,就能在调用其他微服务的时候,通过服务实例名称就能进行调用其他的微服务,     * 而不是直接把要调用的微服务的ip和端口号写死在代码当中。     */    @LoadBalanced    public RestTemplate getRestTemplate(){        return new RestTemplate();    }}
复制代码


6.编写 OrderController

package com.canrioyuan.controller; import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestControllerpublic class OrderZkController {    //声明固定的服务访问前缀    public static final String INVOKE_URL ="http://cloud-provider-payment";    //注入容器中注册的RestTemplate    @Resource    private RestTemplate restTemplate;     @GetMapping(value="/consumer/payment/zk")    public String PaymentInfo(){        String result = restTemplate.getForObject(INVOKE_URL+"/payment/zk", String.class);        System.out.println("消费者调用支付服务_result:"+result);        return result;    } }
复制代码


五.测试服务消费者模块是否搭建成功

1.启动该服务消费者模块

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

结果如下则搭建成功 


至此,我们 SpingCloud 集成 zookeeper 实现服务注册的教程就结束啦~

感谢您的阅读,希望我的文章能给你带来帮助!!!

看完三件事❤️

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。

  • 关注公众号 『 java 烂猪皮 』,不定期分享原创知识。

  • 关注后回复【666】扫码即可获取最新 Java 进阶架构 VIP 资料包

  • 同时可以期待后续文章 ing🚀


来源:https://blog.csdn.net/weixin_47025166/article/details/125474403?spm=1001.2100.3001.7377&utm_medium=distribute.pc_feed_blog_category.none-task-blog-classify_tag-9-125474403-null-null.nonecase&depth_1-utm_source=distribute.pc_feed_blog_category.none-task-blog-classify_tag-9-125474403-null-null.nonecase

用户头像

AI乔治

关注

分享后端技术干货。公众号【 Java烂猪皮】 2019.06.30 加入

一名默默无闻的扫地僧!

评论

发布
暂无评论
SpingCloud集成zookeeper实现服务注册并访问_AI乔治_InfoQ写作社区