精通Java微服务

第1章

微服务是在面向服务架构SOA的基础上进一步发展而来的,它比SOA做得更加彻底,其单体服务被更加彻底地划分,最大限度地实现了服务的单一职责。

1.1.2互联网

即计算机网络,连接了世界上数以万计的计算机设备(可联网设备),这些计算设备包括桌面计算机、Linux服务器(工作站)以及其他新兴的计算设备(如智能手机、智能手表、平板电脑等)。

1.1.3 网络应用架构

互联网环境下,诞生了新的应用软件架构,即基于B/S和C/S架构的应用,这两种应用的共同点是均需要网络通过向远程服务端发送请求获取数据以及相互通信。

C/S架构的软件需要在宿主机上安装才能使用,而B/S架构的软件只需宿主机接入互联网且拥有浏览器即可使用。

1.2SOA与微服务

SOA(面向服务架构)是一种软件架构、一种软件设计方法。SOA软件系统中包含了多个服务,并且服务与服务之间通过相互依赖最终提供一系列功能,一个服务通常以独立的形式存在于操作系统进程中,各个服务之间通过远程调用进行通信。

微服务架构和SOA架构类似,是在SOA基础上进行了改进,微服务架构的核心是业务需要彻底组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的服务,这些服务可以持续开发、持续集成、并完成自动化部署。

1.3 远程过程调用 

微服务中单体服务间的通信是通过远程过程调用RPC实现。

基于HTTP的远程过程调用传输的数据类型可分为两类:即XML格式数据和JSON格式数据。

TCP是一种可靠长连接

HTTP是短连接,连接一次,发送一个数据包,然后断开连接。

客户端向服务端发起的请求携带4部分数据,即请求行、请求头、空行和请求体。

第2章 Spring及Spring Could

目前微服务方案应用最广的架构即Spring体系,Spring体系包含了构建微服务所需的所有组件,如Spring Cloud、Sring Boot。

2.1Spring

Spring是基于Java编程语言的框架。Spring旨在使Java编程更加快捷、易用、安全,Spring正是由于聚焦速度、简单和效率,成为世界上应用最广的Java框架。

2.1.1 为什么选择Spring

Spring是Java后台开发人员的福音,有了Spring框架,对现代开发者而言应该是有了SpringBoot后,可以快速迭代,满足业务需求。

1.开发者的信赖

Spring发展至今备受开发者信赖。互联网发展至今,阿里巴巴、谷歌、微软等著名公司对Spring均有贡献,开发者众多,发展非常迅速且稳定。对于消费者,他们虽然并不知道自己用的服务是由Spring体系提供的,但是他们享受到了Spring在线上购物、流媒体电视等领域带来的良好的体验与服务,反观这些良好的效果,开发者更加信赖Spring,正如“滚雪球”一样,Spring的受众越来越多。

2.灵活

Spring具有多种可插拔的组件及第三方库,使其具有足够的灵活性,通过组合不同的组件(包括第三方库),开发者可以构建任何可以想得到的应用,如构建安全的Web应用,响应式Web应用或微服务Web应用。Spring框架的核心功能:控制反转(IoC)和依赖注入(DI)为Spring的功能实现提供了基础,保证了Spring的灵活性。

3.高效

Spring项目SpringBoot的出现,改变了开发者进行Java编程的方式。从根本上简化了开发流程,减少了代码量,提高了开发效率。SpringBoot集成必要的组件,如应用上下文、自动配置的嵌入Web服务器,使微服务开发如同编写输出Hello World的程序一样简单。在SpringBoot中集成SpringCloud等相关组件,独立的Spring Boot项目即可构成微服务体系,显著提高微服务开发效率。

4.安全

Spring在处理安全问题方面响应迅速且非常负责,这保证了Spring具有更高的安全性,互联网安全室非常重要的一个领域,而Spring在安全方面做得非常出色,Spring Security是一个开箱即用的安全组件,提供了工业标准的安全集成方案。

5.良好的生态

Spring社区是一个庞大的、全球性和多样化的社区,涵盖了从初学者到经验丰富的专业人士等不同开发阶段的开发人群,无论在哪个学习阶段,均可从社区获取帮助以及相应的学习资源。

