JAVA | 什么是微服务

前言

最近公司某个项目的架构越来越庞大,维护起来非常难受。我主动想领导提出要把这个项目重构在工作中需要把原来的项目重构成微服务架构,因此学习微服务相关知识,在这里记录下来,权当笔记的同时也希望能对你有启发。今天就来聊聊什么是微服务?

单体应用

在聊微服务之前,我先给你们梳理下什么是单体应用。如果你不知道单体应用的痛,那也不会深刻理解微服务的价值。

单体应用

上图为我司某项目架构,包含了四个模块。可以看出我司此项目的架构完完全全属于传统的 MVC 架构,所有的子系统都集成在一个很繁杂的 JVM 进程中。

优点

这种单体架构的优点在于方便管理,所有代码在同一项目中,但是当需求越来越多,项目规模越来越大,其坏处也很明显。

缺点

  1. 项目过于臃肿,部署效率低下

当大大小小的功能模块都集中在同一项目的时候,整个项目必然会变得臃肿,让开发者难以维护。单体应用的代码越来越多,依赖的资源越来越多时,应用编译打包、部署测试一次非常耗时。

  1. 系统高可用性差,资源无法隔离

整个单体系统的各个功能模块都依赖于同样的数据库、内存等资源,一旦某个功能模块对资源使用不当,整个系统都会被拖垮。

  1. 开发成本高

早期在团队开发人员只有两三个人的时候,协作修改代码,打包部署,更新发布这完全可以控制。但是团队一旦扩张,还是按照早期的方法去开发,那如果测试阶段只要有一块功能有问题,就得重新编译打包部署。所有的开发人员又都得参与其中,效率低下,开发成本极高。

  1. 无法灵活拓展

当系统的访问量越来越大的时候,单体系统固然可以进行水平扩展,部署在多台机器上组成集群:

单体应用集群

但是这种扩展并非灵活的扩展。比如我们现在的性能瓶颈是支付模块,希望只针对支付模块做水平扩展,这一点在单体系统是做不到的。因此,急需一种方法将应用的不同模块进行解耦,从而降低开发和部署成本。

要解决上面单体应用的问题,就必须引入服务化的概念。

什么是服务化?

用通俗的语言来说,服务化就是把传统单体应用中通过 JAR 包依赖产生的本地方法调用,改造成 RPC 接口产生的远程方法调用。这些服务是围绕业务功能构建的,可以通过全自动部署机制独立部署。 这些服务的集中管理最少,可以用不同的编程语言编写,并使用不同的数据存储技术。

以我司项目为例,这个项目包含的四个模块都是相互依赖的,当这些模块的代码耦合到一起时,需要去加载每个模块的代码以及连接资源,任何一个出了问题,整个应用都会受到影响。

为此,可以把耦合度较高的模块,独立数据源,独立成一个服务部署,以 RPC 接口的形式对外提供服务。例如订单模块和用户模块:

服务化

可见通过服务化,可以解决单体应用膨胀、团队开发耦合度高、协作效率底下的问题。

什么是微服务?

简而言之,微服务架构风格是一种将单个应用程序作为一套小型服务开发的方法,每种应用程序都在自己的进程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。得益于以 Docker 为代表的容器化技术的成熟以及 DevOps 文化的的兴起,服务化的思想进一步演化,演变成我们今天所熟知的微服务。

说了这么多概念,微服务有什么样的具体特点呢?

  1. 服务拆分粒度更细

微服务可以说是更细维度的服务化,小到一个子模块,只要该模块依赖的资源与其他模块都没有关系,那么就可以拆分为一个微服务。

  1. 服务独立部署

传统的单体架构是以整个系统为单位进行部署,而微服务则是以每一个独立组件(例如用户服务,商品服务)为单位进行部署。

用一张经典的图来表现,就是下面这个样子:

左边是单体架构的集群,右边是微服务集群

什么意思呢?比如根据每个服务的吞吐量不同,支付服务需要部署100台机器,用户服务需要部署30台机器,而商品服务只需要部署10台机器。这种灵活部署只有微服务架构才能实现。

  1. 服务独立维护,分工明确

每个微服务都可以交由一个小团队进行开发,测试维护部署,并对整个生命周期负责。比如在单体应用时期,我们的研发团队是如下图这样传统的水平架构:

水平团队组织架构

而微服务时期,我们可以根据其思想把团队划分成垂直组织架构:

垂直团队组织架构

当然,这种垂直划分只是一个理想的架构,实际在企业中并不会把团队组织架构拆分得这么绝对。

后语

文章介绍了微服务的发展由来,它是由单体应用进化到服务化拆分部署,后期随着移动互联网规模的不断扩大,敏捷开发、持续交付、DevOps 理论的发展和实践,以及基于 Docker 容器化技术的成熟,微服务架构开始流行,逐渐成为应用架构的未来演进方向。

以上就是我对微服务的理解,希望对你们有帮助。

本文分享自微信公众号 - 一个优秀的废人(feiren_java)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python乱炖

GDB入门教程之如何使用GDB启动调试

写在前面:今天开始尝试写写除Vim外的其他内容,仍然是以技术为主,可能涉及的内容包括Linux、正则表达式、gdb、makefile等内容,不知道小伙伴们有没有...

9910
来自专栏软件开发 -- 分享 互助 成长

nginx下使用asan和valgrind两个静态检查工具

valgrind安装:参考:https://blog.csdn.net/justheretobe/article/details/52986461

9330
来自专栏微信公众号【Java技术江湖】

【Java基本功】很多人经常忽视的Java基础知识点

主函数可以被重载,但是JVM只识别main(String[] args),其他都是作为一般函数。这里面的args知识数组变量可以更改,其他都不能更改。

8920
来自专栏大话swift

关于交易的gas 与gassPrice概念已经交易阻塞

以太坊的交易是通过旷工从矿池中挖矿完成的,而挖矿是❓通俗讲就是将矿池中提交的交易按照价格高低进行筛选打包成块的过程

5810
来自专栏linux驱动个人学习

android-ramdisk.img分析、recovery.img&boot.img执行过程【转】

ramdisk通过直面意思就大概能理解意思,ram disk虚拟内存盘,将ram模拟成硬盘来使用的文件系统。对于传统的磁盘文件系统来说,这样做的好处是可以极大提...

8420
来自专栏微信公众号【Java技术江湖】

【Java基本功】一文了解Java中继承、封装、多态的细节

封装主要是因为Java有访问权限的控制。public > protected > package = default > private。封装可以保护类中的信息...

8410
来自专栏微信公众号【Java技术江湖】

【Java基本功】离开IDE,使用javac和Java构建项目

前言:本文教你怎么用javac和java命令,讲解了classpath的原理,以及如何利用脚本(shell或bat)进行项目部署,离开ide,还原最本质的Jav...

16020
来自专栏搜狗测试

如何使用浏览器访问linux本地文件

配置nginx.conf ,将/usr/local/nginx/conf/nginx.conf替换为以下内容:

22010
来自专栏微信公众号【Java技术江湖】

【Java基本功】一文读懂Java中的泛型

本文参考https://blog.csdn.net/s10461/article/details/53941091

8120
来自专栏猿天地

Java 调试工具、热部署、JVM 监控工具都用到了它

我们平时写 Java Agent 的机会确实不多,也可以说几乎用不着。但其实我们一直在用它,而且接触的机会非常多。下面这些技术都使用了 Java Agent 技...

10530

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励