Skip to main content
 首页 » 编程设计

介绍 Spring Cloud Zookeeper

2022年07月19日199yyy_WW

介绍 Spring Cloud Zookeeper

本文我们介绍Zookeeper如何用作服务发现组件。利用自动配置及绑定Spring环境,Spring Cloud Zookeeper提供了Spring Boot应用对Apache Zookeeper的整合。

1. 需求说明

为了演示,需要创建两个服务:

  • 服务提供者应用
  • 服务消费者应用

Apache Zookeeper作为服务发现的协调者,安装Apache Zookeeper请参考其官网。

2. 注册服务提供者

启用服务注册需要增加spring-cloud-starter-zookeeper-discovery 依赖,然后在主应用上使用@EnableDiscoveryClient注解。下面一步一步展示如何搭建服务提供者,让其通过Get请求返回 “Hello World!”。

2.1 maven依赖

首先需要在pom.xml文件中增加必要的依赖: spring-cloud-starter-zookeeper-discovery, spring-web, spring-cloud-dependencies 和 spring-boot-starter。

<dependencies> 
    <dependency> 
        <groupId>org.springframework.boot</groupId> 
	<artifactId>spring-boot-starter</artifactId> 
	<version>2.2.6.RELEASE</version> 
    </dependency> 
    <dependency> 
        <groupId>org.springframework</groupId> 
	<artifactId>spring-web</artifactId> 
        <version>5.1.14.RELEASE</version> 
    </dependency> 
    <dependency> 
        <groupId>org.springframework.cloud</groupId> 
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> 
     </dependency> 
</dependencies> 
<dependencyManagement> 
    <dependencies> 
        <dependency> 
            <groupId>org.springframework.cloud</groupId> 
            <artifactId>spring-cloud-dependencies</artifactId> 
            <version>Hoxton.SR4</version> 
            <type>pom</type> 
            <scope>import</scope> 
        </dependency> 
    </dependencies> 
</dependencyManagement> 

2.2 服务提供注解

接下来在主类上增加@EnableDiscoveryClient注解,使得HelloWorld应用能够感知服务发现:

@SpringBootApplication 
@EnableDiscoveryClient 
public class HelloWorldApplication { 
    public static void main(String[] args) { 
        SpringApplication.run(HelloWorldApplication.class, args); 
    } 
} 

现在添加一个简单controller:

@GetMapping("/helloworld") 
public String helloWorld() { 
    return "Hello World!"; 
} 

2.3 yaml配置

最后创建YAML Application.yml 配置文件,配置应用的日志级别并通知Zookeeper应用启用服务发现。配置应用名称非常重要,后面服务消费者feign客户端通过该名称查询服务:

spring: 
  application: 
    name: HelloWorld 
server: 
  port: 8081 
endpoints: 
  restart: 
    enabled: true 
logging: 
  level: 
    org.apache.zookeeper.ClientCnxn: WARN 
 

Spring boot应用缺省在2181端口查找zookeeper,当然需要配置zookeeper位置,安装在本地时增加下面内容:

spring: 
  cloud: 
    zookeeper: 
      connect-string: localhost:2181 

3. 注册服务消费者

现在创建Rest服务消费者,并注册Spring Netflix Fveign Client。

3.1 maven依赖

首先增加必要的依赖 spring-cloud-starter-zookeeper-discovery, spring-web, spring-cloud-dependencies, spring-boot-starter-actuator 和 spring-cloud-starter-feign 至pom.xml文件:

<dependencies> 
    <dependency> 
        <groupId>org.springframework.cloud</groupId> 
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> 
    </dependency> 
    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-actuator</artifactId> 
        <version>2.2.6.RELEASE</version> 
    </dependency> 
    <dependency> 
        <groupId>org.springframework.cloud</groupId> 
        <artifactId>spring-cloud-starter-feign</artifactId> 
    </dependency> 
</dependencies> 
<dependencyManagement> 
    <dependencies> 
        <dependency> 
            <groupId>org.springframework.cloud</groupId> 
            <artifactId>spring-cloud-dependencies</artifactId> 
            <version>Hoxton.SR4</version> 
            <type>pom</type> 
            <scope>import</scope> 
        </dependency> 
    </dependencies> 
</dependencyManagement> 
  

3.2 服务消费注解

与服务提供者一样,在主类上增加@EnableDiscoveryClient 注解使得感知服务发现:

@SpringBootApplication 
@EnableDiscoveryClient 
public class GreetingApplication { 
  
    public static void main(String[] args) { 
        SpringApplication.run(GreetingApplication.class, args); 
    } 
} 

3.3 使用Feign Client发现服务

我们使用Spring Cloud Feign Integration————Netflix提供的声明式REST客户端,仅需声明服务url,feign复杂连接rest服务。Feign Client时通过spring-cloud-starter-feign 包导入。因此在应用中增加@Configuration 和 @EnableFeignClients注解。

最后在接口上增加@FeignClient(“service-name”) 注解,并自动装载其至应用中,利用其访问服务。这里我们注解的内容为 @FeignClient(name = “HelloWorld”), 通过服务名称引用前面创建的服务提供者。

@Configuration 
@EnableFeignClients 
@EnableDiscoveryClient 
public class HelloWorldClient { 
    @Autowired 
    private TheClient theClient; 
  
    @FeignClient(name = "HelloWorld") 
    interface TheClient { 
        @RequestMapping(path = "/helloworld", method = RequestMethod.GET) 
        @ResponseBody 
        String helloWorld(); 
    } 
 
    public String HelloWorld() { 
        return theClient.HelloWorld(); 
    } 
} 

3.4 定义Controller

下面是简单服务Controller 类,通过feign客户端调用服务提供者消费服务(当然是通过服务发现进行调用)。

@RestController 
public class GreetingController { 
  
    @Autowired 
    private HelloWorldClient helloWorldClient; 
  
    @GetMapping("/get-greeting") 
    public String greeting() { 
        return helloWorldClient.helloWorld(); 
    } 
} 

3.5 YAML 配置

创建YAML文件,与前面类似配置应用日志级别:

spring: 
  application: 
    name: Greeting 
  cloud: 
    zookeeper: 
      connect-string: localhost:2181 
server: 
  port: 8083 
logging: 
  level: 
    org.apache.zookeeper.ClientCnxn: WARN 

配置zookeeper:

spring: 
  cloud: 
    zookeeper: 
      connect-string: localhost:2181 
      discovery: 
        enabled: true 

4. 测试应用

在部署时HelloWorld Rest服务注册自身至Zookeeper中,然后Greeting服务作为服务消费者使用Feign客户端调用HelloWorld服务。现在构建并启动两个服务,最后通过 http://localhost:8083/get-greeting 进行访问,输出响应结果:

Hello World! 

5. 总结

本文介绍了使用Spring Cloud Zookeeper作为服务发现,然后在zookeeper中注册服务提供者和服务消费者,最后消费者通过Feign客户端进行服务调用。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/109278904