主要参考spring-cloud-kubernetes,它是springcloud官方推出的开源项目,用于将Spring Cloud和Spring Boot应用运行在kubernetes环境。并结合fabric8 maven插件,做到CI,自动部署到k8s环境。

部署结构

Demo工程结构

~/projects/SpringCloudOnK8sDemo > tree -L 1
.
├── backend-hello
├── backend-login
├── eureka
├── gateway-eureka
└── gateway-k8s

一个gateway,两个后端服务

服务发现机制

基于k8s可以有两种服务机制:

  1. SpringCloud eureka

  2. k8s api server

他们分别提供了生态内的相关能力,都有类似如:灰度发布、容量分配、熔断、降级等基础能力。但考虑专有云是天基底座,可能没有k8s,避免依赖k8s,可以脱离其运行,内置SpringCloud是一种更架构独立、减小绑定的选择。

服务路由

在gateway中,通过uri中route前缀判断是需要做服务路由的请求

负载均衡

Ribbon简单来说 是一个基于 HTTP 和 TCP 客户端的负载均衡器,它可以在客户端配置 ribbonServerList(服务端列表),然后轮询请求以实现均衡负载。
Feign是一个使用起来更加方便的 HTTP 客户端,使用起来就像是调用自身工程的方法,而感觉不到是调用远程方法,达到类rpc调用的效果。

Ribbon和Feign可以封装组合使用(Feign封装了Ribbon)。

  • 使用Ribbon客户端调用http接口,具有客户端负载均衡的能力

  • 使用Feign做到类rpc调用

基于http做到类rpc调用的异常机制

隔离

  • hystrix熔断器,负载服务故障的隔离。
  • RestTemplate --> Ribbon --> hystrix

traceId的透传

  • 结合EagleEye.getTraceId()获得traceId
  • 对于EagleEye,traceId是放ThreadLocal。基于SpringCloud http的方式,可以http header。在http header中透传

全链路跟踪(轻量鹰眼)


使用鹰眼生成全局唯一traceId,以及traceId机制。每台日志对请求打点,然后结合ELK,做到日志全链路查询

灰度

灰度发布

依赖k8s的内置支持

流量灰度

  • AB测试
  • 对用户打标,内测发布
  • beta发布

开发方式

使用fabric8 maven插件完成 打包、上传、部署

mvn clean package fabric8:build -Pdev	// 指定环境变量,打包docker镜像
docker tag xxx registry.cn-hangzhou.aliyuncs.com/cmp-poc/xxx	// 重命名docker镜像
docker push registry.cn-hangzhou.aliyuncs.com/cmp-poc/xxx		// push到私有仓库
mvn fabric8:deploy	// 使用kubectl create depoly & service