屬性 | 資訊 |
---|---|
文檔名稱 | 應用架構的發展趨勢 |
版本号 | 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自己對軟體架構的定義:“軟體系統架構是根據具有參考意義的實踐而定義出來的。主要表述了有一個系統的基本組織結構、基本組成構件和互相的關系,以及構件于外部環境間的關系。同時,軟體系統架構為後續的設計和架構演化提供了指導性原則”。
本文與《設計模式及實踐》目錄結構一緻,主要闡述如下的幾種應用架構風格。
![]()
應用架構的發展趨勢文檔修改日志1 簡介2 應用架構的含義3 應用架構的分類
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号