前言

这是《程序员如何让自己 Be Cloud Native》系列文章的第二篇,从第一篇的反馈来看,有些同学反馈十二要素太形式主义,不建议盲目跟从。作者认为任何理论和技术都需要有自己的观点,这些观点是建立在个体知识体系逐渐锻炼出来的辩别能力之上的。Be Cloud Native这一系列的文章,会基于十二要素为理论基础,加上作者在云计算诞生以来对于架构的演进所观察到的变化去分享自己的一些心得。

第一篇:仓库与依赖。「传送门」

实例

配置这个要素的核心思想就是代码与数据隔离,一开始我们的软件很小很小的时候,我们会可能直接把各种配置、甚至生产环境中的代码直接写在代码中,配置甚至就是代码的一部分?比如以下的这断代码就是这样:


public boolean serviceConnectable() {return ping("edas.console.aliyun.com", 3);}

该方法实现一个本地是否可以连接到远端 server 的功能。如果按照上面的代码进行编写,只能保证在公共云的环境达到想要的效果。该程序如果部署到了一个专有云或者 IDC 的环境中的时候,就需要改代码了。

如果改成以下的方式,效果就会截然不同。那时如果程序部署到了一套新的环境中,只需改变edas.server.address 这个配置。

@Value("edas.server.address")
private String remoteAddress;public boolean serviceConnectable() {
return ping(remoteAddress, 3);}

定义与示例

这个例子应该比较贴近大家的日常,我们将上面这个例子往上提升一层,可以做出一个如下的初步定义:应用的行为(_Behavior_) = 代码(_Code_) + 输入(_Data_)。代码是固定的,需要重新编译分发,无法根据环境进行变化的;而输入是活的。上面的例子,就是一个把 Code 中的一部分内容抽离,变成 Data 的过程。做完这个变化之后,应用对变化的适应性就更强了。当然,这些 Data 有些是用户输入的,有些是系统启动时就已经确定的,后者是我们定义的 配置 ,也是我们今天讨论的主题。从这个层面(_Data_)说起来,配置其实可以包含很多种,以 Java 语言为例,至少分为以下几种:

  • 代码中的文件配置: *.properties 文件。
  • 机器上的文件配置 *.properties 文件。
  • 通过 -D 参数指定的启动参数。
  • 环境变量。
  • 配置管理系统,简单的有 DB;比较流行的领域产品如 Nacos、ZooKeeper、ectd 等。

选择多了,貌似世界就不那么美妙了,因为我们总是会陷入到“用什么”和“为什么”中去。作者的观点是,在用什么之前,先弄清楚需求层面的两点:

  • 隔离粒度:每个版本不一样?每台机器不一样?每个进程不一样?
  • 安全性:运维人员可见?开发人员可见?还是都不应该可见?

仔细讨论上述两点之前,我们举几个关于配置的例子:

  • 程序版本号:从代码 Release (build) 开始,基本上就确定了;这一类配置基本上不存在变化的可能,即这一类配置的隔离粒度等同于 Code
  • 某个前端组件的版本号:前端版本号有一个特点,就是变动很频繁,尤其是在上线的过程中,发布三四个版本是很常见的现象;而且在上线的过程中,一般都会先灰度验证,再进行现网发布。所以这类配置需要具备一个特点就是,可灵活变动与可按照环境(不同机器、不同流量)粒度发布。
  • 服务器端口号:服务器的端口号是需要和进程绑定的,尤其在某些微服务场景;同一个服务,如果部署在同一台机器上,必须准确的告知其他服务本服务的确切的地址和端口。
  • 数据库元信息配置:这种配置,同一套环境中的相同服务会是一样的,而且其真实的值隐藏的越深越好,其他还有某些 AK/SK、用户名密码之类,每套环境会不一样,同时不同的产品对待这类配置的安全性要求也可能不一样。

归纳

通过上面例子简单的论述,我们大致可以把相关的配置做如下的归类:

