微服务—Zookeeper实现注册中心

前言

实现SpringCloud与Zookeeper整合,将Zookeeper作为注册中心实现!


一、服务间通信

在微服务系统中,服务间通信的手段主要有以下两种:

  • HTTP 应用层协议 ,通过使用 http rest 方式,采用json作为数据交换格式进行通信,优点在于高度解耦但是效率比较低;
  • RPC 传输层协议,直接使用二进制的方式来传递数据,优点是效率高,缺点是耦合度高而且通信的两个服务必须使用相同的语言进行开发。
  • SpringCloud 推荐使用 http rest的方式来进行系统间通信,主要采用HttpClient对象,该对象被封装成了RestTemplate对象进行操作,更加简单。

二、简单整合Zookeeper

pom.xml

    <dependencies>
        <!-- 引入自定义的通用api包-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-zookeeper-discovery -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>

    </dependencies>

application.yml

server:
  port: 8083

# Zookeeper服务注册中心
spring:
  cloud:
    zookeeper:
      connect-string: 192.168.1.6:2181,192.168.1.7:2181,192.168.1.8:2181
  application:
    name: cloud-provider-payment

Application

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

Zookeeper生成的服务节点是临时的,区别于Eureka的自我保护机制,Zookeeper在一定时间内如果没有收到心跳包,则不管当前网络状态如何,都会选择去删除掉该服务。
当该微服务再次注册进注册中心时会重新生成对应的版本号等数据信息。

三、配置Zookeeper客户端

application.yml

server:
  port: 80
spring:
  cloud:
    zookeeper:
      connect-string: 192.168.1.6:2181,192.168.1.7:2181,192.168.1.8:2181
  application:
    name: cloud-consumer-order-service

Config
类似于Eureka注册一样,需要将RestTemplate注册进容器中

@Configuration
public class ApplicationConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

ConsumerzkController

@RestController
@RequestMapping("/order")
public class ConsumerzkController {
    //注意这里的服务名前面需要加上  http://
    private static final String  ZK_CLOUD_PROVIDER_PAYMENT="http://cloud-provider-payment";

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/payment")
    public String getPayment(){
        return restTemplate.getForObject(ZK_CLOUD_PROVIDER_PAYMENT+"/payment/zk",String.class);
    }
}

四、测试

在这里插入图片描述
可以发现对应的注册服务变成了两个,cloud-provider-payment(支付微服务提供方)、cloud-consumer-order-service(消费者服务调用方)。
在这里插入图片描述
浏览器请求后发现成功调用了payment微服务。


版权声明:本文为qq_43684985原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。