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方式。

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

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

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

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

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

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

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

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

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

image

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

image

搜集费时费力,能看到此处的都是真爱!
样写的

[外链图片转存中…(img-i8UtswIo-1711956858097)]

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

[外链图片转存中…(img-3Vc4ef3f-1711956858097)]

搜集费时费力,能看到此处的都是真爱!

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值