应用架构的发展趋势
属性 | 信息 |
---|---|
文档名称 | 应用架构的发展趋势 |
版本号 | V0.0.0.0 |
文档修改日志
修改时间 | 修改人 | 修改描述 | 版本号 |
---|---|---|---|
2019-12-29 15:23 | 宋全恒 | 新建应用架构的发展趋势 | V0.0.0.0 |
1 简介
辛格的这本《Java设计模式及实践》是在11月28日看完的,三类设计模式、7大设计模式原则都在本书进行了阐述,自己也通过博客的输出尝试着及时的重复和强化关于这本书的记忆,总结博客的目的就是为了对这些材料能够强化记忆,在《高效记忆法》中,提高记忆效率的条件如下:
并且,记忆策略的主要原则如下图所示:
通过不断的总结,翻书页,目的很明确,就是不断的增强自己的知识基础,并且提高兴趣,因为人越是感兴趣的东西,注意力程度就会越高,在程序员写个人技术博客的价值与意义博文中,作者对于技术人员撰写博客的意义是如下阐述的:
确实,通过不断的在自己的专业领域深耕细作,不断加深对于技术的认识和理解,自己确实在这样的实践过程中取得了不少的进步,因此,写博客这个行为自己会坚持实践,并且在即将到来的2020年,自己要坚持每周输出两篇博客。自己会做到的。
2 应用架构的含义
开发应用程序之前,首先要确定的是要使用的架构设计。本文主要是对《设计模式及实践》第8章应用架构的梳理。应用架构(Software Architecture)在辛格认为,是在开发应用程序时,首先会有一系列的需求,设计出可以满足所有需求的解决方案,这种设计方案就叫做应用程序架构,架构不仅仅要关注当前的需求,还应该将未来预期变化考虑在内。软件架构的定义还有如下的内容:
软件架构代表了系统的组织结构。这包括将系统分解为不同的部分、界定它们之间的连接、确定它们之间的交换机制、并且为后续的设计提供指导性的原则。
IEEE在2004年4月公布的“IEEE Standard 1471”中,提出了IEEE自己对软件架构的定义:“软件系统架构是根据具有参考意义的实践而定义出来的。主要表述了有一个系统的基本组织结构、基本组成构件和互相的关系,以及构件于外部环境间的关系。同时,软件系统架构为后续的设计和架构演化提供了指导性原则”。
本文与《设计模式及实践》目录结构一致,主要阐述如下的几种应用架构风格。
3 应用架构的分类
3.1 分层架构
尝试将代码和实现划分为不同的曾,使每个层都有固定的职责,没有一种固定的分层方式可以适合所有项目,一个常见的web应用分层体系架构如下图所示:
分层架构的主要内容如下所示:
五层架构的内容如下:
3.2 MVC架构
顾名思义,将应用程序分为三个部分:模型、视图、控制器。
3.2.1 模型
模型:模型是数据的表示形式。数据是任何应用的关键部分,模型层负责组织和实现用以管理和修改数据的逻辑,它会处理在数据被修改时所能发生的任何事件,简而言之,模型实现了核心业务。
3.2.2 视图
视图:应用中的另一个重要部分是视图,即与终端用户交互的部分。视图负责向终端用户展示信息并从用户获取输入,该层需要确保终端用户能够获得预期的功能。
3.2.3 控制器
控制器:控制器主要用于控制流。当视图上发生某些操作时,它会通知控制器,然后控制器确定这项活动是否会反过来作用于模型和视图。
3.2.4 交互
3.2.5 工作流程
- Spring MVC遵循前端控制器模式,意味着所有请求最初都必须流经定都servlet
- 前端控制器将请求传递给用于处理特定请求的控制器。
- 控制器基于请求更新模型,并将模型返回。
- 框架选择用于处理当前请求的视图并将模型传递给它。
- 视图(通常是JSP页面)根据提供的模型呈现数据。
- 最终响应(通常是HTML页面)被发送回呼叫代理或浏览器。
3.2.6 实践
3.2.6.1 web.xml
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.employee.config.EmployeeConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/mvc/*</url-pattern>
</servlet-mapping>
</web-app>
告诉web.xml所有带/mvn/pattern的请求都会被重定向到前端控制器,即Spring MVC
de DispatcherServlet,其中也确定了配置文件EmployeeConfig的内容。
3.2.6.2 init-param
package com.employee.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.employee.*")
/**
* The main Configuration class file.
*/
public class EmployeeConfig {
@Bean
/**
* Configuration for view resolver
*/
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/pages/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
告诉应用程序索要使用Web MVC框架以及组件的位置。通过视图解析器通知应用程序视图的位置和格式。
3.2.6.3 控制器
package com.employee.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.employee.dal.EmployeeDAL;
import com.employee.model.Employee;
@Controller
@RequestMapping("/employees")
/**
* This class implements controller for Employee Entity
*/
public class EmployeeController {
/**
* This method returns view to display all the employees in the system.
*
* @return Employee List
* @throws ServletException
* @throws IOException
*/
@RequestMapping(method = RequestMethod.GET, value = "/")
public ModelAndView getEmployeeList(ModelAndView modelView) throws ServletException, IOException {
List<Employee> empList = new ArrayList<Employee>();
EmployeeDAL empDAL = new EmployeeDAL();
empList = empDAL.getEmployeeList();
modelView.addObject("employeeList", empList);
modelView.setViewName("employees");
return modelView;
}
}
可以看到该控制器以模型的形式(ModelAndView modelView)获取数据,并向应用程序告知当前请求的视图,返回包含有关视图和模型的信息的ModelAndView对象。控制器会把它传递给视图
3.2.6.4 视图
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN" “http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content= text/html; charset=UTF-8">
<title>Welcome to Spring</title>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
</head>
<body>
<table>
<th>Name</th>
<th>Email</th>
<th>Address</th>
<th>Telephone</th>
<th>Action</th>
<c:forEach var="employee" items="${employeeList}">
<tr>
<td>${employee.id}</td>
<td>${employee.name}</td>
<td>${employee.designation}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
上述JSP的功能就是创建一个表格形式显示员工详细信息的HTML。
3.3 面向服务架构
SOA(Service Oriented Architecture)“面向服务的架构”:他是一种设计方法,其中包含多个服务, 服务之间通过相互依赖最终提供一系列的功能。一个服务通常以独立的形式存在于操作系统进程中。各个服务之间通过网络调用。
当讨论面向服务的架构时,主要讨论的内容就是应用程序的各种服务和可重用单元。将一个应用程序划分为10个独立服务,架构的复杂度降低了是对,团队也化成10个部分,维护较小的团队更容易。
3.3.1 面向服务架构示例
SOA在员工管理系统的结构如下:
面向服务架构主要有如下的内容:
ESB的架构如下:
ESB(企业服务总线),简单 来说 ESB 就是一根管道,用来连接各个服务节点。为了集 成不同系统,不同协议的服务,ESB 做了消息的转化解释和路由工作,让不同的服务互联互通;由图可以看到ESB角色作用类似于中介者模式。
3.4 微服务架构
微服务架构:其实和 SOA 架构类似,微服务是在 SOA 上做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。
微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想
基于微服务的架构建议将服务划分为细粒度级别,相较于SOA而言,微服务概念的一个重要区别时每个微服务可以进行独立的测试和部署。
3.4.1 基本内容
3.4.2 特征
3.4.3 挑战
3.5 无服务架构
无论是分层架构、三层架构、SOA或者微服务都是依赖于基础设施的。设计应用程序时需要考虑系统如何扩展或缩小,如何满足系统的性能需求,如何部署服务,需要多少实例和服务,应用程序的容量是多少等。但现在早已从硬件部署转向了基于云的部署。另一个重要的原因是基础设施的资源浪费或者过度使用。
无服务部署,它以服务的方式提供基础设施资源,其主旨是开发团队只需要关注代码,云服务提供商负责应用程序的基础设施需求,包括对资源的扩展。
只需要为使用的资源进行支付;无需实现对任何基础设施容量提出要求;服务提供商负责扩展所需的计算能力。
3.5.1 基本内容
4 总结
通过本文的阅读,读者可以了解正在软件开发界流行的应用架构体系,由于在实际工作中并没有固定的规则,因此还是需要开发人员随机应变,根据当前的问题进行架构的定制。在阅读过程中,虽然MVC模式之前自己从来没有接触过(笔者开始Java开发时直接使用的分层架构),自己理解了Spring MVC的工作流程,还是不错的。
中午来到单位也完成了对《高效记忆法》中掌握时间节奏,
2019-12-29 18:32 于马塍路36号