分布式和微服务的区别
1.分布式和微服务有什么区别呢?
答:分布式的核心就一个字:拆。只要是将一个项目拆分成了多个模块,并将这些模块分开部署,那就算是分布式。
如何拆呢?有两种方式:水平拆分,或垂直拆分(也称为“横向拆分”和“垂直拆分”),具体如下:
水平拆分:根据“分层”的思想进行拆分。例如,可以将一个项目根据“三层架构”拆分成 表示层(jsp+servlet)、业务逻辑层(service)和数据访问层(dao),然后再分开部署:把表示层部署在服务器A上,把service和dao层部署在服务器B上,然后服务器A和服务器B之间通过dubbo等RPC进行进行整合(在左下角的“阅读原文”里有dubbo的视频课程,可以点击学习),如图所示。
垂直拆分:根据业务进行拆分。例如,可以根据业务逻辑,将“电商项目”拆分成“订单项目”、“用户项目”和“秒杀项目”。显然这三个拆分后的项目,仍然可以作为独立的项目使用。像这种拆分的方法,就成为垂直拆分。
什么是微服务呢?
从名字就能知道,“微服务”就是非常微小的服务。
微服务可以理解为一种非常细粒度的垂直拆分。例如,以上“订单项目”本来就是垂直拆分后的子项目,但实际上“订单项目”还能进一步拆分为“购物项目”、“结算项目”和“售后项目”,如图。
现在看图中的“订单项目”,它完全可以作为一个分布式项目的组成元素,但就不适合作为微服务的组成元素了(因为它还能再拆,而微服务应该是不能再拆的“微小”服务,类似于“原子性”)。
总结:
分布式:拆了就行。
微服务:细粒度的垂直拆分。
2.Java中不是有GC吗,怎么还有内存泄漏一说?
答:Java内存有两种常见问题:内存溢出和内存泄漏。
内存溢出好理解,就是JVM内存有限。如果对象太多,JVM内存放不下了,就会内存溢出。
那什么是内存泄漏?首先得明确,GC只会回收那些“不可达”的对象(可以简单理解为,如果一个对象存在着指向它的引用,这个对象就“可达”;如果没有引用指向它,则“不可达”)。
若一个对象是“无用但可达的”,就会造成内存泄漏。
如下代码中,obj的值是null,因此是“无用的”;但同时obj又同时被被list引用,因此是“可达”的,所以此时的obj就会造成内存泄漏。
Object obj = new Object();
list.add( obj );
obj = null ;
除了上面obj这种内存泄漏的情况以外,在实际开发中最常见的内存泄漏就是打开资源后没有调用close()方法。例如socket、io流等,都需要再最后close()一下防止内存泄漏。
相关文章
- 你以为在做的是微服务?不!你做的只是分布式单体!
- go语言微服务之RPC协议[通俗易懂]
- springcloud微服务架构开发实战:分布式消息总线
- 微服务架构开发实战:分布式消息总线,实现配置信息的自动更新
- 微服务架构实战:可扩展分布式数据库集群的搭建
- 如何在微服务中实现分布式事务的变通?
- ZooKeeper分布式协调服务(节点分类、事件监听、java集成)
- SpringCloud 构建微服务架构,分布式配置中心(加密解密)
- 架构解密从分布式到微服务:深入理解网络,NIO
- 你以为在做的是微服务?其实你只是在做分布式单体!
- 已跪,Java全能笔记爆火,分布式/开源框架/微服务/性能调优全有
- CentOS7 FTP服务搭建(虚拟用户访问FTP服务)详解程序员
- 有孚网络与南方物流集团签署项目合作协议,共创数字服务领域新载体
- Linux下架设高效的防火墙服务(linux防火墙服务)
- 使用Docker部署Redis服务,轻松搞定分布式架构(dockerredis)
- 控制 Oracle 并发控制: 确保服务的可靠性(oracle并发数)
- Oracle服务: 重启成功(oracle服务重启)
- 服务深入研究如何使用Redis服务(怎么样redis)
- 安卓手机用户订阅Redis服务,实现快捷数据交互(安卓订阅redis)
- 分布式锁与Redis锁 优化服务性能之道(分布式锁和redis锁)
- MySQL并非完全免费,需要考虑使用许可和商业支持MYSQL也提供了高级版和服务,拥有比免费版更多的功能和灵活的技术支持
- 南京银行的2017年:发展消费金融、智慧银行,联合阿里输出云服务