- 大话编程
- 一个故事讲完 https
- C 老头和 Java 小子的硬盘夜话
- 我是一个函数
- 操作系统是个大骗子?
- 90 后 老头儿 和 00 后 Go 小子的硬盘夜话
- 爱炫耀的数据库老头儿
- 浏览器:一个家族的奋斗
- 浏览器家族的安全反击战
- 黑客三兄弟
- 从读写分离到 CQRS,张大胖是如何解决性能问题的?
- 两个程序的爱情故事
- 两个程序的爱情故事(续)
- 烂代码传奇
- 机房夜话
- 干掉状态:从 session 到 token
- 张大胖的 docker 之路
- 从 SOA 到微服务
- XML 的传奇人生
- 从密码到 token, 一个授权的故事
- 编程世界的那把锁
- 加锁还是不加锁,这是一个问题
- 这个动物园, 两年也逛不完
- 张大胖和 CAP 定理
- 一个翻译家族的发家史
- 张大胖和单元测试
- Java 帝国
- 一个著名的日志系统是怎么设计出来的?
- Java 帝国之泛型
- Java 帝国之动态代理
- 从兄弟到父子:动态代理在民间是怎么玩的?
- Java 注解是怎么成功上位的?
- Java EE 要死掉了?
- Java 帝国之宫廷内斗
- Java 帝国之宫廷内斗(2)
- 当世界上只剩下一个 Java 程序员
- 持久化:Java 帝国反击战
- 什么是框架?
- 学习 Java 虚拟机没用? 听听当事人是怎么说的!
- 聊聊 Java 平台上的非 Java 语言
- Java 帝国之消息队列
- Java 帝国之 JMS 的诞生
- Java 帝国之单例设计模式
- 对 Java Inputstream 的一次采访
- ASM: 一个低调成功者的自述
- 序列化: 一个老家伙的咸鱼翻身
- Java IO 的自述
- JDK 先生最近有点烦
- 什么是框架(续)?
- 说 空话,做实事: 谈谈多态
- Kotlin 初体验
- 小白科普
- 小白科普:分布式和集群
- 什么是 Zookeeper?
- 小白科普:悲观锁和乐观锁
- 小白科普:LDAP 有什么用?
- 小白科普:服务那点事儿
- 小白科普:Netty 有什么用?
- 老司机经验
- 后端程序员都做些什么?
- 为什么要学习 HashMap 的底层原理?
- 小心,别被今日头条给困住了!
- 对自己狠一点,开始写作吧
- 开源代码啃不动,不如先定个小目标
- Python 这么简单还用学吗?
- 作为一个有追求的程序员,你应该掌握的七种武器
- 给设计模式说句公道话
- 时间是这么被浪费掉的
- 你真正付出了全部努力了吗?
- 写给初学者:编程的本质
- 在大学期间更应该学习什么?
- 看看 悲催 的码农得学多少东西?
- 学习编程的四兄弟
- 那些年,我后悔没做好的事情
- 我为什么对后端编程情有独钟?
- 当我们在学习编程语言时,我们在学习什么?
- 编程需要多少数学知识?
- 想成为编程高手,一定要学汇编吗?
- 你必须理解的计算机核心概念
- 你的需求是怎么描述的?
- 白话敏捷软件开发
- 人在职场
- 凡事必先骑上虎背,给性格内向的程序员聊几句
- 为什么能力优秀的人当了主管以后反而不行了呢?
- 不想做技术了,还有一条路
- 纪念我最有效率的一次加班
- 书写「简历」时,需要规避的错误。
- 上天还是入地?
- 工作 6 年,半路出家到 CTO
- 只是 Work 还不够,更重要的是 Think
- 我所尊敬的三位女程序员
- 我们向印度人学习什么?
- 你去下家面试,怎么评价你在这家公司做的工作?
小白科普:服务那点事儿
小明的公司向电子商务领域进军,开发了一个电商系统,功能没什么新奇的,无非就是用户管理、商品管理、订单管理、商品详情页、库存管理、支付管理等等。
系统刚开发的时候,所有的功能都放在一起,部署在一个机器上,这种应用被称为 单体应用(monolithic application) , 由于公司也没什么名气,流量也不大,单体应用可以轻松应对。
随着公司加大宣传力度, 流量越来越大, 这种单体应用的弊端越来越明显。
比如上周搞了一个宣传活动,注册用户送优惠券,那个用户管理的模块访问量暴涨, 小明虽然添加了几台虚拟服务器来做负载均衡应急, 但是这些新的服务器除了用户管理模块外,不得不连带其他模块一起部署(单体应用嘛), 真是一种巨大的浪费。
小明不由地想: 要是能把用户管理单独拎出来就好了, 这样的话一个机器上就不部署别的应用了,专门部署用户管理,一个机器上可以部署好几个! 多节省机器啊。
此外,随着逻辑的增加,应用变得越来越大,快长成一个接近 200M 的“大胖子”了, 各个模块之间也建立了千丝万缕的联系,慢慢地业务逻辑绞成了一团,原先定义良好的接口也变得混乱不堪,每次代码修改和系统上线都是一次重大挑战。
小明向领导建议: 把各个模块拆分成小应用吧, 让他们可以独立开发,灵活的部署。
如果哪个应用流量比较大,那就多部署几个,哪个应用用得少, 就少部署几个。
每个小应用可以独立开发、部署,非常灵活。
当然,应用之间还少不了交互,每个应用都得对外提供接口让别人访问, 例如想获得一个用户的信息就得访问这个 URL : http://192.168.0.10/user/<userID>
这样的每个接口可以称为 服务(Service) 。
可是问题来了,对于每个应用来说,如果部署了多份,每个服务也会有多个实例, 有多个 URL, 到底要调用哪一个呢?
http://192.168.0. 10 /user/<userID>
http://192.168.0. 12 /user/<userID>
http://192.168.0. 13 /user/<userID>
更烦人的是, 刚刚调用了 192.168.0.13 这个机器上的服务,过了一会儿, 由于流量小,不需要那么多机器, 这个机器上的服务实例下线了,就无法进行第二次调用了。
看来一个应用不能和特定机器上的服务绑死啊!
小明想了一个办法: 想要调用服务之前,先在一个叫做 注册中心 的地方 根据名称查找一个服务 ,比如想查看用户信息了,可以这么干:
支付管理:给哥们来个 getUserInfo 的服务!
注册中心(忙活了半天): 用这个吧 http://192.168.0.12/user/<userID>, 他的负载比较小
......支付管理开心地使用.....
支付管理:再给哥们来个 getUserInfo 的服务
注册中心: 用这个吧 http://192.168.0.13/user/<userID>, 刚才那个半天都不给我联系了,估计是下线了。
但是注册中心怎么知道有哪些服务呢?
小明早已想到这一层,他让各个服务主动前来报到, 注册 。
注册了还不算完, 各个服务必须定期前来签到(行业黑话叫做 心跳 ),让注册中心知道服务还活着。
这种办法其实就叫做 服务的注册和发现 。
小明充分发挥了抽象的能力,他把调用方称为 服务的消费者(Consumer) , 用户管理、订单管理、商品管理这些应用称为 服务提供者(Provider) , 得到了下面这个图:
小明很得意:“看看我这个抽象多漂亮!”
他马上把这个宝图“献”给了领导, 领导看了一眼说: 这个图看着好眼熟啊, 奥,对了,我在 Dubbo 那里见过, 还有,当年我做 SOA 的时候也是用这种思路做服务的注册和查找, 看来我们现在遇到的问题和当年很类似嘛!
小明听了以后有点失望,失望之余又大为感慨: 看来我又造了一次轮子,技术在变, 但是基本的思想一直没变啊!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论