Java开发微服务实现分布式架构应用总结

写在前面

突入其来的新肺炎疫情打乱了节日生活的节奏,没有能力参与这场危机的社会救援,只能窝在家里不去给社会添乱了,在此向目前奋战的抗疫前线的每一位工作者致以崇高的敬意,是你们的勇敢和坚毅撑起了我们这个社会的脊梁!

作为一名工作有年头了的软件技术工作者,这个时候也没什么可以做到,还是继续我以前的技术学习思路讲解的,希望能给那些跟我一样宅在家里,想学习Java编程技术提高自己的小伙伴们提高一些可以参考借鉴的知识理解和学习素材。

本文我想从Java开发技术的角度来简单说一下现在流行的分布式服务架构之微服务实现。我会从过去很多公司已经使用很成熟的巨型单体应用程序架构开始,分析一下其优缺点,然后介绍什么是分布式架构,以及为什么选择微服务来实现分布式架构,其好处有哪些等。

通过本文我想让初学编程技术的小伙伴理解Java技术栈发展到今天,以微服务实现分布式架构应用为什么成为必须要学习的一个重要技能。同时还希望通过我的描述让小伙伴们理清Java技术栈发展到今天的脉络,对其学习的内容有一个更加深刻的理解。

 

Java企业级应用 Java EE和 Spring 框架

在说使用Java技术栈实现分布式微服务架构之前,我们先来简单了解几个Java学习者经常说的几个概念,比如Java EE和Spring 框架。

可能很多中途转入Java技术学习的同学一上手就用Spring 技术栈相关的技术,一说起来就是SSN之类的,基本上没有注意过Java EE这类的名称。

这里我简单的说一下它们,Java语言最初开发出来是实现能够脱离操作系统而独立运行的小的代码片段的环境,相当于一个应用程序套,后来随着Java语言的发展其能开发的应用程序类型已经几乎覆盖了所有类型。

程序的应用主流自然是工业企业界,由于各家应用中存在很多共性,所以在开发各自应用时大家会共享一些内容,形成社区规范,开发出很多通用的JAR包和类库,它们被加入到Java的发行包里,形成了后来我们知道的Java To Enterprise Endition(J2EE),延续发展到现在新版的成为Java EE。

也就是说Java EE是针对企业开发制定的通用规范和基础功能实现的合集,它包括了表现,容器,数据持久化,以及网络传输等多方面的技术实现和基础产品。

而现在流行的Spring框架只是实现使用轻量化的容器实现了该规范的一套全新技术组合框架,在开发一套应用程序过程中我们可以选择使用Java EE规范的其它实现来进行,比如CDI,JPA,JSF, JTA等等,也可以使用Spring 容器和Spring MVC集成Spring 实现JPA的Spring Data套件来进行。

现在由于Spring 社区的出色工作,其轻量级的开发框架和相关技术栈被大部分主流公司接受成为Java企业级开发流行的技术组合。特别是在整合了包管理工具和组件化了web容器后的Spring Boot, 让Java的企业级应用开发进入了一个前所未有的快捷方便时代。

 

简单总结来说就是,面对企业级应用开发过程中需要统一标准,比如从表现层,到业务逻辑层,到数据以及资源存储层涉及到的内容有界面表现技术,Java数据持久化访问技术,web服务Servlet技术,容器依赖注入技术,还包括Java环境资源命名标识技术,数据库的连接和访问技术,文件存储和读取技术等等。

这些Java社区都制定的相应的规范,同时根据这些规范产出了一些通用基础的组件产品而这些内容共同组合成了一个Java企业级应用开发套件组合JaveEE,而我们熟悉的Spring框架是采用了Spring自己的受托管Bean规范构建的容器来组合各个基础组件的框架技术。

它是基于Servlet组件上的,更加轻量级,更易于管理和使用。同时强大的Spring社区为我们的开发提供了强大的基础功能类库的组件,让我们可以自己使用它们快速的开发应用。

 

应用程序架构的演化和发展

前面我理解了Java企业级开发的主要技术后,我们来看一下有关应用程序架构的演化和发展。

如果你经历过从一家企业的创业初期伴随企业成长到大规模企业集团过程,你就能深切体会到企业应用开发过程中应用程序架构的演变过程。

