SpringClloud学习日记(三)netflix停更eureka怎么办,zookeeper或许会是你的选择

上次关于springcloud的学习还是在18年写的,当时初入门槛很多都是照本宣科的记录,加上工作原因,一直处于断更状态,近两年一直在做springcloud的相关开发,自己也在实际开发中踩过不少坑,现在想对过往经验做些记录和总结,也给初入springcloud全家桶的朋友介绍一下我的经验,其中不乏有错误,如果有发现,欢迎指正。

今天这篇博客想介绍一下当时风靡一时的eureka在停更进入维护后,我们如何使用zookeeper作为服务注册的替代方案,至于eureka为何停更这里不再多说,感兴趣的朋友可以自行google和度娘,下面开始正题

用过zookeeper的朋友都知道zookeeper是apache下开源的顶级项目,它的设计初衷就是一个分布式协调工具,在多个场景下有成熟的使用方案,像solr-cloud集群,dubbo等都是使用的(dubbo从最初就是使用zookeeper作为服务注册发现的组件)zookeeper。但是最新的springcloud alibaba并没有首选zookeeper作为服务注册中心,个人觉得主要原因在于,zookeeper本身选主过程较复杂,在脑裂问题上处理不够完美,另外zookeeper本身属于强一致的服务(即各个节点要求数据强一致性),当集群过大的时候同步数据会是个瓶颈。

首先我们需要在linux上安装zookeeper(本文主要演示如何在项目中集成,在这里不再对安装展开讲解,不会的朋友自行百度吧,一搜一大堆),这里需要注意的是,如果是不同服务器上跑client,安装完zookeeper后需要记得关闭linux服务器防火墙后再启动zookeeper,防止多台机器通信被防火墙拦住,曾经踩过坑,在此提醒记录一下。

注册中心

没有任何编码,只需安装zookeeper即可(单机或者集群)

服务者代码

下面开始对服务进行改造,首先新建一个服务模块(springcloud多为父子依赖模块式开发,我工作中都是这么使用)再父pom中<modules>添加新创建的模块,模块名字随便写(需要跟父pom引入名称一致),模块中pom如下

<dependencies>
    <dependency>
    <!-- 自己定义的公共模块 -->
        <groupId>com.zdd.springcloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--监控-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--SpringBoot整合Zookeeper客户端-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        <exclusions>
            <!--先排除自带的zookeeper3.5.3-->
            <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.4.14</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>
</dependencies>

 需要注意一点引入spring-cloud-starter-zookeeper-discovery需要排除自带的3.5.3-zookeeper-beat这个jar,否则会报jar冲突,我在自己搭建的时候这个坑踩了半天才解决

对应的yml配置比较简单

server:
  port: 8004


#服务别名 --- 注册zookeeper到注册中心名称
spring:
  application:
    name: cloud-provider
  cloud:
    zookeeper:
      connect-string: 192.168.110.10:2181

我本地演示只装了一个zookeeper服务没有用集群,如果 是集群的话,connect_string配置可以配置多个,已“,”分隔,相当于eureka中的eureka.client.serviceUrl.defaultZone

主启动类代码

@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
public class Provider8004 {

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

测试controller,为了方便测试简单写个测试的controller,没有任何业务逻辑,仅仅是打印一下端口号

@RestController
@Slf4j
public class TestController {

    @Value("${server.port}")
    private String serverPort;

    @RequestMapping(value = "/provider/zk")
    public String paymentzk() {
        return "springcloud zookeeper:" + serverPort + "\t" + UUID.randomUUID().toString();
    }
}

启动主启动类,访问接口,正常应该可以打印出controller内的内容

如何验证服务已经注册进zookeeper?

使用zookeeper的控制台工具 

输入:ls /

打印:[services, zookeeper]

输入:ls /services

打印:cloud-provider

看到以上打印即注册成功,可以看到我们的服务cloud-provider已经成功注册到zookeeper上了,服务名称就是cloud-provider

OK,至此,介绍结束,替换方案相对于eureka来说,个人感觉非常简单,几乎没有编码修改,只需对配置进行简单修改即可,分享到此结束,有问题的朋友可以留言交流,因工作比较忙,回复获取不够及时,见谅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值