Spring Cloud (5) 整合第三方注册中心

Spring Cloud默认提供Eureka作为注册中心,但是,为了满足不同的需求,Spring Cloud还可以和其他第三方注册中心整合,如Zookeeper(Java编写)和Consul(Go语言编写)。

对于其他注册中心的整合,和整合Eureka的区别有三点:

  • 所需依赖不同
  • 配置信息不同
  • 客户端注解不同

但是,对于不同的注册中心,客户端的调用方式如RestTemplate、Feign以及Ribbon负载均衡等都是一致的,这得益于组件化的开发方式。

与第三方注册中心的整合是件轻松的工作。下面让我们一起实战。

我们可以继续在之前的项目中添加项目模块,也可以新建一个项目,因为本章的内容和之前的项目没有任何关联。

一、整合Zookeeper

1、Zookeeper Server

(1)下载Zookeeper-3.5.3-beta版本

http://mirrors.shu.edu.cn/apache/zookeeper/

(2)配置Zookeeper

进入zookeeper-3.5.3-beta\conf目录,复制zoo_sample.cfg为zoo.cfg,修改其中的数据存放位置即可

# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=tmp/zookeeper

(3)启动

执行zookeeper-3.5.3-beta\bin目录下的zkServer.cmd(windows)或zkServer.sh(Linux)即可。

Zookeeper Server的默认端口是2181。

2、代码

创建一个zk-client项目,引入web和zookeeper-discovery依赖。

配置application.yml:

server:
  port: 9590
spring:
  application:
    name: zk-client
  cloud:
    zookeeper:
      connect-string: localhost:2181 # 指定zk-server地址

为了方便,我们直接在启动类ZkClientApplication.java编写服务接口:

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ZkClientApplication {

    @RequestMapping("member")
    String getMember() {
        return "member";
    }

    public static void main(String[] args) {
        SpringApplication.run(ZkClientApplication.class, args);
    }
}

不要忘记添加@EnableDiscoveryClient注解,表示这是注册中心的客户端,向注册中心注册服务。

为了演示负载均衡,我们再创建一个zk-client2项目, 同样引入web和zookeeper-discovery依赖。

配置application.yml:

spring:
  application:
    name: zk-client
  cloud:
    zookeeper:
      connect-string: localhost:2181
server:
  port: 9591

在入口类再编写一个/member服务接口,并在/order接口通过RestTemplate进行调用,通过@LoadBalanced注解开启负载均衡 (整合第三方注册中心的依赖包中已包含ribbon负载均衡器) 。

ZkClient2Application.java

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ZkClient2Application {

    @Resource
    private RestTemplate restTemplate;
    
    @RequestMapping("/member")
    String getMember() {
        return "member2";
    }

    @RequestMapping("/order")
    String getOrder() {
        return "order" + restTemplate.getForObject("http://zk-client/member", String.class);
    }

    @Bean
    @LoadBalanced
    RestTemplate getRestTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

    public static void main(String[] args) {
        SpringApplication.run(ZkClient2Application.class, args);
    }
}

3、测试

先开启Zookeeper Server,再开启两个客户端,调用zk-client2项目的/order接口,查看效果。

调用成功,且负载均衡生效!

和Eureka不同,Zookeeper并没有提供可视化界面进行服务治理,但可以下载ZooInspector等工具查看Zookeeper的节点。

可以看到,每个客户端的服务作为一个ZNode(此处为临时节点)注册在Zookeeper Server上。

二、整合Consul

1、Consul Server

(1)下载Consul

https://www.consul.io/downloads.html

(2)启动

Consul和Zookeeper有所不同,它无需配置,而是在启动时指定参数。打开命令行工具(cmd),执行如下命令:

consul agent -dev -ui

dev参数指定开发环境,ui参数会启动Consul的web监控界面。更多参数请自行百度。

Consul Server的默认端口是8500。

2、代码

创建一个consul-client项目,引入web和consul-discovery依赖。

和其他注册中心不同,我们还要引入actuator依赖(监听器):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置application.yml:

server:
  port: 9152
spring:
  application:
    name: consul-client
  cloud:
    consul:
      port: 8500 # 指定Consul Server端口
      host: localhost # 指定Consul Server域名

为了方便,我们直接在启动类ConsulClientApplication.java编写服务接口:

@SpringBootApplication
@RestController
@EnableDiscoveryClient
public class ConsulClientApplication {

    @RequestMapping("/member")
    String getMember() {
        return "member";
    }
    
    public static void main(String[] args) {
        SpringApplication.run(ConsulClientApplication.class, args);
    }
}

不要忘记添加@EnableDiscoveryClient注解,表示这是注册中心的客户端,向注册中心注册服务。

为了演示负载均衡,我们再创建一个consul-client2项目, 同样引入web和consul-discovery依赖。

不要忘记还要引入actuator依赖(监听器):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置application.yml:

spring:
  cloud:
    consul:
      port: 8500 # Consul Server的端口
      host: localhost # Consul Server的域名
  application:
    name: consul-client
server:
  port: 9153

在入口类再编写一个/member服务接口,并在/order接口通过RestTemplate进行调用,通过@LoadBalanced注解开启负载均衡(整合第三方注册中心的依赖包中已包含ribbon负载均衡器)。

ConsulClient2Application.java

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulClient2Application {

    @Resource
    private RestTemplate restTemplate;

    @RequestMapping("/member")
    String  getMember() {
        return "member2";
    }

    @RequestMapping("/order")
    String getOrder() {
        return "order" + restTemplate.getForObject("http://consul-client/member",String.class);
    }

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

    public static void main(String[] args) {
        SpringApplication.run(ConsulClient2Application.class, args);
    }
}

3、测试

先按上述方法开启Consul Server,再开启两个客户端,调用consul-client2项目的/order接口,查看效果。

调用成功,且负载均衡生效!

此外,通过启动consul时指定的ui参数,我们可以使用一个精美的界面来监控治理服务。

三、总结

原本Spring Cloud全家桶就是一套完整的微服务解决方案框架,因此建议使用Eureka作为注册中心,不仅有界面,还具有自我保护机制。Consul也自带界面,而Zookeeper只能通过其他工具去监控。

三者都自带Ribbon作为负载均衡器。

推荐:Eureka > Consul > Zookeeper

发表评论

电子邮件地址不会被公开。