前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
前言
大家好,我是老馬。很高興遇到你。
我們為 java 開發者實現了 java 版本的 nginx
如果你想知道 servlet 如何處理的,可以參考我的另一個項目:
手寫從零實現簡易版 tomcat minicat
手寫 nginx 系列
如果你對 nginx 原理感興趣,可以閱讀:
從零手寫實現 nginx-01-為什麼不能有 java 版本的 nginx?
從零手寫實現 nginx-03-nginx 基於 Netty 實現
從零手寫實現 nginx-04-基於 netty http 出入參優化處理
從零手寫實現 nginx-05-MIME類型(Multipurpose Internet Mail Extensions,多用途互聯網郵件擴展類型)
從零手寫實現 nginx-12-keep-alive 連接復用
從零手寫實現 nginx-13-nginx.conf 配置文件介紹
從零手寫實現 nginx-14-nginx.conf 和 hocon 格式有關係嗎?
從零手寫實現 nginx-15-nginx.conf 如何通過 java 解析處理?
從零手寫實現 nginx-16-nginx 支持配置多個 server
從零手寫實現 nginx-18-nginx 請求頭+響應頭操作
從零手寫實現 nginx-20-nginx 占位符 placeholder
從零手寫實現 nginx-21-nginx modules 模塊信息概覽
從零手寫實現 nginx-22-nginx modules 分模塊載入優化
從零手寫實現 nginx-23-nginx cookie 的操作處理
目標
這一節我們對 server 中的配置進一步優化,讓用戶使用起來更加方便。
配置的獲取方式流程圖:
1)首先從當前 server 配置獲取
2)不存在,則從全局的配置中獲取
3)全局配置屬性不存在,則直接從預設配置中獲取。
核心代碼調整
我們節選 2 個例子,配置的獲取邏輯就變成下麵的樣子:
private List<String> getHttpServerGzipTypes(final NgxConfig conf, final NgxBlock serverBlock) {
// value
NgxParam param = serverBlock.findParam("gzip_types");
if(param != null) {
return StringUtil.splitToList(param.getValue(), " ");
}
// http 預設
NgxParam httpParam = conf.findParam("gzip_types");
if(httpParam != null) {
return StringUtil.splitToList(httpParam.getValue(), " ");
}
return NginxUserServerConfigDefaultConst.gzipTypes;
}
private long getHttpServerGzipMinLen(final NgxConfig conf, final NgxBlock serverBlock) {
// value
NgxParam param = serverBlock.findParam("gzip_min_len");
if(param != null) {
return Long.parseLong(param.getValue());
}
// http 預設
NgxParam httpParam = conf.findParam("gzip_min_len");
if(httpParam != null) {
return Long.parseLong(httpParam.getValue());
}
return NginxUserServerConfigDefaultConst.gzipMinLength;
}
private String getHttpServerGzip(final NgxConfig conf, final NgxBlock serverBlock) {
// value
NgxParam param = serverBlock.findParam("gzip");
if(param != null) {
return param.getValue();
}
// http 預設
NgxParam httpParam = conf.findParam("gzip");
if(httpParam != null) {
return httpParam.getValue();
}
return NginxUserServerConfigDefaultConst.gzip;
}
小結
這種配置的預設獲取,在技術的實現上難度一般。
這個實現後續可以考慮統一優化,因為存在重覆性實現。
但是出發點是站在用戶的使用角度,讓用戶的使用更加便捷。