SpringCloud On K8s Demo
主要参考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可以有两种服务机制:
-
SpringCloud eureka
-
k8s api server
他们分别提供了生态内的相关能力,都有类似如:灰度发布、容量分配、熔断、降级等基础能力。但考虑专有云是天基底座,可能没有k8s,避免依赖k8s,可以脱离其运行,内置SpringCloud是一种更架构独立、减小绑定的选择。
服务路由
在gateway中,通过uri中route前缀判断是需要做服务路由的请求
- 例如这几个示例:
- 访问gateway:http://gateway-eureka.c066372bb24a34c35a2050758bc67bb9e.cn-hangzhou.alicontainer.com/hostName
- 通过服务路由访问hello服务:http://gateway-eureka.c066372bb24a34c35a2050758bc67bb9e.cn-hangzhou.alicontainer.com/route/hello/hostName
- 通过服务路由访问login服务:http://gateway-eureka.c066372bb24a34c35a2050758bc67bb9e.cn-hangzhou.alicontainer.com/route/login/hostName
- 服务间调用hello调login:http://gateway-eureka.c066372bb24a34c35a2050758bc67bb9e.cn-hangzhou.alicontainer.com/route/hello/list
负载均衡
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