2.1.2 Spring的功能

 

 1.微服务

微服务是一种现代软件开发方法,微服务中的应用代码分片管理、独立交付、即微服务中的应用是彼此独立的模块,可以单独运行,是弱依赖,如果服务之间没有相互调用关系,则服务是独立进行开发和交付的,相互不影响,保证了项目的独立快速交付,这也是现代互联网所追求的高内聚、低耦合架构的实现。

2.响应式编程

 响应式编程是一种范式,开发者可以构建非阻塞、异步的应用程序处理背压(流控)。Spring Framework 5.0引入的Web Flux即响应式编程组件。响应式编程并不会提高服务的响应速度,但是可以在有限资源的情况下提高系统的吞吐量和伸缩性。响应式编程对超时、容错、失败重试进行了优化、用户体验更好。

背压是一种应用运行时状态,当生产者生产数据的速度大于消费者消费的速度时,会导致消费者缓存溢出,即形成背压。阻塞和非阻塞是针对线程而言的,引入非阻塞机制,线程不会阻塞,保证系统资源的利用率;异步和同步是针对消息传递而言的,引入异步消息传递,保证系统的流畅性。

3. Spring Cloud组件化

分布式系统服务间的通信成为开发者面临的重大挑战之一,系统的复杂度由应用层向网络转移,这意味着云原生需要处理诸如外部配置、无状态、日志记录和连接到备用服务等问题,而Spring的原生项目Spring Cloud提供的组件足够处理这些问题。使用Spring Cloud可以“一站式”开发、部署、维护分布式服务(微服务集群)。

4.快速构建Web应用

Spring的单体项目SpringBoot是一个约定大于配置的Java Web框架,该框架移除了众多配置文件,是一种现代化的Web编程模型,简化了服务搭建流程,并且Spring Boot的启动和停止都非常简便,通过内置的Tomcat、Netty等服务器即可完成服务的启停,提高开发和交付效率。

5.功能即服务

无服务器工作负载是事件驱动的工作负载,与服务器基础设施无关。运行多少个实例、使用哪种操作系统这类问题统一由服务平台管理,对于开发者而言,功能及服务FaaS,开发者可以更加专注于业务开发。

6.事件驱动

事件驱动即消息的发布-订阅,Spring提供基于事件驱动的组件,可以很好地与Apache Kafka、RabbitMQ、Azure Event Hub等消息中间件协作,保证应用服务与业务之间的消息互通,当业务方产生数据时,及时将数据传输至消息队列,应用服务从订阅的队列中获取数据并及时处理,保证业务的顺畅进行。

7.批处理

批处理是指不需要以外部交互或中断的方式处理有限的数据。批处理技术可以有效处理大量数据,基于SLA的排序能力可以充分利用资源,在JVM中构建稳定的批处理任务,保证系统的安全稳定与运行。

2.1.3 Spring框架功能体系

Spring架构即Spring Framework,这并不是Spring的组成架构,而是Spring的功能架构,即Spring包含的主要功能,这些功能按模块进行划分,Spring架构中共有大约20个模块,按照各自的职能分为Core Container、Data Access/Integration、Web、AOP、Instrumentation、Messaging和Test,Spring分层架构如图:

1.Core Container

 Core Container核心容器包括spring-core、spring-beans、spring-context、spring-context-support和spring-expression(Spring Expression Language,SpEL)这5个模块。spring-core和spring-beans模块提供框架最基础、最核心的功能,如IoC和DI,BeanFactory是工厂模式的复杂实现,解除了对单例的依赖,同时将配置从程序中解耦。

Context上下文模块(spring-context)是在Core和Beans模块的基础上构建的,Context模块从Beans模块继承并且增加了对国际化、事件广播、资源载入和通过Servlet容器创建上下文的支持。

Context模块同样支持J2EE,如EJB、JMX等,ApplicationContext接口是Context模块的关键切入点,spring-context-support提供第三方库接入Spring应用上下文的支持,如缓存、邮件、任务、以及模版引擎。

