Java架构文档

1、    整体架构

1.1          、Java的IDE(集成开发环境):Eclipse,优点,免费,开源,市场占有率高

1.2          、Web Server:Tomcat,轻量,免费,开源,市场占有率高

1.3          、生产环境服务器操作系统:CentOS,免费,开源,市场占有率高

1.4          、数据库:MySql和SQL Server

1.5          、反向代理:nginx

1.6          、消息队列:RabbitMQ

1.7          、软负载均衡:LVS

2、    Java开发框架

2           

2.1          、 MVC框架:Spring MVC

2.2          、数据访问及ORM框架:MyBatis,实现功能,数据访问及ORM映射

2.3          、数据库的跨库查询:java的数据库访问模块jdbc本身就可以通过配置文件中驱动类型来访问数据库,想访问或切换到不同的数据库服务器上面时,都需要修改配置文件便可,不用修改代码。SQL Server驱动:com.microsoft.sqlserver.jdbc.SQLServerDriver,MySQL驱动:com.mysql.jdbc.Driver

2.4          、日志系统:Log4j,实现功能,日志输出,日志异步输出

2.5          、统一异常处理:Spring MVC的拦截器功能

2.6          、统一认证:Spring MVC的拦截器功能

2.7          、AOP功能及利用AOP功能实现各个方法的性能分析:Spring中的AOP功能,实现上是利用AspectJ组件来实现的。咱们自己开发,通过在Spring的AOP功能中的通知事件中增加运行时间消耗的逻辑,然后发送到统一打点性能分析平台中,实现各个方法或接口时间消耗分析

2.8          、配置

Java中提供了web.xml和property文件用于存储配置信息,其中web.xml文件存放的是结构化的配置信息,而property文件中存放的是key-value格式的配置信息。他们的数据在系统启动时,会被放到内存中,这样程序在读取数据时,直接从内存中读取便可,可以减少每次从硬盘上读取文件发生IO吞吐操作。但缺点是如果配置文件发生修改之后,需要开发人员或运维人员手动重启Tomcat服务器,新修改的配置文件才会生效。

真正专业的做法是,在系统启动时,将这些配置信息读取到系统缓存中,并且启动文件监听线程来监听配置文件的lastModifyTime属性是否发生改变,如果发生改变,则程序主动清除缓存的配置信息,并再次从本地文件中读取新的配置信息进行缓存。这样即免去手动重启Tomcat的麻烦,也免去了重启Tomcat这一段时间内,对在线用户的影响。

3、    Java开发框架详解

3           

3.1          、java中几个主要概念的讲解

Bean:类

Servlet:类似于asp.net MVC中的Controller或asp.net WebForm中的*.aspx.cs文件

Jsp类似于asp.net MVC中.mhtml文件或asp.net WebForm中的*.aspx文件

3.2          、Servlet过滤器(Filter),Servlet过滤器Filter,类似于asp.net的httpModule或asp.net MVC中的过滤器一样

用于实现统一的异常捕获或统一的用户登录状态检查。

Servlet过滤器Filter的适合场景举例:

Servlet过滤器filter的部署和配置,在web.xml中的

3.3          、SpringMVC 拦截器方法

SpringMVC拦截器的实现原理和用途,统一的异常处理:

(一) SpringMVC拦截器实际上基于Java的过滤器功能来实现的,说的简单一点,就是在java过滤器功能上包了一层。

(二) SpringMVC单个Controller或Handler统一处理异常方式,HandlerExceptionResolver,

这个不用做任何配置,只是写一个异常处理方法,这个方法的注解为:

@ExceptionHandler,

(备注但这种方式只能处理当前Handler或Controller中所有方法的异常,但并不是系统全局及的,即它不会处理别的Handler或Controller中方法的异常)

         Spring MVC的异常处理方法优先级的问题?

这个是根据异常类型来匹配的,如果有2个异常处理方法,其中异常类型一个是ArithmentException.class,一个是RuntimeException.class,如果真正的业务方法抛出了一个ArithmentException类型的异常,则会先匹配到ArithementException类型的异常处理方法,如果匹配不到ArithmentException类型的异常处理方法,则会继续匹配别的异常类型处理方法,如RuntimeException类型异常处理方法。这实际跟.net异常处理逻辑匹配是完全一样的。

举例:

        public int TestException(int number)

        {

            try

            {

                //业务逻辑

            }

            catch (ArithmeticException ex)

            {

                //捕获ArithmeticException类型异常

            }

            catch (Exception ex)

            {

                //捕获所有类型异常

            }

        }

(三)      Spring MVC全局异常处理方式

新建一个类,这个类专门用于处理系统所有异常

在类上面标记注解:@ControllerAdvice,则这个类中的包含@ExceptionHandler注解的方法,会处理整个系统中所有的异常。示例如下:

(四)      关于SpringMVC 中Controller中异常处理和全局异常处理优先级的问题.

SpringMVC会先在出异常的当前Controller中查找含有@ExceptionHandler的方法,如果找不到则会找注解为@ControllerAdvice的类中的异常处理方法。

关于异常的传播,SpringMVC的异常处理程序一旦匹配到合适的异常处理方法,则不会再往上继续传播异常了。所以一个异常只会被一个方法处理,不会被多个方法处理。

