首頁 > 軟體

SpringCloud整合zookeeper實現服務註冊並存取功能

2022-06-28 14:03:19

SpringCloud整合zookeeper實現服務註冊

前言:

zookeeper是一個分散式協調工具,可以實現註冊中心功能。換而言之,zookeeper和eureka一樣,是用於充當服務註冊功能伺服器的一個springcloud外掛。而隨著eureka停止更新,zookeeper也成為了市面大量使用的替代eureka的一門技術,為分散式專案實現註冊中心的功能。

一.環境準備

1.linux環境下的zookeeper環境

如果還未設定zookeeper環境的同學可以移步我的另外一篇文章喔,那裡對如何在Linux環境下安裝zookeeper有著很詳細的介紹~

linux上安裝zookeeper 啟動和關閉的教學

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
@Slf4j
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();
    }
 
}

三.測試服務提供者模組是否搭建成功

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.編寫主啟動類PaymentMain8004

package com.canrioyuan;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public 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;
 
@Configuration
public 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;
 
@RestController
public 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

結果如下則搭建成功

至此,我們SpringCloud整合zookeeper實現服務註冊的教學就結束啦~

到此這篇關於SpringCloud整合zookeeper實現服務註冊並存取功能的文章就介紹到這了,更多相關SpringCloud整合zookeeper內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com