新年第一篇博文,接着和你们分享springcloud相关内容;本次主要内容是使用cloud结合zookeeper做为注册中心来搭建服务调用,前面几篇文章有涉及到另外的eureka做为注册中心,有兴趣的朋友会回顾下上几篇文章。java
因为市面上其版本比较多,版本不一可能形成了读者尝试时版本问题,因此这里指明当前做者写文章时使用的cloud版本node
springboot版本:git
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版本:github
1 <properties> 2 <java.version>1.8</java.version> 3 <spring-cloud.version>Finchley.SR2</spring-cloud.version> 4 </properties>
就我我的而言一般使用docker来运行启动一些第三方的服务,这里也用她来启动zk,首先pull镜像:spring
1 docker pull zookeeper 2 docker run --name zookeeper -p 2081:2181 -d zookeeper 3 docker logs dd51008f9f8f
通常采用默认镜像的配置便可启动,这里来看下启动后logs日志的部分截图:docker
可以看到镜像启动时读取了内置的zoo.cfg配置文件,而且zookeeper当前版本是3.4,咱们使用可视化工具ZooInspector链接zookeeper,可以直观的看到以下默认节点信息:apache
目前看咱们只有一个node节点,试想一下若是用zk做为注册中心,这里应该会有至少两个大节点,一个服务提供这节点,一个消费者注册的节点,下面会经过程序来建立。浏览器
在zk-server工程中,这里先建立zk的服务提供者节点,在pom工程中须要以下配置:springboot
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服务的客户端包;而后在程序启动入口出增长注解 @EnableDiscoveryClientapp
值得注意的是这里指定了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
参数的简单说明:
有了如上的配置,咱们就可以启动zk-server程序了;首先访问暴露的接口正常:
而后再查看可视化视图工具ZooInsector有以下新增信息:
这个时候可以说明zk-server服务往zk服务端注册成功了,zk服务端节点上包含了zk-server服务的一些基本信息,如:ip,端口,名称;这些是服务注册与发现的基本信息
在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接口返回的信息:
上面一个zk-server(服务提供者),一个zk-client(服务消费者)在实际场景中不多见,通常服务提供者都是部署在多台机子或虚拟机中(固然zk服务集群不在本次考虑范围),所以这里经过idea启动多个不一样端口的zk-server来实验下并测试feign的负载均衡是否可用。
分别启动6061,6062,6063的zk-server端口服务,这里我注释了instance-id: 1节点,采用自动生成的id:
而后在浏览器中访问zk-client,刷新屡次看下接口返回信息,可以看到轮询效果: