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

springcloud版本说明

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

springboot版本:

     <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0..RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

springcloud版本:

     <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>

docker快速启动一个zookeeper服务

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

 docker pull zookeeper
docker run --name zookeeper -p : -d zookeeper
docker logs dd51008f9f8f

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

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

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

zk-server服务提供者

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

         <!--zk-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<!--zk工具包-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>

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

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

 @RestController
public class UserController { @Value("${server.port}")
private int port; @GetMapping("/list")
public List<MoUser> getList() { return new ArrayList<MoUser>() {
{
add(new MoUser(, "shenniu001_" + port));
add(new MoUser(, "shenniu002_" + port));
add(new MoUser(, "shenniu003_" + port));
}
};
}
}

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

 spring:
application:
name: zk-server
cloud:
zookeeper:
connect-string: localhost:
discovery:
register: true
enabled: true
instance-id:
root: /shenniu
server:
port:

参数的简单说明:

  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配置:

         <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>

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

 @SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ZkClientApplication {
public static void main(String[] args) {
SpringApplication.run(ZkClientApplication.class, args);
}
}

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

 @Service
@FeignClient("zk-server")
public interface IUserService {
@GetMapping("/list")
List<MoUser> getList();
}

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

 @RestController
public class UserController { @Autowired
protected IUserService userService; @GetMapping("/list")
public List<MoUser> getList() {
return userService.getList();
}
}

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

 spring:
application:
name: zk-client
cloud:
zookeeper:
connect-string: localhost:
discovery:
register: true
enabled: true
instance-id:
root: /shenniu
server:
port:

如果细心能够发现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,刷新多次看下接口返回信息,能够看到轮询效果:

springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版的更多相关文章

  1. springcloud之config配置中心-Finchley.SR2版

    本篇和大家分享的是springcloud-config配置中心搭建,写到这里突然想起自己曾今开源过基于Redis发布订阅编写的一个配置中心,刚看了git星数有点少哈哈,这里顺势发个连接欢迎大侠们点赞: ...

  2. SpringCloud-服务注册与发现(注册中心)

    SpringCloud-服务注册与发现(注册中心) 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:作者使用IDEA + Gradle 注:需要有一定的java&& ...

  3. springcloud之hystrix熔断器-Finchley.SR2版

    本篇和大家分享的是springcloud-hystrix熔断器,其主要功能是对某模块调用失败做断路和降级,简单点就当某个模块程序出问题了并达到某阈值就限制后面请求,并降级的方式提供一个默认返回数据.最 ...

  4. 微服务-注册与发现-zookeeper bydasn

    目录 一.微服务注册的概述 二.zookeeper2.1 zookeeper安装启动2.2 zookeeper集群搭建2.3 zkcli操作 一.微服务注册概述 在微服务中,有这么一个东西叫服务注册表 ...

  5. SpringCloud微服务小白入门之Eureka注册中心和服务中心搭建示例

    一.注册中心配置文件 代码复制区域: spring: application: name: spring-cloud-server server: port: 7000 eureka: instanc ...

  6. 二、spring cloud 注册与发现eureka注册中心

    基于2.0 Greenwich高可用eureka注册中心搭建 一.单机版 新建MAVEN父工程demo-parent 删掉src pom.xml <packaging>pom</pa ...

  7. SpringCloud服务的注册发现--------zookeeper实现服务与发现 + Ribbon实现客户端负载均衡

    1,Eureka 闭源了,但是我们可以通过zookeeper实现注册中心的功能. zookeeper 是一个分布式协调工具,可以实现服务的注册和发现,配置中心,注册中心,消息中间件的功能 2,工具准备 ...

  8. SpringCloud(二)- 服务注册与发现Eureka

    离上一篇微服务的基本概念已经过去了几个月,在写那篇博客之前,自己还并未真正的使用微服务架构,很多理解还存在概念上.后面换了公司,新公司既用了SpringCloud也用了Dubbo+Zookeeper, ...

  9. SpringCloud的入门学习之概念理解、Eureka服务注册与发现入门

    1.微服务与微服务架构.微服务概念如下所示: 答:微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题.提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面的一个个微服务 ...

随机推荐

  1. RabbitMQ分布式集群架构和高可用性(HA)

    (一) 功能和原理 设计集群的目的 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 通过增加更多的节点来扩展消息通信的吞吐量 1 集群配置方式 RabbitMQ可以通过三种方法来部署分布 ...

  2. left join,right join,inner join,full join之间的区别

    参考 https://www.cnblogs.com/assasion/p/7768931.html https://blog.csdn.net/rongbo_j/article/details/46 ...

  3. MyBatis 中一对一和一对多的映射关系

    1 一对一映射 比如每位学生有一个地址. public class Address { private Integer addrId; private String street; private S ...

  4. linux内核参数注释与优化

    目录 1.linux内核参数注释 2.两种修改内核参数方法 3.内核优化参数生产配置 参数解释由网络上收集整理,常用优化参数对比了网上多个实际应用进行表格化整理,使查看更直观. 学习linux也有不少 ...

  5. hibernate深度学习 游离状态 HQL

    当我学完这个之后 我仿佛都懂了 = =或许这就是 hibernate的力量吧. 操纵持久化对象(Session) 1.1. 在hibernate中java对象的状态 Hibernate 把对象分为 4 ...

  6. Redis 缓存失效和回收机制续

    二.Redis Key失效机制 Redis的Key失效机制,主要借助借助EXPIRE命令: EXPIRE key 30 上面的命令即为key设置30秒的过期时间,超过这个时间,我们应该就访问不到这个值 ...

  7. ASP.NET Core中使用GraphQL - 最终章 Data Loader

    ASP.NET Core中使用GraphQL - 目录 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间 ...

  8. ES 13 - Elasticsearch的元字段 (_index、_type、_source、_routing等)

    目录 1 标识元字段 1.1 _index - 文档所属的索引 1.2 _uid - 包含_type和_id的复合字段 1.3 _type - 文档的类型 1.4 _id - 文档的id 2 文档来源 ...

  9. 为什么设置overflow为hidden可以清除浮动带来的影响

    1.问题起源 在平时的业务开发写CSS中,为了满足页面布局,元素的浮动特性我们用的不能再多了.使用浮动的确能够解决一些布局问题,但是也带了一些副作用影响,比如,父元素高度塌陷,我们有好几种可以清除浮动 ...

  10. 【view绘制流程】理解

    一.概述 View的绘制是从上往下一层层迭代下来的.DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下,依次measure ...