在企业初期规模比较小,都是为了满足某个主要功能需要才会去开发应用程序,往往都是独立的完成某个主要的功能的应用系统。慢慢的随着企业规模扩大,业务增多需要的功能系统也会增加,会出现各部门都有一套跟自己业务相关的系统,企业的信息都分储在这些系统的数据库里,形成了早期独立系统成群的信息孤岛现象。这个阶段每个系统基本上都是一个独立的王国。

由于各个业务部门相互之间有信息交互的需求,如此开始了系统集成的发展进程。从最初的JMS基础技术到后来的企业数据总线服务以及SOA技术的努力,基本能够解决企业内部信息孤岛问题,也能够进化出企业决策信息支持系统,但是这些技术让企业的信息系统成了一个堪比猛犸象身体级别的巨型单体应用。

我们说单体应用一般是指我们部署的代码块包含了过多的业务逻辑组件,也就是说这些业务逻辑组件都运行在同一个系统进程中。

这样的应用程序绝大部分的开发人员都非常熟悉,因为直到现在除了个别企业外几乎在所有企业里都能看得见。而且很多传统的技术团队对这类系统的开发管理和维护都轻车熟路了。

 

这类系统的特点是不能随意因为小需求和小故障而做更新发布,必须要制定有一定时间周期跨度的更新发布计划。

这种架构不能单独对其内部某个业务逻辑组件或服务进行单方面的扩容,如果真的需要那么可能需要大量的甚至冗余的硬件基础设施投资。

由于是多个组件服务运行在同一个进程中,很容易让单个组件的性能降低影响的整个应用程序的性能表现。

而且随着功能需求的增加,代码量会一个版本比一个版本庞大,代码实现的复杂度会不止一个数量级的提升。

如果我们起初选择了某些第三方的软件设备,更换难度有可能超乎预期。

关于分布式架构

之所以称之为分布式,是因为整个应用程序的各功能是由跨越进程或者是跨越网络边界的多个构成部分构建而成。这些分布式部署的应用程序组成部分可以是RESTful APIs端点,消息队列,web服务甚至数据存储等。

而在巨型单体应用时代,我们在实现分布式部署架构时只是将整个应用的数据存储部分开部署到其它服务器上,采用web服务器,应用服务器和数据存储服务器这样的类似重复的粗粒度分布式布局。

现在真正的分布式应用架构,是在应用程序级别上进行组件化设计从而能够真正做到功能上的分布式架构实现。这种实现里分布式是应用程序的构成组件跨越进程和网络边界的分布布局。

由此Java开发技术里的进程间信息通信和远程过程调用技术出现发展成熟,不同的部署宿主体之间的通信则依托于网络技术TCP/IP,在应用边界层级上我们多采用HTTP协议通信来实现端点接口RESTful APIs。

这一切同样是微服务实现分布式架构的基础。

微服务,我们可以简单的理解为实现单一功能的运行在单一运行时环境中的组件,其运行的单元是运行时环境。对于Java语言来说是一个JVM,我们可以通过增加JVM来扩充该服务的处理容量和规模。

将这些单一的分布式部署的组件化服务组合起来共同实现整个应用程序的功能,就是一个分布式的微服务架构应用。

这里说一下一个名词运行时runtime,其实它是某个应用能够运行的所有环境所需集合。比如我们的JVM它就是所有Java应用程序赖以运行的基础环境集合,它包括了宿主机器的环境参数抽象,Java语言编译处理功能,以及其它基础的比如时间,编码等内容处理。

理解微服务实现分布式架构

由此我们可以这么理解微服务实现分布式架构,就是通过一个个独立的运行时环境管理的功能单一的应用功能借助规范统一的通信标准相互连接构成整个应用程序。

这种构成部件都是独立的运行环境支持的功能服务,它们可能是运行在同一台主机节点上通过进程间通信连接的多个JVM进程,也可能是运行在多个主机节点上通过网络间通信连接的进程。

至于选择什么样的方式要看我们的应用实现是面对外部边缘接口还是内部组件边缘接口,如果是对外部用户提供的服务接口我们一般都会采用基于HTTP的RESTful APIs来实现。如果是对内部组件提供通信交互的接口我们大多倾向于考虑使用RMI方式。

