Kubernetes 官方 java 客户端之八:fluent style
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
概览
本文是《Kubernetes 官方 java 客户端》系列的第八篇,以下提到的 java 客户端都是指 client-jar.jar;
前文《Kubernetes官方java客户端之七:patch操作》涉及的知识点、代码、操作都太多了,对作者和读者都是莫大的折磨,到了本篇咱们轻松一下,写几段简单流畅的代码,了解 java 客户端对 fluent style 编程的支持,并且编码完成后的验证操作也很简单;
关于 fluent styel
也称为 fluid coding, fluent programming,是一种增强代码可读性的风格,使得阅读代码时更加自然流畅,特点是函数返回有关类型,使得多个函数的调用前后链接起来。
关于 fluent style 可以参考 Martin Flowler 于 2005 年发表的文章,地址是:https://martinfowler.com/bliki/FluentInterface.html ,使用 fluent style 前后的代码对比如下图所示:
源码下载
如果您不想编码,可以在 GitHub 下载所有源码,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
这个 git 项目中有多个文件夹,本章的应用在 kubernetesclient 文件夹下,如下图红框所示:
实战步骤概述
在父工程 kubernetesclient 下面新建名为 fluent 的子工程;
fluent 工程中只有一个类 FluentStyleApplication,启动的 main 方法以及 fluent style 的代码都在此类中;
FluentStyleApplication.java 提供四个 web 接口,功能分别是:新建 namespace、新建 deployment、新建 service、删除前面三个接口新建的所有资源;
fluent 工程编码完成后,不需要做成镜像部署在 kubernetes 环境内部,而是作为一个普通 SpringBoot 应用找个 java 环境启动即可,与《Kubernetes官方java客户端之三:外部应用 》一文的部署和启动一致;
依次调用每个接口,验证功能是否符合预期;
编码
在父工程 kubernetesclient 下面新建名为 fluent 的 maven 子工程,pom.xml 内容如下,需要注意的是排除掉 spring-boot-starter-json,原因请参考《Kubernetes官方java客户端之二:序列化和反序列化问题 》:
新建 FluentStyleApplication.java,首先,该类作为启动类,要有 main 方法:
定义常量 NAMESPACE 作为本次实战的 namespace:
用 @PostConstruct 注解修饰 setDefaultApiClient 方法,令其在实例化时执行一次,里面做了一些全局性的初始化设置,注意 kubeConfigPath 变量对应的 config 文件路径要正确:
接下来是创建 namespace 的 web 服务,如下所示,由于 namespace 在 kubernetes 的 apiVersion 是 v1,因此创建的是 V1Namespace 实例:
为了更清晰的展现 fluent style 效果,将上述代码与创建 namespace 的 yaml 文件内容放在一起对比,如下图所示,可见对照着 yaml 文件就能将代码写出来:
接下来是创建 service 的代码,为了便于和 yaml 对应起来,代码中特意加了缩进:
创建 deployment 的代码如下,因为内容较多所以相对复杂一些,请注意,由于 deployment 在 kubernetes 的 apiVersion 是 extensions/v1beta1,因此创建的是 ExtensionsV1beta1Deployment 实例:
从上述代码可见,withXXX 和 endXXX 是成对出现的,请在编程的时候注意不要遗漏了 endXXX,建议在写 withXXX 的同时就把 endXXX 写上;
最后一个方法是清理所有资源的,前面创建的 deployment、service、namespace 都在此一次性清理掉,实际操作中发现了一个尴尬的情况:删除 deployment 和 namespace 时,发送到 API Server 的删除请求都收到的操作成功的响应,但 kubernetes 客户端在反序列化响应内容时抛出异常(日志中显示了详细情况),鄙人能力有限暂未找到解决之道,因此只能用 try catch 来避免整个方法抛出异常,好在 kubernetes 实际上已经删除成功了,影响不大:
编码已完成,启动 fluent 工程,接下来开始验证功能是否正常;
验证
将 fluent 工程直接在 IEDA 环境启动;
浏览器访问:http://localhost:8080/fluent/createnamespace ,页面会展示 API Server 返回的完整 namespace 信息:
浏览器访问:http://localhost:8080/fluent/createservice ,页面会展示 API Server 返回的完整 service 信息:
浏览器访问:http://localhost:8080/fluent/createdeployment ,页面会展示 API Server 返回的完整 deployment 信息:
验证前面几个接口创建的服务是否可用,我这里 kubernetes 的 IP 地址是 192.168.50.135,因此访问:http://192.168.50.135:30103 ,可以正常显示 nginx 首页:
SSH 登录 kubernetes 服务器查看,通过 kubernetes 的 java 客户端创建的资源都正常:
验证完成后,浏览器访问:http://localhost:8080/fluent/clear ,即可清理掉前面三个接口创建的资源;
至此,基于 fluent style 调用 java 客户端的实战就完成了,希望您能熟练使用此风格的 API 调用,使得编码变得更加轻松流畅,顺便预告一下,下一篇继续做一些简单轻松的操作,目标是熟悉 java 客户端的常用操作;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/a2810b96cf9eadf8c4f71b0fa】。文章转载请联系作者。
评论