上次关于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来说,个人感觉非常简单,几乎没有编码修改,只需对配置进行简单修改即可,分享到此结束,有问题的朋友可以留言交流,因工作比较忙,回复获取不够及时,见谅。