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

  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(

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值