spring-expression模块为运行时查询和操作对象提供强大的表达式语言。SpEL是统一表达式语言的扩展,该语言支持setting和getting属性值、属性赋值、方法引用、获取数组、集合内容等。

2. AOP和Instrumentation

spring-aop模块提供面向切面编程的功能,开发者可以使用AOP自定义切面,将功能实现与业务逻辑解耦,功能实现即通过切面操作某部分逻辑的执行过程,如统计部分业务逻辑的耗时、日志等,业务逻辑即实际的需求。

独立的spring-aspects模块提供了与AspectJ的集成。spring-instrument模块使用java.lang.instrument(容器类)作为动态的instrumentation(执行容器),开发者可以构建独立于应用程序的代理程序监测和协助运行在JVM中的程序,甚至替换和修改类的定义,同时提供了类加载器实现功能。spring-instrument-tomcat模块包含Spring对Tomcat的动态执行容器代理。

3.Messaging

Messaging为集成Message API和消息协议提供支持。Spring框架从4.0开始引入Spring messaging模块,该模块的核心理念借鉴了Spring Integration,如Message、Message Channel、Message Handler,该模块同时包含了一系列类似于Spring MVC注解编程风格的消息方法注解。

4.Data Access/Integration

Data Access/Integration层包括JDBC、ORM、OXM、JMS和Transactions(事务模块)。

5.Web

Web层包括spring-web、springwebmvc、spring-websocket和spring-webmvc-portlet模块。其中,spring-web模块提供最基础的Web功能,如文件上传、使用Servlet监听器初始化IoC容器以及Web应用上下文功能,同时包含HTTP客户端远程调用功能。

6.Test

spring-test模块支持Spring组件的Junit和TestNG的单元测试和集成测试,spring-test模块提供加载Spring应用上下文并缓存上下文的功能,并且可以通过模拟对象进行隔离测试。

2.1.4Spring项目体系

就项目层级而言,Spring是一个位于顶层的抽象项目,Spring包含了从配置到安全、Web应用到大数据等功能的所有组件或独立项目,帮助开发者实现功能,其中独立的项目有SpringBoot、微服务组件SpringCloud、持久层组件SpringData JDBC层。

Spring架构体系共包含了24个项目类,每个项目都是独立的组件,而Spring Framework则是对Spring 功能的抽象,不具备独立的功能,职责单一。微服务中最常用的有Spring Boot和Spring Cloud,Spring Boot是独立运行的单体项目,而Spring Cloud是微服务聚合项目,包含了微服务所需的组件。

2.2 Spring Cloud

Spring Cloud项目是由多个独立项目集合而成的,每个项目都是独立的,但是Spring Cloud本身并不能独立运行,需要集成到Spring Boot中实现相应的功能。Spring Cloud中的项目各自进行迭代和版本发布,因此Spring Cloud使用版本名称进行版本管理,而不是通过版本号,避免Spring Cloud的版本号与子项目版本号发生冲突。Spring Cloud以英国伦敦地铁站名命名,以字母排序,最初的项目发行版本为Angel,每当Spring Cloud解决严重Bug或更新较多功能时,会发布一个Service Release版本,简称SR,版本号即该大版本下的第一次发布。

2.2.1Spring Cloud与Spring Boot

Spring Cloud提供的工具可以帮助开发者在分布式系统中快速构建一些通用功能,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举和分布式会话等,开发人员可以使用Spring Cloud在分布式系统中快速启动相同模式的服务和应用,在各自的分布环境中独立运行,包括开发者的计算机设备、裸机数据中心和云计算等托管平台,Spring Cloud专注于提供更好的开箱即用的服务。

Spring Cloud是微服务的核心组件之一,为微服务的正常运行提供了重要支持,Spring Cloud是多个独立项目的集合,并且有自己的版本管理机制,当SpringBoot单体服务构建微服务时,需要对应版本的Spring Cloud支持,否则会因为版本不兼容无法启动应用。

 Spring Cloud是多个项目的组合项目,主要的项目有23个

2.2.2Spring Cloud五大组件

分别为注册中心、客户端负载均衡器、断路器、网关和配置中心。