配置项所在位置 隔离性 安全性
代码文件 控制不同版本的软件行为,等同于代码、基本不会改动 所有有代码权限的人员都可见
机器上的文件 机器环境级别的隔离 可根据文件的系统权限灵活设置可见性
启动参数 进程级别隔离 能进入系统便可见
环境变量 可根据容器、系统、用户、进程进行非常灵活的搭配 可设置到系统用户级别
配置管理系统 程序员可自由编程实现,一般是服务级别的隔离性 取决于不同产品的实现,有的方案可以做到安全性最好

这里作者想额外强调的是安全性这一个点,尤其某些金融场景。原生的配置方式,如果不做代码的改动的话,都无法做到很高的安全性,但是在一些分布式产品中,尤其是一些云产品内部,就可以做到很安全,具体可以参考下图:

以 Nacos 的云上实现 ACM 为例,对上图进行一个简单的阐述。一般的程序读取配置方式如左图,当执行启动脚本后,应用程序从脚本中设置的环境变量、文件或启动参数中获取配置。这些方式可以满足大部分的场景,但是如果你的应用是一个分布式的大集群,这个时候如果想改一个配置是不可能在机器上配置的,然后一台台的区修改,此时我们需要一个支持大集群的分布式配置服务来支持。开源的配置中心有很多,如 ZooKeeper、etcd、Nacos 等。

但是有一种场景,一般意义上的配置中心也是满足不了的,那就是诸如数据库密码这一类安全性要求很高的配置。这类在云上会有一些很好的实现,以上图右边为例解释一下在云上是如何做到的:

  • 当用户往配置服务中写入一个配置时,会先使用加密服务进行加密,图中的 A。
  • 如果有客户端需要,将相应的加密数据推往对应的客户端,图中的 B。
  • 客户端收到数据,会根据机器上的_云角色_,请求云加密服务进行解密,图中的 C。

从上面这个描述,我们就能很感受到整个过程,利用云生态的能力,可以做得很优雅、很安全,而且也没有额外的代码侵入。

总结

写到这里,我需要点一下题,要做到 “Be Cloud Native” ,配置是必不可少的一个环节。能让我们的世界变得稍微美好点的方式之一,就是把每个硬编码的字符,变成一个个可运维、安全的配置。

同时在云上,我们会看到有不一样的、更加优雅、更安全、成本更低的解决方案。配置的安全无小事,一时图简单省事,可能就会造成生产级别的敏感信息、甚至 DB 的泄露。

Be Cloud Native 的另外一层意思,正是尽可能多的利用云厂商提供的原生技术能力,来构建一个更安全、优雅、可扩展、高可用的应用架构。