(五)      多个拦截器方法执行顺序.

(六) 同异常类型有对应的异常视图,异常和异常处理视图的简单映射

下面的配置就表示发生ArrayIndexOutOfBoundException发生时,会跳转到error这个页面上面去。

3.4          、Java监听器

监听服务器启动和关闭事件,类似于asp.net中global.asax中Application_Start和Application_end事件。一般适用于服务器启动时,可以做一些配置文件初始化,或者记录一些启动日志这种功能。

具体使用方法和Filter过滤器一样,也是继承ServletContextListener接口,然后在web.xml中配置listener配置项。

3.5          、Java中Http调用远程Url地址,并获取返回Json数据

3.6          、Json序列化器:FastJson或JackJson

3.7          、OpenAPI接口的开发

开发asp.net中的OpenAPI接口,这边直接用Servlet就可以实现,或者Spring MVC里面RequestMapping来实现。

Controller方法返回json对象

1、  先引用jackson的jar包。

2、在方法上面加上@ResponseBody注解

3、方法返回类型为对象或者对象集合

个人觉得OpenAPI和原来早期的ashx文件接口的区别就是OpenAPI是符合Rest风格的接口,

什么是Rest风格的接口呢,下面就是一个示例。

3.8          、Jsp标签

jsp标签类似于asp.net中的自定义控件。你可以把客户端的html元素或者js代码封装在jsp标签中,然后在jsp页面中调用jsp标签。标签继承TagSuppurt类。这样做的好处就是将客户端通用和复杂的功能封装在标签中,实用前端功能的复用。

3.9          、JDBC介绍

JDBC跟asp.net中的ado.net模块功能一样,是用于访问数据库,执行Sql语句,将sql语句查询结果的DataSet返回给客户端。

读取配置文件

调用数据库操作,其中PreparedStatement和Statement相比,可以防止SQL注入式攻击。数值占位符是?号,注意PreparedStatement设置占位符的值时,序号是从1开始。

3.10       、网页语言编码

网页语言编码应该设置为UTF-8,这个是包含所有文字编码的,否则容易出现乱码问题。

3.11       、Spring AOP介绍

Spring官网http://spring.io/

Spring是基于2个思想来做的

IoC: Inverse of Control  控制反转,所谓控制反转,就是将new这个动作,从具体的代码中改到配置中,后来有人觉得IoC概念太模糊,不知所云,于是提出了DI(Dependency Injection),依赖注入,2者是完全相同的,完全等价的。

AOP(Aspect-oriented Programming)面向方面的编程,

OOP(Object-oriented Programming)面向对象的编程,

AOP框架:

上面注解中写明了是ArithmeticCalculator接口的add方法中加入注解,如果想在接口每个方法都加入注解,则需要将方法名称修改为*号就行了,如下面:

下面是配置,有了配置之后,上面横切代码才会生效

AOP切片事件的顺序

多个AOP切片类的优先级问题,根据AOP切片类的Order类中的序号来定,序号是从小到大排序,值越小,优先级越高。

3.12       、基于Spring AOP开发性能监控程序的本身性能问题解决

1、 AOP在对方法进行切片操作时,如果是普通的实例化方式(即new的方式)的话,会产生10%,甚至可能更多的性能损耗,可以在AOP的方法中,修改切片对象的实例化方式为单例模式(Single Instance),这样就没有性能损耗了,原理上也是这样的,你用单例模式调用一个方法,然后在那个方法执行前和执行后分别加上一个timespan用于记时,这其实是没什么性能损耗的。但要注意,自己要进行AOP切片的对象,必须是要支持单例的,否则会出错。

2、另外在AOP的after方法记录日志的时候,也有性能问题要注意,如果after事件中记录日志是同步记录日志,则记录日志完成之后,当前方法才会返回,这样如果记录日志数据量大,或者比较慢的时候,会导致当前方法的执行非常耗时,可以将记录日志的方法改为异步,即将日志数据保存到内存堆中,然后当前后台有线程单独会将这些日志慢慢写到日志配置中指定的输出目标中。

3、性能日志平台的展示和分析平台。有现成的图表展示平台,我们在第2步输出日志时,只需要将日志输出到这个平台的接口中,就可以利用这个平台来查看和分析各个切片方法的性能损耗数据了,然后也可以在后台做一些统计和计算,这样可以展示更复杂的报表数据了,像整体消耗对比分析,平均每5分钟总耗时统计个数啥的。

3.13       、Spring MVC 框架的安装

Prefix:前缀,字首

Suffix:后缀

3.14       、Spring MVC Url路由和Pojo的用法

3.15       、Spring MVC 页面的开发及jsp标签的使用

列表页面:

3.16       、Spring MVC 数据格式化

数据格式化,凡是加上下面格式化器这种标记的属性,在界面上显示是会根据格式化器的格式进行显示。

利用FormattingConversionService实现类,则即可以实现数据显示格式化,又可以实现类型转换。

3.17       、JSR303数据校验

JSR303验证结果显示:

在控件后面加一个Form:errors控件,该控件的path=要验证控件的名字

猜你喜欢

转载自my.oschina.net/architectliuyuanyuan/blog/1622745