一、 Nginx: 項目網關與流量調度
核心原理
反向代理 (Reverse Proxy):
在Web架構中,Nginx作為系統的統一入口(API網關),接收所有外部客戶端請求。它通過解析請求的URL路徑(location指令),判斷請求的意圖,然后將請求路由到正確的內部后端微服務。這些后端服務運行在各自的端口上,不直接對公網暴露。此模式增強了系統的安全性,并為日志、監控、權限等提供了統一的管理層面。
負載均衡 (Load Balancing):
對于高流量服務,單實例存在性能瓶頸和單點故障風險。負載均衡機制通過upstream指令定義一個由多個相同服務實例組成的服務器集群。當請求被路由到此集群時,Nginx會根據預設策略(如加權輪詢)選擇一個實例處理請求。這實現了請求壓力的分攤,保證了服務的高可用性和水平擴展能力。
Nginx
upstream webservers {server 127.0.0.1:8080 weight=90;#server 127.0.0.1:8088 weight=10;
}server {listen 80;server_name localhost;location /api/ {proxy_pass http://localhost:8080/admin/;}location /user/ {proxy_pass http://webservers/user/;}
}
upstream webservers { ... }
此代碼塊定義了一個名為 webservers 的后端服務器集群,用于實現負載均衡。其中server指令定義了集群內的成員。當前配置中,127.0.0.1:8080服務器是主要的工作節點,權重為90,而127.0.0.1:8088服務器則被注釋,處于非活動狀態。
location /api/ { ... }
此代碼塊定義了針對后臺管理端請求的路由規則。它匹配所有以/api/開頭的URL,并通過proxy_pass指令,將這些請求以反向代理的方式轉發給運行在localhost:8080端口的后端管理服務。
location /user/ { ... }
此代碼塊定義了針對小程序用戶端請求的路由規則。它匹配所有以/user/開頭的URL,并通過proxy_pass指令,將請求轉發給上面定義的webservers服務器集群。Nginx會自動根據集群內服務器的權重等策略進行負載均衡。
二、 MD5: 密碼的安全存儲與驗證
核心原理
MD5是一種單向哈希函數,能將任意數據轉換為一個固定長度且不可逆的“數字指紋”。在用戶認證中,其核心價值在于避免在數據庫中存儲用戶的明文密碼,以此提升賬戶安全性。驗證過程不比較密碼原文,而是比較密碼原文經過哈希計算后的“指紋”是否與數據庫中預存的“指紋”一致。這依賴于哈希函數的確定性:相同的輸入永遠產生相同的輸出。
代碼示例 (EmployeeServiceImpl.java
中的login
方法)
Java
public Employee login(EmployeeLoginDTO employeeLoginDTO) {String username = employeeLoginDTO.getUsername();String password = employeeLoginDTO.getPassword();Employee employee = employeeMapper.getByUsername(username);if (employee == null) {throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);}password = DigestUtils.md5DigestAsHex(password.getBytes());if (!password.equals(employee.getPassword())) {throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);}if (employee.getStatus() == StatusConstant.DISABLE) {throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);}return employee;
}
代碼解讀
首先,方法從
employeeLoginDTO
對象中獲取用戶在登錄時提交的明文username
和password
。使用
employeeMapper.getByUsername(username)
從數據庫查詢用戶信息。此時,返回的employee
對象中所包含的密碼employee.getPassword()
是先前在注冊時就已經過MD5加密處理的哈希字符串。password = DigestUtils.md5DigestAsHex(password.getBytes());
這一行是核心步驟。它調用Spring框架的工具類,將用戶本次輸入的明文密碼也進行相同的MD5哈希計算。if (!password.equals(employee.getPassword()))
這一行進行最終的驗證。它比較的是兩個MD5哈希值:一個是剛由用戶輸入計算得出的,另一個是從數據庫中讀取的。如果兩者不一致,則證明密碼錯誤。
安全提醒: 盡管此方法詮釋了哈希驗證原理,但因MD5算法本身存在安全弱點,現代項目中更推薦使用BCrypt等加鹽慢哈希算法。
三、 Knife4j: API文檔的自動化生成與增強UI
核心原理
Knife4j是基于Swagger/OpenAPI規范的API文檔UI增強工具。其工作模式為**“后端代碼驅動,前端界面渲染”**:
后端生成數據: 項目中引入的
Springfox
或Springdoc
庫,會掃描Java Controller代碼中的特定注解(如@ApiOperation
),并在項目運行時,自動生成一份遵循OpenAPI規范的JSON格式的API結構描述文件。這實現了“代碼即文檔”,保證了文檔與實現的高度一致。前端渲染界面: Knife4j本身提供了一套美觀且功能強大的前端UI資源。這個UI界面會請求并解析上一步生成的JSON數據,最終將其渲染成一個可交互、帶在線調試功能的Web文檔頁面,極大地提升了API文檔的可讀性和易用性。
1. 配置API掃描規則 (位于WebMvcConfiguration.java
)
代碼示例
Java
@Bean
public Docket docket() {ApiInfo apiInfo = new ApiInfoBuilder().title("蒼穹外賣項目接口文檔").version("2.0").description("蒼穹外賣項目接口文檔").build();Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo).select().apis(RequestHandlerSelectors.basePackage("com.sky.controller")).paths(PathSelectors.any()).build();return docket;
}
代碼解讀
此
@Bean
方法創建并配置了一個Docket
實例,它是Swagger/Springfox的核心配置對象。.apiInfo()
用于設置文檔首頁的標題、版本等元數據。.select()
開始進行掃描配置。.apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
是關鍵配置,它指示框架只掃描com.sky.controller
這個包下的所有Controller類來生成文檔。.paths(PathSelectors.any())
表示對掃描到的Controller中的所有接口路徑都生成文檔。
2. 配置UI界面的訪問路徑 (位于WebMvcConfiguration.java
)
代碼示例
Java
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
代碼解讀
此方法用于設置靜態資源映射。
它告訴Spring MVC框架,當瀏覽器訪問
/doc.html
或/webjars/**
這些URL時,不要去Controller里尋找處理器,而是應該去Java的classpath
下的特定位置(META-INF/resources/
)去尋找對應的靜態文件(HTML, CSS, JS)。Knife4j的UI界面文件就打包存放在這些路徑下。完成這兩步配置后,啟動項目并訪問
http://localhost:8080/doc.html
即可看到API文檔。