性能文件的炼金术-Spring-性能容器化时代完美的食谱 (性能型文件存储采用什么类型的存储介质)
前言
基于现代服务的云原生十二要素通常,咱们在驳回容器化部署时,要保证同一个镜像可以满足不同环境的部署要求,而不是不同环境打包不同的现象。本文档关键引见一种基于spring框架的满足不同环境性能的编译打包打算,满足同一个镜像可以在环境分组下经过启动项性能成功不同环境的部署。
现有打算及疑问
咱们见过最经常出现的性能文件治理打算,是基于Maven的profile性能来成功多环境切换的,它的弊病在于,咱们将profile性能在pom.xml中,每次编译打包时,须要经过编译指令-P来标识以后环境性能。这样造成的疑问是,咱们打包的镜像具有了环境属性,不合乎一个镜像多环境部署的要求。
还有一种性能打算,就是基于Springprofile启动性能文件治理。针对这两种打算,我接上去会启动一些剖析和对比。
两种profiles性能的不同和优劣对比
a.两种profiles打算对比
1.Maven的profiles:
◦Maven的profiles是在构建时依据环境或其余条件激活不同的性能汇合。可以在名目标pom.xml文件中定义多个profile,并经常使用Maven命令行参数或其余性能来激活特定的profile。
◦长处:
▪灵敏性高,可以依据不同的构建环境或条件激活不同的profile。
▪可以在构建环节中经常使用不同的依赖、插件性能等。
◦劣势:
▪性能相对扩散,须要在Maven的pom.xml文件中定义和治理多个profile。
▪性能与代码分别,不够直观。
2.Spring的lication.properties的profile性能:
◦Spring的application.properties文件可以依据激活的profile来加载不同的性能。可以在application.properties文件中定义多个profile下的性能,并经常使用性能文件或环境变量来激活特定的profile。
◦长处:
▪性能集中,可以在一个文件中定义多个profile下的性能,更易于治理和保养。
▪性能与代码相近,更直观易读。
◦劣势:
▪激活profile的模式相对有限,通常须要经过性能文件或环境变量来指定。
▪不实用于构建环节中的性能,关键用于运行程序的运转性能。
总的来说,Mavenprofiles更实用于构建环节中的性能,可以依据构建环境或条件激活不同的profile,而Spring的application.properties的profile性能更实用于运行程序的运转性能,可以依据不同的profile加载不同的性能。详细选用哪种模式取决于你的需求和偏好。
b.在云原生和容器化的部署场景剖析
在云原生和容器化的部署场景下,我更偏差经常使用Spring的application.properties的profile性能模式。
以下是在云原生和容器化部署场景下,经常使用application.properties的profile性能模式的长处:
综上所述,经常使用Spring的application.properties的profile性能模式更适宜云原生和容器化的部署场景,由于它提供了环境有关性、性能集中化和容器友好性的长处。
基于properties的多环境性能打算通常
以下打算以springboot为例,当然springMVC打算也是可以适配,只是须要额外性能一下,介于咱们新名目基本都是基于springboot搭建,此处不开展springMVC的实线打算,如有须要,我再额外提供mvc的性能打算。
a.性能文件树
如上图所示
详细行云部署里的性能如下:
b.properties文件加载
反常状况下,properties/**/*.properties下的性能文件是不会智能加载到启动项里的。所以须要经过额外的模式灵活加载,详细方法是经过spring框架下的PropertySourcesPlaceholderConfigurer的类属性,联合环境变量,灵活批量加载性能文件。( 额外说明,假设是springMVC框架,也可以经过xml性能context:property-placeholder属性来成功。 )
详细代码如下:
*性能文件环境性能
*@Authorzhaoyongping
*@date2023/7/1015:13
*@ClassNameEnvPropertiesConfig
*@Descripiton性能文件环境性能
@Configuration
publicclassEnvPropertiesConfig{
*加载属性性能
*@paramenvironment环境属性
*@returnPropertySourcesPlaceholderConfigurer
*@authorzhaoyongping
*@date2023/7/1015:13
*@description加载属性性能
publicstaticPropertySourcesPlaceholderConfigurerpropertySourcesPlaceholderConfig(Environmentenvironment)throwsIOException{
PropertySourcesPlaceholderConfigurerconfig=newPropertySourcesPlaceholderConfigurer();
String[]activeProfiles=environment.getActiveProfiles();
if(activeProfiles.length>0){
+environment.getActiveProfiles()[0]+"/*.properties";
config.setLocations(
newPathMatchingResourcePatternResolver().getResources(resourceUrl));
//兜底战略
config.setLocations(
newPathMatchingResourcePatternResolver()
.getResources("classpath:properties/dev/*.properties"));
returnconfig;
总结
经过以上步骤,咱们可以成功编译打包镜像不须要跟环境变量绑定,而只有要在启动运转时基于不同的分组灵活性能的applicton.properties文件,来成功不同环境的适配。这种可以在运转时变卦性能文件的机制,更适宜在云原生时代下的容器化部署打算,也利于咱们的服务的可移植性。当然,以上只是笔者团体的一个通常阅历,并不能代表它是最优通常打算。
Spring功能总结
1 什么是spring ?Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架的设计思想是,单例模式和工厂模式2 spring的四大特点(优点)轻量级,低侵入的设计Spring的DI机制降低了业务对象替换的复杂性spring不依赖于web容器,独立于各种应用服务器, Write Once,Run Anywhere(一次编译到处运行)高度开放性:Spring并不完全依赖于Spring,开发者可自由选用Spring框架的部分或全部,它的架构仍然是内在稳定的3 spring的组成部分 七大模块Spring Core:Spring的基石,提供了Spring的最主要的核心机制:控制反转和依赖注入Spring Context:提供了Spring的上下文信息,如:国际化,验证等Spring Web支持:简化了处理多部分请求Spring MVC框架支持:一个全功能的构建 Web 应用程序的 MVC 实现,MVC 容纳了大量视图技术,其中包括 JSP、Velocity等。 Spring Dao支持:Spring的Dao支持大大的简化了JDBC操作数据库所带来的繁琐Spring ORM支持 pring框架集成了若干ORM框架,从而提供了ORM的对象关系工具,其中包括 JDO、Hibernate、iBatis和TopLink。 所有这些都遵从Spring的通用事务和DAO异常层结构。 Spring AOP:面向方面编程,提供了事务,日志,权限,安全等处理机制4 spring的核心机制 1).控制反转(IoC/Inverse Of Control):调用者不再创建被调用者的实例,由spring框架实现(容器创建)所以称为控制反转。 2).依赖注入(DI/Dependence injection) :容器创建创建好实例后再注入调用者称为依赖注入。 什么是ioc容器bean工厂(BeanFactory) 和 应用上下文(Application Context)依赖注入的优点,代码将更加清晰,Spring管理bean的灵巧性,bean与bean之间的依赖关系放在配置文件里组织,不再担心对象之间的依赖关系之后,实现更高层次的松耦合将易如反掌依赖注入的方式 (为什么叫依赖注入 类的四种关系)(1)set注入(2)构造注入(3)lookup方法注入spring 对dao的支持<1>dao模式优点减少开发代码量 提高工作效率降低系统资源消耗 提高系统性能业务逻辑层与持久层(数据层)的分离,使数据与操作更为清晰。 数据访问独立到了一层,修改具体实现类,不影响系统的架构运行<2>DAO模式的四个组件DAO接口DAO接口实现类pojo值对象DAO实例的定位(工厂 或 spring注入)Spring 面向方面编程(AOP) spring支持AOP功能,AspectJ更完美的支持AOPAOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中, 将系统中通用的需求功能隔离出来形成一个功能模块,并将这个模块切入到应用程序当中, AOP追求的是调用者与被调用者的解耦,从而消除了OOP引起的代码混乱和分散问题,增强了系统的可维护性和代码的重用性方面:哪方面 系统中分为业务方面的和非业务方面Spring主要集中于非业务方面 如(日志、事务、安全、权限等)1.面向方面与面向切面:AOP的实现中的几个重要的概念:1.1如果理解为“面向方面编程”:针对于某一模块进行专门的编写(如:面向日志编程,面向事务编程,面向权限等),其意思就是说面向具体的某个功能模块来编程,然后将其切入到项目中1.2如果理解为“面向切面编程”:连接点:程序执行过程中明确的点,如方法的调用或者异常的抛出,举个例子,如果是一个权限系统的话,要控制到类中的某一个具体的方法,那么这个方法就是一个连接点切入点:连接点的集合,如类中多个个方法的调用, 还是以权限系统来举例,如果要控制一个类中的多个方法的话,那么这几个方法(也即是几个连接点)组成了一个切入点切面:如果要控制多个类中的多个方法,那么这多个类就组成了一个切面连接点 --- 切入点 ---- 切面(三者之间的关系可以形象的理解为:点--线--面)引入(Introduction):添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。 例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。 AOP实现过程中的几种不同的方式: 拦截一类中所有的方法(连接点)拦截一个类中的某些符合条件的方法(切入点)拦截多个类中的符合条件的方法(切面)2.1.连接点 --- 切入点 ---- 切面 --- 方面(解决方案的切入点)2.2.目标对象(也就是:寻找被处理的类)代理(具体实现),分为二种,JDK动态代理(面向接口)Cglib代理(面向具体类)2.4.处理(Spring AOP处理)或者叫通知,aop框架在特定的连接点执行的动作,Spring提供了五种处理方式2.5 Advisor=(处理+切入点)4 利用aop进行事务编程Spring事务配置的五种方式 (掌握Spring事务体系图)传统上,J2EE开发者有两个事务管理的选择: 全局 或 本地事务(局部事务)。 全局事务由应用服务器管理,使用JTA。 局部事务是和资源相关的,比如一个和JDBC连接关联的事务事务种类分为: jdbc事务(局部事务) jta事务(全局事务) 容器事务1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。 局部事务2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。 全局事务3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用两种事务的比较 1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。 2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂13.2Spring与Struts2的整合由于Struts2得强大可插拔式设计,使得整合spring的工作变得异常简单,就是支持spring的插件包把struts2支持spring的插件包jar拷贝到项目中
Java工程师以后发展路径是什么?
最近有些网友问我如何自学 Java 后端,还有些是想从别的方向想转过来,但都不太了解 Java 后端究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java 后端技术等等,导致想学,但又很迷茫,不知从何下手。我就以过来人的经历,写在这篇博客里,不一定都对,但都是我根据自己的经历总结出来的,供你们的参考。
Java 基础
Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装、继承、多态。此外还有泛型、反射的特性,很多框架的技术都依赖它,比如 Spring 核心的 Ioc 和 AOP,都用到了反射,而且 Java 自身的动态代理也是利用反射实现的,这里我特意写了一篇Java动态代理原理分析。此外还有 Java 一些标准库也是非常常见,比如集合、I/O、并发,几乎在 Web 开发中无处不在,也是面试经常会被问到的,所以在自学 Java 后端之前,不妨先打好这些基础,另外还有 Java8 的一些新特性,也要重点关注,比如 Lambda 表达式、集合的 Stream 流操作、全新的 Date API 等等,关于新特性,我也写了几篇关于这方面的博客,请自行找吧,就不贴出来了。
关于书籍推荐,我是不建议初学者一开始就拿着「Java 编程思想」啃的,因为当初我就是那个当天下午决定自学 Java,晚上就抱着这本书啃的人,说实话,我当时真的不懂它在说啥,因为我没有一点的面向对象语言编程的基础,而这本书又写得太博大精深了,在当时的我来说,完全是天书,但是我认为它仍然是 Java 界的圣经,每读一次都有所收获。我在这里推荐你们一开始先看「Java 核心技术」,这本书讲得比较通俗易懂,初学者比较能接受。
关于视频推荐,我当初就是听某客的毕向东老师讲的 Java 基础教程,毕老师讲的实在是太生动有趣了,不知不觉把我带进 Java 的坑里无法自拔,有时候我会听他视频时笑出声来,也许是我那段自学阶段最有趣的时刻了。
数据库
关于 sql 方面:SQL 教程、MySQL 教程
我是了解了一些基础语法之后,就直接跟着视频的老师做一些表操作实战练习了,比如单表查询、多表查询等。我建议学 sql 切勿眼高手低,需多加练习,不要只看懂了就行,因为工作中写得一手简练的 sql 是非常重要的。在这里我说下我在项目一直秉承着 sql 语句是能避免多表查询就避免多表查询,能够分开多条语句就分开多条语句,因为这里涉及到多表查询性能和数据库扩展的问题。
关于 JDBC 方面:JDBC 教程、JDBC 获取连接对象源码分析
你需要弄懂 JDBC API 的用法,其实它只是一组规范接口,所有数据库驱动只要实现了 JDBC,那么我们就可以通过标准的 API 调用相应的驱动,完全不用知道驱动是怎么实现的,这就是面向接口编程的好处。而且对于 JDBC 我是直接看视频去理解的,跟着视频做了一个基于 Apache Dbutils 工具做了一个具有事务性的小工具,我特意用思维导图总结了一下:
Web 基础
曾经开源中国创始人红薯写了一篇文章「初学 Java Web 开发,请远离各种框架,从 Servlet 开发」,我觉得他说的太对了,在如今 Java 开发中,很多开发者只知道怎么使用框架,但根本不懂 Web 的一些知识点,其实框架很多,但都基本是一个套路,所以在你学习任何框架前,请把 Web 基础打好,把 Web 基础打好了,看框架真的是如鱼得水。
关于 Http 协议,这篇文章就写得很清楚:Http协议
关于 Web 基础这方面数据推荐,我当时是看的是「Tomcat 与 Java Web 开发技术详解」,很详细地讲解了整个 Java Web 开发的技术知识点,但现在看来,我觉得里面讲的有一些技术确实有点老旧了,不过可以了解一下 Java Web 开发的历史也是不错的。所以在 Web 基础这方面我都是看某客的崔老师讲的「超全面 Java Web 视频教程」,讲得很详细很生动,还有实战项目!
关于 JSP,你只要了解它其实就是一个 Servlet 就行了,关于它的一些标签用法,我认为可以直接忽略,因为现在互联网几乎没哪间公司还用 JSP,除了一些老旧的项目。现在都是流行前后端分离,单页应用,后端只做 API 接口的时代了,所以时间宝贵,把这些时间重点放在 Servlet 规范上面吧。
关于 Tomcat,它是一个 Web 容器,我们写的后端项目都要部署到Web容器才能运行,它其实是一个遵循 Http,通过 Socket 通信与客户端进行交互的服务端程序:Tomcat结构及处理请求过程
Web 主流框架
Java Web 框架多如牛毛,等你有一定经验了,你也可以写一个 Web 框架,网上很多说 Spring、Struts2、Hibernate 是 Java 三架马车,我只想说,那是很久远的事情了,我严重不推荐 Struts2、Hibernate,相信我,一开始只需要上手 Spring、SpringMVC、Mybatis 就可以了,特别是 Spring 框架,其实 Spring 家族的框架都是很不错的。
但是提醒一点就是,千万不要沉迷于各种框架不能自拔,以会多种用法而沾沾自喜,导致知其然而不知其所以然。
Spring其核心思想就是 IOC 和 AOP:
谈谈对 Spring IOC 的理解
Spring 面向切面编程
SpringMVC 它的思想是全部请求统一用一个 Servlet 去做请求转发与控制,这个 Servlet 叫 DispatcherServlet:
SpringMVC 初始化过程
SpringMVC 处理请求过程
Mybatis 它可实现动态拼装 sql,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集:
mybatis 入门教程
Mybatis 深入浅出系列
Web 框架进阶
使用了 SSM 框架后,你会觉得框架也不过这么回事,如果你对 Spring 有过大概了解,你也会产生想写一个「山寨版」Spring 的心思了,一个轻量级 Web 框架主要具备以下功能:
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。