SpringCloud集成zookeeper實現(xiàn)服務注冊并訪問功能
SpringCloud整合zookeeper實現(xiàn)服務注冊
前言:
zookeeper是一個分布式協(xié)調(diào)工具,可以實現(xiàn)注冊中心功能。換而言之,zookeeper和eureka一樣,是用于充當服務注冊功能服務器的一個springcloud插件。而隨著eureka停止更新,zookeeper也成為了市面大量使用的替代eureka的一門技術,為分布式項目實現(xiàn)注冊中心的功能。

一.環(huán)境準備
1.linux環(huán)境下的zookeeper環(huán)境
如果還未配置zookeeper環(huán)境的同學可以移步我的另外一篇文章喔,那里對如何在Linux環(huán)境下安裝zookeeper有著很詳細的介紹~
2.一個簡單的springcloud父項目環(huán)境

在cloud2022項目中的pom.xml導入springcloud依賴和一些常規(guī)依賴
<?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:發(fā)布在服務器上的工程,如網(wǎng)站或者是服務,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>
<!-- 統(tǒng)一管理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>
<!--只是聲明依賴,并不實現(xiàn)引入-->
<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下創(chuàng)建一個cloud-provider-payment8004作為服務提供者

2.在pom.xml文件中添加常規(guī)依賴和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中的節(jié)點只有l(wèi)ocks和zookeeper:

2.運行PaymentMain8004
運行成功后如下圖所示:

3.查看zookeeper中的節(jié)點
我們再一次查看zookeeper下的節(jié)點,可以看到services已經(jīng)被注冊且services下的節(jié)點即為我們application.yaml為該模塊配置的名字


4.訪問http://localhost:8004/payment/zk
出現(xiàn)如下字符串則證明搭建成功

四.編寫服務消費者模塊
1.在cloud2022下創(chuàng)建一個cloud-consumerzk-order80作為服務消費者

2.在pom.xml文件中添加常規(guī)依賴和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環(huán)境所在的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服務的方法,這些方法可以幫助開發(fā)人員減少編寫客戶端代碼的工作量。
* @return
*/
@Bean //將RestTemplate注冊到容器中
/**
* @LoadBalanced注解,我們在使用這個注解后,就能在調(diào)用其他微服務的時候,通過服務實例名稱就能進行調(diào)用其他的微服務,
* 而不是直接把要調(diào)用的微服務的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("消費者調(diào)用支付服務_result:"+result);
return result;
}
}五.測試服務消費者模塊是否搭建成功
1.啟動該服務消費者模塊

2.訪問http://localhost/consumer/payment/zk
結(jié)果如下則搭建成功

至此,我們SpringCloud集成zookeeper實現(xiàn)服務注冊的教程就結(jié)束啦~
到此這篇關于SpringCloud集成zookeeper實現(xiàn)服務注冊并訪問功能的文章就介紹到這了,更多相關SpringCloud集成zookeeper內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于RedisTemplate之opsForValue的使用說明
這篇文章主要介紹了關于RedisTemplate之opsForValue的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
RocketMQ源碼解析topic創(chuàng)建機制詳解
這篇文章主要為大家介紹了RocketMQ源碼解析topic創(chuàng)建機制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08

