欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

程序员文章站 2022-10-01 11:59:01
新年第一篇博文,接着和大家分享springcloud相关内容;本次主要内容是使用cloud结合zookeeper作为注册中心来搭建服务调用,前面几篇文章有涉及到另外的eureka作为注册中心,有兴趣的朋友会回顾下上几篇文章。 springcloud版本说明 docker快速启动一个zookeeper ......

新年第一篇博文,接着和大家分享springcloud相关内容;本次主要内容是使用cloud结合zookeeper作为注册中心来搭建服务调用,前面几篇文章有涉及到另外的eureka作为注册中心,有兴趣的朋友会回顾下上几篇文章。

springcloud版本说明

由于市面上其版本比较多,版本不一可能造成了读者尝试时版本问题,所以这里指明当前作者写文章时使用的cloud版本

springboot版本:

1     <parent>
2         <groupid>org.springframework.boot</groupid>
3         <artifactid>spring-boot-starter-parent</artifactid>
4         <version>2.0.7.release</version>
5         <relativepath/> <!-- lookup parent from repository -->
6     </parent>

springcloud版本:

1     <properties>
2         <java.version>1.8</java.version>
3         <spring-cloud.version>finchley.sr2</spring-cloud.version>
4     </properties>

docker快速启动一个zookeeper服务

就我个人而言通常使用docker来运行启动一些第三方的服务,这里也用她来启动zk,首先pull镜像:

1 docker pull zookeeper
2 docker run --name zookeeper -p 2081:2181 -d zookeeper
3 docker logs dd51008f9f8f

一般采用默认镜像的配置即可启动,这里来看下启动后logs日志的部分截图:

springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

能够看到镜像启动时读取了内置的zoo.cfg配置文件,并且zookeeper当前版本是3.4,我们使用可视化工具zooinspector连接zookeeper,能够直观的看到如下默认节点信息:

springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

目前看我们只有一个node节点,试想一下如果用zk作为注册中心,这里应该会有至少两个大节点,一个服务提供这节点,一个消费者注册的节点,下面会通过程序来创建。

zk-server服务提供者

在zk-server工程中,这里先创建zk的服务提供者节点,在pom工程中需要如下配置:

 1         <!--zk-->
 2         <dependency>
 3             <groupid>org.springframework.cloud</groupid>
 4             <artifactid>spring-cloud-starter-zookeeper-discovery</artifactid>
 5         </dependency>
 6         <!--zk工具包-->
 7         <dependency>
 8             <groupid>org.apache.zookeeper</groupid>
 9             <artifactid>zookeeper</artifactid>
10             <version>3.4.13</version>
11             <exclusions>
12                 <exclusion>
13                     <groupid>org.slf4j</groupid>
14                     <artifactid>slf4j-log4j12</artifactid>
15                 </exclusion>
16                 <exclusion>
17                     <groupid>log4j</groupid>
18                     <artifactid>log4j</artifactid>
19                 </exclusion>
20             </exclusions>
21         </dependency>

上面pom分了两步,第一个是springcloud使用zk做服务注册发现用的,第二个相当于连接zk服务的客户端包;然后在程序启动入口出增加注解 @enablediscoveryclient

值得注意的是这里指定了zk服务的版本号3.4.13,就目前个人遇到的情况看,连接zk的客户端尽量和zk服务端版本保持一致,避免造成版本问题;作为一个服务提供端(server),我们还需要有一个暴露出去的接口服务,我这里定义如下接口:

 1 @restcontroller
 2 public class usercontroller {
 3 
 4     @value("${server.port}")
 5     private int port;
 6 
 7     @getmapping("/list")
 8     public list<mouser> getlist() {
 9 
10         return new arraylist<mouser>() {
11             {
12                 add(new mouser(1, "shenniu001_" + port));
13                 add(new mouser(2, "shenniu002_" + port));
14                 add(new mouser(3, "shenniu003_" + port));
15             }
16         };
17     }
18 }

通过接口把服务启动的端口返回出去,来达到区分不同接口的作用。有了接口代码后,还剩下连接zk服务的一些列配置,application.yml中的配置信息如:

 1 spring:
 2   application:
 3     name: zk-server
 4   cloud:
 5     zookeeper:
 6       connect-string: localhost:2081
 7       discovery:
 8         register: true
 9         enabled: true