1.注册中心

 注册中心在微服务体系中提供单体服务的注册与发现,注册即单体服务将服务信息(如IP地址)存储到注册中心,注册中心生成该服务的唯一实例;发现即向注册中心注册的服务之间可以相互寻址并进行通信。

2.客户端负载均衡器

客户端负载均衡器是客户端之间调用的负载均衡器,Spring Cloud Ribbon是基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon实现,通过Spring Cloud封装在Eureka注册中心组件中,可以轻松地将服务的REST模版请求自动转换成客户端负载均衡的服务调用。

3.断路器

断路器保护系统,控制故障范围,保证服务高可用。断路器用于解决服务的“雪崩”效应,所谓服务“雪崩”效应,即微服务体系中某个单体服务出现问题无法正常响应时,调用这个服务会出现线程阻塞,若此时有大量的请求进入该故障的服务,Servlet容器中的线程耗尽时,导致服务瘫痪,故障会在微服务相互依赖的单体服务中传播,最终导致整个微服务系统瘫痪。

当服务A不可用,且不可用次数达到阈值(Hystrix为5s 20次)时断路器生效,此时请求服务A会通过fallback方法直接返回一个固定值,避免故障“感染”,切断故障点。

4.网关

服务网关(Zuul)通过反向代理统一管理微服务中所有的服务接口,实现微服务体系中所有服务的接口均通过网关进行转发,即所有的请求向网关发起,然后由网关将请求进行转发。

 5.配置中心

Spring Cloud Config是解决分布式系统配置的方案,包含客户端和服务端两部分,服务端提供配置文件的存储服务,以接口的形式提供配置参数,客户端通过接口获取配置数据初始化项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/52210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15、Django Admin添加自定义字段功能

修改模型类HeroAdmin admin.register(Hero) class HeroAdmin(admin.ModelAdmin):change_list_template "entities/heroes_changelist.html"... # 此处原代码不动,只增加此前后代码def get_urls(self):urls super().get_urls()my_urls [path(immort…

最新版 | SpringBoot3如何自定义starter(面试常考)

文章目录 一、自定义starter介绍二、自定义Starter的好处及优势三、自定义starter应用场景四、自定义starter1、创建autoconfigure的maven工程2、创建starter的maven工程3、在autoconfigure的pom文件中引入MyBatis的所需依赖4、编写自动配置类MyBatisAutoConfiguration5、编写i…

pdf文件编辑器有哪些?分享适合新手用的5个PDF编辑器(解锁教程)

pdf是一种通用文件格式,也是一种夸操作系统平台的文件格式。 好用的PDF文件编辑器可以让您更改和添加文本、编辑图像、添加图形、签署签名、填写表单数据等。下面整理了关于pdf文件编辑方法介绍,以及一些好用的pdf编辑器,有需要的可以了解下…

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStylenone时&#…

LEAN 类型理论之注解(Annotations of LEAN Type Theory)-- 商类型(Quotient Type)