由于微服务单体的特点是功能单一系统自治以及可以通过集群化来提供统一的功能服务,所以,微服务实现起来代码结构不会过于复杂难于维护,同时由于功能单一,在更新迭代过程中能够尽量降低对其他功能实现的影响。

这种简单的统一性,能够让我们根据系统需求动态的扩容或者缩减该功能服务的处理能力,同时还能够进行不同版本的并行运行。这些特点都给企业采用微服务架构带来足够大的诱惑力。

但是微服务架构的优势虽好但是其实现的复杂程度是很多企业不得不考虑的一大现实问题。

微服务实现分布式架构其实就是将传统的我们在实现应用程序中将所有的业务逻辑组件集合到同一个进程中来通过线程之间的通信来相互连接和调用实现整体功能不同,它是将我们的应用程序的功能模块做了垂直方向的切分,将过去在线程之间的通信从同一个进程中上升到进程之间,使得封装的边界从过去的线程级别扩展至进程级别,如此一来让每个进程运行的功能组件更单一,对其处理功能的控制更为精确,让我们可以根据我们应用程序的处理, 能力的需要精确的对某一部分功能进行动态的扩容和缩量。

从线程级别的通信,既变量共享和域内方法调用,到进程级别则是远程方法调用或者跨网络节点之间的网络通信。如此就将远程过程调用和网络通信的处理技术引入到我们应用程序的功能内组件的内部通信实现中来。

可以这样理解,我们将我们传统的应用放到了互联网上,使之成为一个真正基于网络的架构实现的应用。但是由于远程调用和网络通信的特点造成了其实现的成本要远高于传统的同一进程内部的线程之间通信。

微服务实现分布式架构基础

这就需要我们在实现微服务分布式架构的时候,首先要解决远程点对点或者网络上各个节点计算机之间的通信控制连接问题。然后是每个微服务组件独立运行在宿主机器上的环境隔离问题。

因为我们要求的微服务组件尽量做到功能单一,依赖简单,从而才能更加精确的控制它们。那么在一台主机服务器上只运行单一的组件服务将是极大的浪费,为了充分利用现状商用计算机的处理能力,我们需要一种技术来对组件服务的运行环境进行隔离封装,从而更高效的利用硬件资源,这就是虚拟化和容器化技术为我们解决的问题。

有了容器化技术比如Docker,我们就有了轻量级的可运行单个组件服务的虚拟节点,它不同于过去我们重用的虚拟机技术,虚拟机被看成是传统计算机的简单抽象,因为它没有摆脱操作系统这个负担。使得其占用的资源空间巨大,同时启动和关闭缓慢,无法满足微服务架构的要求。

有了Docker这样轻量级的容器,我们可以通过对Docker容器的管理来抽象我们对组件化服务运行环境的管理。在我们有了众多的容器运行在服务节点上的时候,新的需求出现了,我们如何去管理众多的组件服务容器呢?

这就是Kubernetes这样的软件要解决的问题,它通过提高对Docker的顶层抽象来映射Docker内部的资源和网络管理接口,来统一协调管理众多的Docker实例,使之能够动态的管理众多的运行节点。

让这些运行节点一起共同为某个应用服务提供处理能力。

 

微服务的部署运行

微服务实现分布式架构的基础是网络节点集群,将过去传统的单台服务器节点完成的所有事情转变成多个连接的多态服务节点,可能是虚拟的也可能是物理节点。

由于微服务的设计运来聚合在一起的各功能组件现在需要分布到单个节点上或者一个集群上。比如之前我们web服务器自己承担的访问路由问题,在微服务组件设计中我们会独立设计一个网关服务组件甚至是网关服务集群。

将其部署到一个独立的节点或者节点集群上,以提供专门的网关相关的业务,比如身份验证,鉴权,访问数据过滤,以及顶层路由业务处理。

同时我们针对应用程序的某个业务逻辑模块服务设计,也可以复制其整体的设计,提供该专项业务访问的路由层,来统一路由访问到其各个子节点服务上。

由于我们在设计中考虑到服务的稳定性和弹性要求,我们会使用部署节点集群来实现各部分功能,这就要求我们能够对这些集群节点的运行情况进行监控和管理,通过动态的对节点运行状态的检测掌握各个服务组件运行的状况,以及时的对其进行调整,以保证服务运行稳定性。