10         instance-id: 1
11         root: /shenniu
12 server:
13   port: 6061

参数的简单说明:

  1. connect-string:连接zk服务的连接串
  2. register: 是否启动服务注册
  3. instance-id: zk唯一id的标识
  4. root: zk根节点名称,默认/services

有了如上的配置,我们就能够启动zk-server程序了;首先访问暴露的接口正常:

springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

然后再查看可视化视图工具zooinsector有如下新增信息:

springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

这个时候能够说明zk-server服务往zk服务端注册成功了,zk服务端节点上包含了zk-server服务的一些基本信息,如:ip,端口,名称;这些是服务注册与发现的基本信息

zk-client服务消费者

在zk-client工程中,服务消费者的pom配置与生产者很像,这里为了方便用了feign来访问服务端,如下pom配置:

 1         <dependency>
 2             <groupid>org.springframework.cloud</groupid>
 3             <artifactid>spring-cloud-starter-feign</artifactid>
 4             <version>1.4.6.release</version>
 5         </dependency>
 6         <dependency>
 7             <groupid>org.springframework.cloud</groupid>
 8             <artifactid>spring-cloud-starter-zookeeper-discovery</artifactid>
 9         </dependency>
10         <dependency>
11             <groupid>org.apache.zookeeper</groupid>
12             <artifactid>zookeeper</artifactid>
13             <version>3.4.13</version>
14             <exclusions>
15                 <exclusion>
16                     <groupid>org.slf4j</groupid>
17                     <artifactid>slf4j-log4j12</artifactid>
18                 </exclusion>
19                 <exclusion>
20                     <groupid>log4j</groupid>
21                     <artifactid>log4j</artifactid>
22                 </exclusion>
23             </exclusions>
24         </dependency>

同样需要执行具体的zk服务端的版本,以及排除冲突的log包;因为用了feign工具来访问,所以需要在程序入口出增加如下注解:

1 @springbootapplication
2 @enablediscoveryclient
3 @enablefeignclients
4 public class zkclientapplication {
5     public static void main(string[] args) {
6         springapplication.run(zkclientapplication.class, args);
7     }
8 }

然后创建一个service层并创建接口iuserservice,通过@feignclient注解的实现访问服务提供者的接口:

1 @service
2 @feignclient("zk-server")
3 public interface iuserservice {
4     @getmapping("/list")
5     list<mouser> getlist();
6 }

zk-client端我想把服务提供端zk-server返回的信息直接输出到浏览器上,如下代码:

 1 @restcontroller
 2 public class usercontroller {
 3 
 4     @autowired
 5     protected iuserservice userservice;
 6 
 7     @getmapping("/list")
 8     public list<mouser> getlist() {
 9         return userservice.getlist();
10     }
11 }

来到这里,剩余的就是在application.yml中配置连接zk服务端的配置:

 1 spring:
 2   application:
 3     name: zk-client
 4   cloud:
 5     zookeeper:
 6       connect-string: localhost:2081
 7       discovery:
 8         register: true
 9         enabled: true
10         instance-id: 1
11         root: /shenniu
12 server:
13   port: 7061

如果细心能够发现zk-client和zk-server的zk服务配置信息基本一致,其实不管是服务提供者还是服务消费者,都是作为zk服务的客户端来使用,并且都把自己的服务访问信息上传注册给zookeeper注册中心的;启动zk-client项目,访问接口能够成功响应出zk-server接口返回的信息:

springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

启动多个zk-server服务提供者

上面一个zk-server(服务提供者),一个zk-client(服务消费者)在实际场景中很少见,一般服务提供者都是部署在多台机子或虚拟机中(当然zk服务集群不在本次考虑范围),因此这里通过idea启动多个不同端口的zk-server来实验下并测试feign的负载均衡是否可用。

分别启动6061,6062,6063的zk-server端口服务,这里我注释了instance-id: 1节点,采用自动生成的id:

springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

然后在浏览器中访问zk-client,刷新多次看下接口返回信息,能够看到轮询效果:

springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版