计算机系统应用教程网站

网站首页 > 技术文章 正文

SpringCloud使用Zookeeper作为注册中心

btikc 2024-09-20 14:51:26 技术文章 21 ℃ 0 评论



之前一直使用Eureka作为注册中心,后来发现有的公司使用Consul,有的公司使用Zookeeper了,这是什么原因呢?百度后发现Eurkea 2.x不再维护,Eurkea 1.x仍可用于生产环境。不想基于不确定的明天,那么今天就改成别的注册中心吧,比如Zookeeper,以下简称zk。

现在在Windows上安装zk已经相当简单了,在官网下载压缩包,zip、tar都可以,解压缩之后,进入bin目录,执行zkServer.cmd,默认在2181端口开启了服务,很简单吧。

我们可以使用一个叫做zktools的可视化工具,来观察zk的节点:


下面来说一说springCloud,我们假设有两个服务serviceA、serviceB,它们都注册到zk。serviceB通过声明式接口FeignClient调用ServiceA已经写好的接口。

serviceA的pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>      

serviceA的配置:

server:    
    port: 8081
spring:    
    application:        
        name: serverA    
    cloud:        
         zookeeper:            
             connect-string: 127.0.0.1:2181

serviceA的启动类及其接口:

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

@RequestMapping("/hello")
public String hello() {
return "Hello World";
    }
}

serviceB的pom,配置文件,启动类大同小异,不过是服务名称换了,q启动类加入注解@EnableDiscoveryClient,另外pom新增:

<dependency>    
    <groupId>org.springframework.cloud</groupId>    
    <artifactId>spring-cloud-starter-openfeign </artifactId> 
</dependency>   

serviceA、serviceB启动之后,zk的节点:



其实就是服务把自身的ip,端口,各种状态信息放入zk,其余的服务可以从zk获取要调用服务的列表,该列表包含ip,端口等信息,所以就可以互相调用了。

serviceB的feignClient:

@FeignClient(name="serverA")// 要调用的接口所属服务
public interface ServerAClient {
@RequestMapping("/hello")// 要调用接口url
    String helloTest();// 方法名可以随便起  返回类型跟服务接口返回类型保持一致
}

使用feignClient:

@Autowiredprivate ServerAClient serverAClient;
@RequestMapping("/hello2")public String hello2() {return serverAClient.helloTest()+"测试";}

解释一下:访问a服务的ip:port/hello2 -->进入hello2方法-->serverAClient是ServerAClient的实现类,内部使用Ribbon从zk获取服务A的可用列表,然后选出一个可用服务,restTemplate发送请求到某个服务的ip:port,完成请求,返回响应,最后hello2方法返回。

只要类路径下有spring-cloud-starter-zookeeper-discovery,那么该服务既把自身当做服务注册到zk,同时它也是一个客户端,可以去发现别的服务。可以spring.cloud.zookeeper.discovery.enabled = false来关闭发现其它服务的行为。

当然zk不仅可以当做服务注册中心,也可以当做config服务类来使用。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表