程序员如何让自己 Be Cloud Native - 配置篇 1相关推荐

  1. 程序员如何让自己 Be Cloud Native - 配置篇

    前言 这是<程序员如何让自己 Be Cloud Native>系列文章的第二篇,从第一篇的反馈来看,有些同学反馈十二要素太形式主义,不建议盲目跟从.作者认为任何理论和技术都需要有自己的观点 ...

  2. 想成为程序员的话,这些书单必不可少——算法篇

    前言 又到了给大家"荐书"的时候了,如果计算机系只开三门课,那么这三门课就一定是:离散数学,数据结构与算法,编译原理.如果只开一门课,那剩下的就一定是:数据结构与算法.最近参加了很 ...

  3. 程序员如何跨越35岁危机?这篇给点干货建议!

    职场&认知洞察 丨 作者 / findyi 这是findyi公众号的第83篇原创文章 这两天在我的读者群里做了一个职业小调研,发现关注我公众号的70%以上都是程序员. 毕竟程序员吸引程序员,这 ...

  4. Linux笔记本电脑大调查:程序员最喜欢的电脑是什么配置?

    程序员对Linux笔记本有什么期望?最近进行的Linux笔记本电脑调查,揭示了在购买Linux笔记本电脑时,程序员考虑的各种因素,如价格.兼容性问题.GPU,笔记本电脑品牌等.这表明有些人如果得到适当 ...

  5. 同宿舍的程序员毕业五年的现状之女生宿舍篇

    点击上方"程序人生",选择"置顶公众号" 第一时间关注程序猿(媛)身边的故事 作者 五五 白天搬砖,晚上砌梦想.相信每个人有故事,程序员更是有许多事故,书写最接 ...

  6. 程序员如何邂逅真爱之伪攻略篇

    情人节快要到了,在此送上一份来自女朋友的福利 - 虽然文章是以前写的,但是,攻略是无论何时都适用哒. 其实觉得像工科生.程序员一类的男生,应当很容易找到女朋友才对.也正如很多人所说,IT行业是个高薪行 ...

  7. 2019年全国程序员统一考试,现在开始!搞笑篇

    原 2019年全国程序员统一考试,现在开始! 2019年06月10日 21:19:22 27Up 阅读数 6189 <span class="tags-box artic-tag-bo ...

  8. 程序员那些不得不说的事之“面试篇”

    一.面试虐我千百遍,我视面试如初恋 面试的日子痛并快乐着!从开始的满腔激情,到最后的身心疲惫!很悲剧,但最悲剧的是面试过程中各自奇葩事让你苦笑不得!我记忆犹新的是面试的第三天遇见万年奇葩,想想就火大! ...

  9. 零基础学C++——黑马程序员课程笔记(C++基础语法入门篇)

    封面来自互联网侵删 视频地址:点击访问 (我这里开发工具选用VSstudio) 此笔记有三个系列: C++基础语法入门篇 C++核心编程篇 点击查看 C++提高编程篇 文章目录 C++初识 变量 常量 ...

  10. 程序员开发指南!半路出家Android程序员看我轻松逆袭!实战篇

    前言 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开 ...

最新文章

  1. 自动驾驶中高效的激光雷达里程计
  2. oracle rman异机恢复
  3. Linux用户管理-服务管理
  4. ASP.NET MVC 5 入门指南汇总
  5. m.soudashi.cn 地图_SEO人员怎样挖掘大量关键词库
  6. 9.1 基于内容的推荐系统-机器学习笔记-斯坦福吴恩达教授
  7. 数据挖掘:一个end2end完整实例
  8. 北京/苏州内推 | 微软STCA搜索广告算法团队招聘NLP算法工程师
  9. 计算机系统不能更改,电脑系统时间怎么设定不能修改
  10. C++泛型编程实现哈希表(闭散列---线性探测)
  11. JVM入门到放弃之基本概念
  12. 月薪11.5K 土木人零基础转行软件测试工程师,他都经历了什么?
  13. APUE习题[实现dup2函数功能,不使用fcntl]
  14. UploadBean实现文件上传(转)
  15. BC95-G NB-IOT 模块使用
  16. 计算机人工智能领域英文文献,人工智能 英文文献译文
  17. VUE源码解析(持续更新)
  18. 苹果ios系统企业级开发者授信下载app时出现:‘此app开发者需要更新’‘出现一朵云app无法打开’有的手机可以打开有的手机无法打开情况解决方案
  19. 利用Python进行心脏病患者特征分析
  20. 程序化广告(三)- 程序化广告生态链介绍如DSP/ADX/DMP等

热门文章

  1. 算法:逆序局部链表 Reverse Linked List II
  2. python基本词汇的特点_Python 爬完评论只会做词云?情感分析了解一下
  3. 2021-09-07客户端向 NameNode 请求创建文件,NameNode 根据元数据信息计算出文件的元数 据信息
  4. 535. TinyURL 的加密与解密
  5. python的符号lt和gt怎么输入_lt;lt;Python基础教程gt;gt;学习笔记 | 第04章 | 字典...
  6. 《中文分词算法研究》
  7. 构建机器学习系统的20个经验教训
  8. 是新最全Git命令大全及速记图
  9. 【POJ 1113】Wall【凸包+一点思维】
  10. Raki的读paper小记:Empower Entity Set Expansion via Language Model Probing