springcloud之服务注册与发现(zookeeper注册中⼼)-
Finchley.SR2版
新年第⼀篇博⽂,接着和⼤家分享springcloud相关内容;本次主要内容是使⽤cloud结合zookeeper作为注册中⼼来搭建服务调⽤,前⾯⼏篇⽂章有涉及到另外的eureka作为注册中⼼,有兴趣的朋友会回顾下上⼏篇⽂章。
springcloud版本说明
docker快速启动⼀个zookeeper服务
zk-server服务提供者
zk-client服务消费者
启动多个zk-server服务提供者
git源码地址:
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>
spring framework版本查看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⽇志的部分截图:
能够看到镜像启动时读取了内置的zoo.cfg配置⽂件,并且zookeeper当前版本是3.4,我们使⽤可视化⼯具ZooInspector连接zookeeper,能够直观的看到如下默认节点信息:
⽬前看我们只有⼀个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>keeper</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
2public class UserController {
3
4 @Value("${server.port}")
5private int port;
6
7 @GetMapping("/list")
8public List<MoUser> getList() {
9
10return 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服务的⼀些列配置,l中的配置信息如:
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程序了;⾸先访问暴露的接⼝正常:
然后再查看可视化视图⼯具ZooInsector有如下新增信息:
这个时候能够说明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>keeper</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
4public class ZkClientApplication {
5public static void main(String[] args) {
6 SpringApplication.run(ZkClientApplication.class, args);
7 }
8 }
然后创建⼀个service层并创建接⼝IUserService,通过@FeignClient注解的实现访问服务提供者的接⼝:
1 @Service
2 @FeignClient("zk-server")
3public interface IUserService {
4 @GetMapping("/list")
5 List<MoUser> getList();
6 }
zk-client端我想把服务提供端zk-server返回的信息直接输出到浏览器上,如下代码:
1 @RestController
2public class UserController {
3
4 @Autowired
5protected IUserService userService;
6
7 @GetMapping("/list")
8public List<MoUser> getList() {
List();
10 }
11 }
来到这⾥,剩余的就是在l中配置连接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接⼝返回的信息:
启动多个zk-server服务提供者
上⾯⼀个zk-server(服务提供者),⼀个zk-client(服务消费者)在实际场景中很少见,⼀般服务提供者都是部署在多台机⼦或虚拟机中(当然zk 服务集不在本次考虑范围),因此这⾥通过idea启动多个不同端⼝的zk-server来实验下并测试feign的负载均衡是否可⽤。
分别启动6061,6062,6063的zk-server端⼝服务,这⾥我注释了instance-id: 1节点,采⽤⾃动⽣成的id:
然后在浏览器中访问zk-client,刷新多次看下接⼝返回信息,能够看到轮询效果:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论