当前位置:   article > 正文

spring-cloud-kubernetes的服务发现和轮询实战(含熔断),宅家36天咸鱼翻身入职腾讯_spring cloud kubernetes 服务发现

spring cloud kubernetes 服务发现
  1. 《你好spring-cloud-kubernetes》

  2. 《spring-cloud-kubernetes背后的三个关键知识点》

  3. 《spring-cloud-kubernetes的服务发现和轮询实战(含熔断)》

  4. 《spring-cloud-kubernetes与SpringCloud Gateway》

  5. 《spring-cloud-kubernetes与k8s的configmap》

全文概览

本文由以下段落组成:

  1. 环境信息

  2. 常见的SpringCloud注册发现服务一览

  3. 分析kubernetes上如何实现服务注册发现

  4. 本章实战源码下载链接

  5. 实战开发Account-Service服务(服务提供方)

  6. 实战开发Web-Service服务(服务消费方)

  7. 扩容验证ribbon轮询能力

  8. 验证熔断能力

环境信息

本次实战的环境和版本信息如下:

  1. 操作系统:CentOS Linux release 7.6.1810

  2. minikube:1.1.1

  3. Java:1.8.0_191

  4. Maven:3.6.0

  5. fabric8-maven-plugin插件:3.5.37

  6. spring-cloud-kubernetes:1.0.1.RELEASE

上面的linux、minikube、java、maven,请确保已准备好,linux环境下minikube的安装和启动请参考《Linux安装minikube指南 》

常见的SpringCloud注册发现服务一览

SpringCloud环境最重要的功能是注册发现服务,因此将SpringCloud应用迁移到kubernetes环境时,开发者最关心的问题是在kubernetes上如何将自身服务暴露出去,以及如何调用其他微服务。

先看看普通SpringCloud环境下的注册发现,下图来自spring官方博客,地址是:https://spring.io/blog/2015/07/14/microservices-with-spring,

在这里插入图片描述

由上图可见,应用Account-Service将自己注册到Eureka,这样Web-Service用"account-service"就能在Eureka找到Account-Service服务的地址,然后顺利发送RestFul请求到Account-Service,用上其提供的服务。

分析kubernetes上如何实现服务注册发现

如果将上面的Web-Service和Account-Service两个应用迁移到kubernetes上之后,注册发现机制变成了啥样呢?

第一种:沿用上图的方式,将Eureka也部署在kubernetes上,这样的架构和不用kubernetes时没有啥区别;

第二种,就是今天要实战的内容,使用spring-cloud-kubernetes框架,该框架可以调用kubernetes的原生能力来为现有SpringCloud应用提供服务,架构如下图所示:

在这里插入图片描述

上图表明,Web-Service应用在调用Account-Service应用的服务时,会用okhttp向API Server请求服务列表,API Server收到请求后会去etcd取数据返回给Web-Service应用,这样Web-Service就有了Account-Service的信息,可以向Account-Service的多个Pod轮询发起请求;

上图有个细节请注意:WebService应用并不是直接将请求发送给Account-Service在kubernetes创建的service,而是直接发送到具体的Pod上了,之所以具有这个能力,是因为spring-cloud-kubernetes框架通过service拿到了Account-Service对应的所有Pod信息(endpoint),此逻辑可以参考源码KubernetesServerList.java,如下所示:

public List getUpdatedListOfServers() {

//用namespace和serviceId做条件,得到该服务对应的所有节点(endpoints)信息

Endpoints endpoints = this.namespace != null

? this.client.endpoints().inNamespace(this.namespace)

.withName(this.serviceId).get()
this.client.endpoints().withName(this.serviceId).get();

List result = new ArrayList();

if (endpoints != null) {

if (LOG.isDebugEnabled(

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/708601
推荐阅读
相关标签
  

闽ICP备14008679号