同时动态的增加和缩减提供同一服务的运行节点数量应对业务处理流量的波动。这些都需要借助于我们对所有微服务和节点集群的动态管理技术。

在设计微服务实现分布式架构应用过程中会遇到事务处理问题,在传统的单体应用程序设计过程中,我们可以通过在同一进程中多个线程的执行控制,以及在数据库中统一事务提交来处理常见的交易事务问题。

而到了微服务分布式架构状态下,这些处理方式都已不能满足事务处理要求,因为这些事务处理将跨越多个进程和数据库,就很难实现一致的提交和回滚这样的完整性问题保证了。

为此微服务架构的设计者们提出了补偿机制,就是通过事件通信的方式将所有的操作记录并可逆执行,通过补偿方式来达到数据最终的一致性来解决事务完整性问题。

当然,在设计微服务应用的时候,我们应该尽量的避免产生跨越多个组件服务的事务型业务出现。 相关社区里也提供了不少有关微服务架构应用程序的事务处理方案,比如通过一个独立的服务进程来监控所有相关事务的处理情况,以最终决定是否统一提交还是回滚。

总结

总体来说,我们在学习Java技术栈来实现分布式微服务架构应用时,应该首先对分布式架构有一个清晰的理解,同时要了解通信级别对应的具体实现,理解网络通信对于现在分布式架构应用的重要作用。

从而从整体上把握关于微服务和分布式架构应用的设计和开发。

最后祝愿疫情早日销退,国泰民安。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
继“Java开发微信朋友圈PC版系统-架构1.0”之后,debug这段时间日撸夜撸,终于赶在春节放假前给诸位带来了这一系统的架构2.0版本,特此分享给诸位进行学习,以掌握、巩固更多的技术栈以及项目和产品开发经验,同时也为即将到来的金三银四跳槽季做准备! 言归正传,下面仍然以问答的方式介绍下本门课程的相关内容! (1)问题一:这是一门什么样的课程? 很明显,本门课程是建立在架构1.0,即 第1门课程 的基础上发布的,包含了架构1.0的内容,即它仍然是一门项目、产品实战课,基于Spring Boot2.X + 分布式中间件开发的一款类似“新浪微博”、“QQ空间”、“微信朋友圈”PC版的互联网社交软件,包含完整的门户网前端 以及 后台系统管理端,可以说是一套相当完整的系统! (2)问题二:架构2.0融入了哪些新技术以及各自有什么作用? 本课程对应着系统架构2.0,即第2阶段,主要目标:基于架构1.0,优化系统的整体性能,实现一个真正的互联网社交产品;其中,可以学习到的技术干货非常多,包括:系统架构设计、Spring Boot2.X、缓存Redis、多线程并发编程、消息中间件RabbitMQ、全文搜索引擎Elastic Search、前后端消息实时通知WebSocket、分布式任务调度中间件Elastic Job、Http Restful编程、Http通信OKHttp3、分布式全局唯一ID、雪花算法SnowFlake、注册中心ZooKeeper、Shiro+Redis 集群Session共享、敏感词自动过滤、Java8 等等; A.  基于Elastic Search实现首页列表数据的初始化加载、首页全文检索;B.  基于缓存Redis缓存首页朋友圈“是否已点赞、收藏、关注、评论、转发”等统计数据;整合Shiro实现集群部署模式下Session共享;C.  多线程并发编程并发处理系统产生的废弃图片、文件数据;D.  基于Elastic Job切片作业调度分布式多线程清理系统产生的废弃图片;E.  基于RabbitMQ解耦同步调用的服务模块,实现服务模块之间异步通信;F.  基于WebSocket实现系统后端 与 首页前端 当前登录用户实时消息通知;G.  基于OKHttp3、Restful风格的Rest API实现ES文档、分词数据存储与检索;H.  分布式全局唯一ID 雪花算法SnowFlake实现朋友圈图片的唯一命名;I.  ZooKeeper充当Elastic Job创建的系统作业的注册中心;J.  为塑造一个健康的网络环境,对用户发的朋友圈、评论、回复内容进行敏感词过滤;K.  大量优雅的Java8  Lambda编程、Stream编程;  (3)问题三:系统运行起来有效果图看吗?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值