商类型(Quotient Type),也称划分类型,通过给定义一个定义在某一类型 α 上的关系R:α → α→ ℙ,将类型α 中,满足关系R的元素摘出来,组成该商类型(Quotient&#xff09…

2024国赛数学建模C题完整论文:农作物的种植策略

农作物种植策略优化的数学建模研究(完整论文,持续更新,大家持续关注,更新见文末名片 ) 摘要 在本文中,建立了基于整数规划、动态规划、马尔科夫决策过程、不确定性建模、多目标优化、相关性分析、蒙特卡洛…

20:HAL--RNG

一:RNG 伪随机数就是rand函数产生的数。 F1系列的没有RNG,使用本次说的都是F407的,我使用的是STM32F407VET6 B:框架 C:寄存器 /*RNG_SR寄存器的DRDY位*/ while ((__HAL_RNG_GET_FLAG(&rng_handle, RNG_FLAG_DRDY) RESET) …

Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算直方图的反向投影。 cv::calcBackProject 函数计算直方图的反向投影。也就是说,类似于 calcHist,在每个位置 (x, y)…

PostgreSQL的repmgr工具介绍

PostgreSQL的repmgr工具介绍 repmgr(Replication Manager)是一个专为 PostgreSQL 设计的开源工具,用于管理和监控 PostgreSQL 的流复制及实现高可用性。它提供了一组工具和实用程序,简化了 PostgreSQL 复制集群的配置、维护和故障…

CSS解析:定位和层叠上下文

许多开发人员对定位的理解很粗略,如果不完全了解定位,就很容易给自己挖坑。有时候可能会把错误的元素放在其他元素前面,要解决这个问题却没有那么简单。 一般的布局方法是用各种操作来控制文档流的行为。定位则不同:它将元素彻底…

虚幻地形高度图生成及测试

虚幻地形高度图生成及测试 虚幻引擎地形系统将高度数据存储在高度图中,这是一个灰阶图像,使用黑白色值来存储地貌高程。在高度图中,纯黑色值表示最低点,纯白色值表示最高点。支持16位灰阶PNG、8位灰阶r8及16位灰阶r16格式。 本文…

硬刚苹果还得是华为

文|琥珀食酒社 作者 | 璇子 牛皮啊 华为发三折叠不意外 意外的是 这各种翻转简直颠覆想象 市面上没见过这么能“翻转”的? 要不怎么说硬刚苹果 还得看华为 就跟你同天怎么了? 拼创新、拼技术、拼热度 你就说哪比你差吧&#xff1f…

基于VUE的校园二手物品交易管理系统的设计与实现 (含源码+sql+视频导入教程)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于VUE的校园二手物品交易管理系统8拥有两种角色 管理员:闲置物品管理、订单管理、用户管理 用户:登录注册、购物车、发布闲置物品、评论、发货、收货地址管理等…

电力设计院10大排行榜!这个大院屠榜!

今天晚上阅读了中国电力规划设计协会《2022年度电力勘测设计行业统计分析报告》,这本报告是依据协会会员企业统计报表数据进行编制分析的。报告共收集了167家勘测设计企业上报的数据信息,统计的企业数量较2021 年166家企业增加1 家。 按业务板块划分为&…

element ui form 表单出现英文提示的解决方案

场景再现: 在使用 form 表单的时候,一般都需要对表单元素进行验证,错误就出现在了这里,除了配置的错误信息,还会出现一个 英文校验提示,如下图: 解决方案 出现的原因是在el-form-item中使用…

Tensorflow2 如何扩展现有数据集(缩放、随机旋转、水平翻转、平移等),从而提高模型的准确率 -- Tensorflow自学笔记14

实际生活中的数据集,往往不是标准的数据,而是有倾斜角度、有旋转、有偏移的数据,为了提高数据集的真实性,提高模型预测的准确率,可以用ImageDataGenerator函数来扩展数据集 import tensorflow as tffrom tensorflow.k…

(二)ASP.NET Core WebAPI项目的启动地址设置

上一篇介绍了ASP.NET Core WebAPI项目创建,可参考: 1.webAPI的访问地址 1) 启动时,选择CoreWebAPI(项目名称)运行项目 可以看到打开浏览器后的地址是:applicationUrl"\"launchUrl 2) 启动时,选择IIS Expre…

Ansys Zemax | 在OpticStudio中仿真单模光纤耦合

附件下载 联系工作人员获取附件 准确分析耦合效率在光纤耦合系统的设计中至关重要。本文演示了如何在OpticStudio中使用多种光纤耦合效率分析。 概要 OpticStudio序列模式可以很好地模拟单模光纤耦合效率。本文演示了如何设置耦合系统,并研究了序列模式下可用于…

redis分布式锁和lua脚本

业务场景:多个线程对共同资源的访问:库存超卖/用户重复下单的原因 解决方法一:利用jvm内置锁,将非原子性操作变成原子性操作 Synchronized锁的是对象,对象必须是单例的。锁的是this,代表当前所在的类,这个…

RabbitMQ 基础架构流程 数据隔离 创建用户

介绍 publisher:消息发送者-exchange:交换机,复制路由的消息-queue:队列,存储消息consumer:消息的消费者 工作流程 publisher消息发送者 -> exchange 交换机 -> queue 队列 -> consumer 消息的消…