分析ThreadLocal的弱引用與內存泄漏問題-Java8,利用線性探測法解決hash衝突

目錄

一.介紹

二.問題提出

  2.1內存原理圖

  2.2幾個問題

三.回答問題

  3.1為什麼會出現內存泄漏

  3.2若Entry使用弱引用

  3.3弱引用配合自動回收

四.總結  

 

 

 

一.介紹

  之前使用ThreadLocal的時候,就聽過ThreadLocal怎麼怎麼的可能會出現內存泄漏,具體原因也沒去深究,就是一種不清不楚的狀態。最近在看JDK的源碼,其中就包含ThreadLocal,在對ThreadLocal的使用場景介紹以及源碼的分析后,對於ThreadLocal中可能存在的內存泄漏問題也搞清楚了,所以這裏專門寫一篇博客分析一下。

  在分析內存泄漏之前,先了解2個概念,就是內存泄漏和內存溢出:

  內存溢出(memory overflow):是指不能申請到足夠的內存進行使用,就會發生內存溢出,比如出現的OOM(Out Of Memory)

  內存泄漏(memory lack):內存泄露是指在程序中已經動態分配的堆內存由於某種原因未釋放或者無法釋放(已經沒有用處了,但是沒有釋放),造成系統內存的浪費,這種現象叫“內存泄露”。

  當內存泄露到達一定規模后,造成系統能申請的內存較少,甚至無法申請內存,最終導致內存溢出,所以內存泄露是導致內存溢出的一個原因。

 

二.問題提出

2.1內存原理圖

  下圖是程序運行中的內存分布圖,簡要介紹一下這種圖:當前線程有一個threadLocals屬性(ThreadLocalMap屬性),該map的底層是數組,每個數組元素時Entry類型,Entry類型的key是ThreadLocal類型(也就是創建的ThreadLocal對象),而value是則是ThreadLocal.set()方法設置的value。

  

  需要注意的是ThreadLocalMap的Entry,繼承自弱引用,定義如下,關於Java的引用介紹,可以參考:Java-強引用、軟引用、弱引用、虛引用

/**
 * ThreadLocalMap中存放的元素類型,繼承了弱引用類
 */
static class Entry extends WeakReference<ThreadLocal<?>> {
    // key對應的value,注意key是ThreadLocal類型
    Object value;

    Entry(ThreadLocal<?> k, Object v) {
        super(k);
        value = v;
    }
}

 

2.2問題提出

  在看了上面ThreadLocal和ThreadLocalMap相關的內存分佈以及關聯后,提出這樣幾個問題:

  1.ThreadLocal為什麼會出現內存溢出?

  2.Entry的key為什麼要用弱引用?

  3.使用弱引用是否就能解決內存溢出?

  為了回答上面這3個問題,我寫了一段代碼,後面根據這段代碼進行分析:

public void step1() {
    // some action
    
    step2();
    step3();
    
    // other action
}

// 在stepX中都會創建threadLocal對象
public void step2() {
    ThreadLocal<String> tl = new ThreadLocal<>();
    tl.set("this is value");
}
public void step3() {
    ThreadLocal<Integer> tl = new ThreadLocal<>();
    tl.set(99);
}

  在step1中會調用step2和step3,step2和step3都會創建ThreadLocal對象,當step2和step3執行完畢后,其中的棧內存中ThreadLocal引用就會被清除。

 

三.回答問題

 

  

  現在針對這個圖,一步一步的分析問題,中途會得出一些臨時的結論,但是最終的結論才是正確的

 

3.1為什麼會出現內存泄露

  現在有2點假設,本小節的分析都是基於這兩個假設之上的:

  1.Entry的key使用強引用,key對ThreadLocal對象使用強引用,也就是上面圖中連線5是強引用(key強引用ThreadLocal對象);

  2.ThreadLocalMap中不會對過期的Entry進行清理。

  上面代碼中,如果ThreadLocalMap的key使用強引用,那麼即使棧內存的ThreadLocal引用被清除,但是堆中的ThreadLocal對象卻並不會被清除,這是因為ThreadLocalMap中Entry的key對ThreadLocal對象是強引用。

  如果當前線程不結束,那麼堆中的ThreadLocal對象將會一直存在,對應的內存就不會被回收,與之關聯的Entry也不會被回收(Entry對應的value也不會被回收),當這種情況出現數量比較多的時候,未釋放的內存就會上升,就可能出現內存泄漏的問題。

  上面的結論是暫時的,有前提假設!!!最終結論還需要看後面分析。

 

3.2若Entry使用弱引用

  

  仍舊有1個假設,就是ThreadLocalMap中不會對過期的Entry進行清理,陳舊的Entry是指Entry的key為null。

  按照源碼,Entry繼承弱引用,其Key對ThreadLocal是弱引用,也就是上圖中連線5是弱引用,連線6仍為強引用。

  同樣以上面代碼為例,step2和step3創建了ThreadLocal對象,step2和step3執行完后,棧中的ThreadLocal引用被清除了;由於堆內存中ThreadLocalMap的Entry key弱引用ThreadLocal對象,根據垃圾收集器對弱引用對象的處理:

當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的對象。

  此時堆中ThreadLocal對象會被gc回收(因為現在沒有對ThreadLocal的強引用,只有一個弱引用ThreadLocal對象),Entry的key為null,但是value不為null,且value也是強引用(連線6),所以Entry仍舊不能回收,只能釋放ThreadLocal的內存,仍舊可能導致內存泄漏

  在沒有自動清理陳舊Entry的前提下,即使Entry使用弱引用,仍可能出現內存泄漏。

 

3.3弱引用配合自動回收

  通過3.2的分析,其實只要陳舊的Entry能自動被回收,就能解決內存泄漏的問題,其實JDK就是這麼做的。

  如果看過源碼,就知道,ThreadLocalMap底層使用數組來保存元素,使用“線性探測法”來解決hash衝突,關於線性探測法的介紹可以查看:利用線性探測法解決hash衝突

  在每次調用ThreadLocal類的get、set、remove這些方法的時候,內部其實都是對ThreadLocalMap進行操作,對應ThreadLocalMap的get、set、remove操作。

  重點來了!重點來了!重點來了!

  ThreadLocalMap的每次get、set、remove,都會清理過期的Entry,下面以get操作解釋,其他操作也是一個意思,大致如下:

  1.ThreadLocalMap底層用數組保存元素,當get一個Entry時,根據key的hash值(非hashCode)計算出該Entry應該出在什麼位置;

  2.計算出的位置可能會有衝突,比如預期位置是position=5,但是position=5的位置已經有其他Entry了;

  3.出現衝突后,會使用線性探測法,找position=6位置上的Entry是否匹配(匹配是指hash相同),如果匹配,則返回position=6的Entry。

  4.在這個過程中,如果position=5位置上的Entry已經是陳舊的Entry(Entry的key為null),此時position=5的key就應該被清理;

  5.光清理position=5的Entry還不夠,為了保證線性探測法的規則,需要判斷數組中的其他元素是否需要調整位置(如果需要,則調整位置),在這個過程中,也會進行清理陳舊Entry的操作。

  上面這5個步驟就保證了每次get都會清理數組中(map)的陳舊Entry,清理一個陳舊的Entry,就是下面這三行代碼:

Entry.value = null; // 將Entry的value設為null
table[index] = null;// 將數組中該Entry的位置設置null
size--;	// map的size減一

  對於ThreadLocal的set、remove也類似這個原理。

  有了自動回收陳舊Entry的操作,需要注意的是,在這個時候,key使用弱引用就是至關重要的一點!!!

  因為key使用弱引用后,當弱引用的ThreadLocal對象被會回收后,該key的引用為null,則該Entry在下一次get、set、remove的時候就才會被清理,從未避免內存泄漏的問題。

  

四.總結

  在上面的分析中,看到ThreadLocal基本不會出現內存泄漏的問題了,因為ThreadLocalMap中會在get、set、remove的時候清理陳舊的Entry,與Entry的key使用弱引用密不可分。

  當然我們也可以在代碼中手動調用ThreadLocal的remove方法進行清除map中key為該threadLocal對象的Entry,同時清理過期的Entry。

  

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

循序漸進VUE+Element 前端應用開發(10)— 基於vue-echarts處理各種圖表展示,循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理,循序漸進VUE+Element 前端應用開發(9)— 界面語言國際化的處理

在我們做應用系統的時候,往往都會涉及圖表的展示,綜合的圖表展示能夠給客戶帶來視覺的享受和數據直觀體驗,同時也是增強客戶認同感的舉措之一。基於圖表的處理,我們一般往往都是利用對應第三方的圖表組件,然後在這個基礎上為它的數據模型提供符合要求的圖表數據即可,VUE+Element 前端應用也不例外,我們這裏使用了基於vue-echarts組件模塊來處理各種圖表vue-echarts是對echarts圖表組件的封裝。

1、圖表組件的安裝使用

首先使用npm 安裝vue-echarts組件。

git地址:https://github.com/ecomfe/vue-echarts

NPM安裝命令

npm install echarts vue-echarts

然後在對應模塊頁面裏面引入對應的組件對象,如下代碼所示。

<script>
import ECharts from 'vue-echarts' // 主圖表對象
import 'echarts/lib/chart/line' // 曲線圖表
import 'echarts/lib/chart/bar' // 柱狀圖
import 'echarts/lib/chart/pie' // 餅狀圖
import 'echarts/lib/component/tooltip' // 提示信息

接着在Vue組件裏面對象中加入對象即可。

export default {
  components: {
    'v-chart': ECharts
  },

如果是全局註冊使用,那麼可以在main.js裏面進行加載

// 註冊組件后即可使用
Vue.component('v-chart', VueECharts)

我們來看看圖表展示的效果圖

柱狀圖效果

 

餅狀圖

  

 曲線圖

  

 其他類型,極坐標和散點圖形

  

 或者曲線和柱狀圖組合的圖形

 更多的案例可以參考官網的展示介紹:https://echarts.apache.org/examples/zh/index.html

  

2、各種圖表的展示處理

對於我們需要的各種常規的柱狀圖、餅狀圖、折線圖(曲線圖)等,我下來介紹幾個案例代碼,其他的一般我們根據官方案例提供的data數據模型,構造對應的數據即可生成,就不再一一贅述。

另外,我們也可以參考Vue-echarts封裝的處理demo:https://github.com/ecomfe/vue-echarts/tree/master/src/demo 

對於柱狀圖,效果如下

在Vue模塊頁面的Template 裏面,我們定義界面代碼如下即可。

<v-chart
  ref="simplebar"
  :options="simplebar"
  autoresize
/>

然後在data裏面為它準備好數據即可,如下代碼所示。

 data() {
    return {
      simplebar: {
        title: { text: '柱形圖Demo' },
        tooltip: {},
        xAxis: {
          data: ['襯衫', '羊毛衫', '雪紡衫', '褲子', '高跟鞋', '襪子']
        },
        yAxis: {},
        series: [{
          name: '銷量',
          type: 'bar',
          data: [5, 20, 36, 10, 10, 20]
        }]
      }
    }
  }

當然我們也可以把這些構造對應數據的邏輯放在單獨的JS文件裏面,然後導入即可。

例如對於餅圖,它的界面效果如下所示。

它的vue視圖下,Template裏面的代碼如下所示。

<v-chart
  ref="pie"
  :options="pie"
  autoresize />

一般對於圖表的數據,由於處理代碼可能不少,建議是獨立放在一個JS文件裏面,然後我們通過import導入即可使用。

  然後在data裏面引入對應的對象即可,如下所示。

<script>
import ECharts from 'vue-echarts' // 主圖表對象
import 'echarts/lib/chart/line' // 曲線圖表
import 'echarts/lib/chart/bar' // 柱狀圖
import 'echarts/lib/chart/pie' // 餅狀圖
import 'echarts/lib/component/tooltip' // 提示信息

// 導入報表數據
import getBar from './chartdata/bar' import pie from './chartdata/pie'
import scatter from './chartdata/scatter'
import lineChart from './chartdata/lineChart'
import incomePay from './chartdata/incomePay'

export default {
  components: {
    'v-chart': ECharts
  },
   return {
      pie,
      scatter,,
      lineChart,
      incomePay,
      simplebar: {
        title: { text: '柱形圖Demo' },
        tooltip: {},
        xAxis: {
          data: ['襯衫', '羊毛衫', '雪紡衫', '褲子', '高跟鞋', '襪子']
        },
        yAxis: {},
        series: [{
          name: '銷量',
          type: 'bar',
          data: [5, 20, 36, 10, 10, 20]
        }]
      }
    }
  },

其中pie.js裏面放置的是處理餅圖數據的邏輯,如下代碼所示。

export default {
  title: {
    text: '餅圖程序調用高亮示例',
    x: 'center'
  },
  tooltip: {
    trigger: 'item',
    formatter: '{a} <br/>{b} : {c} ({d}%)'
  },
  legend: {
    orient: 'vertical',
    left: 'left',
    data: ['直接訪問', '郵件營銷', '聯盟廣告', '視頻廣告', '搜索引擎']
  },
  series: [
    {
      name: '訪問來源',
      type: 'pie',
      radius: '55%',
      center: ['50%', '60%'],
      data: [
        { value: 335, name: '直接訪問' },
        { value: 310, name: '郵件營銷' },
        { value: 234, name: '聯盟廣告' },
        { value: 135, name: '視頻廣告' },
        { value: 1548, name: '搜索引擎' }
      ],
      itemStyle: {
        emphasis: {
          shadowBlur: 10,
          shadowOffsetX: 0,
          shadowColor: 'rgba(0, 0, 0, 0.5)'
        }
      }
    }
  ]
}

在界面處理的時候,值得注意的時候,有時候Vue頁面處理正常,但是圖表就是沒有出來,可能是因為高度或者寬度為0的原因,需要對對應的樣式進行處理設置,以便能夠正常显示出來。

如下是我 對圖表的設置的樣式處理,使得圖表在一個卡片的位置能夠显示正常。

<style scoped>
  .echarts { width: 100%; height: 400px;}

  .el-row {
    margin-bottom: 20px;
  }
  .el-col {
    border-radius: 4px;
    margin-bottom: 20px;
  }
</style>

最後幾個界面組合一起的效果如下所示。

 以上就是基於vue-echarts處理各種圖表展示,其中常規的引入組件很容易的,主要就是需要根據對應的圖表案例,參考數據組成的規則,從而根據我們實際情況構建對應的數據,賦值給對應的模型變量即可。

列出以下前面幾篇隨筆的連接,供參考:

循序漸進VUE+Element 前端應用開發(1)— 開發環境的準備工作

循序漸進VUE+Element 前端應用開發(2)— Vuex中的API、Store和View的使用

循序漸進VUE+Element 前端應用開發(3)— 動態菜單和路由的關聯處理

循序漸進VUE+Element 前端應用開發(4)— 獲取後端數據及產品信息頁面的處理

循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理

循序漸進VUE+Element 前端應用開發(6)— 常規Element 界面組件的使用

循序漸進VUE+Element 前端應用開發(7)— 介紹一些常規的JS處理函數

循序漸進VUE+Element 前端應用開發(8)— 樹列表組件的使用

循序漸進VUE+Element 前端應用開發(9)— 界面語言國際化的處理

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

因為知道了30+款在線工具,我的工作效率提升500%!

GitHub 15.2k Star 的Java工程師成神之路,不來了解一下嗎!

GitHub 15.2k Star 的Java工程師成神之路,不來了解一下嗎!

Perl 之父 Larry Wall 曾經在自己的《Programming Perl》一書中提到過:”程序員有3種美德: 懶惰、急躁和傲慢” 。懶惰,作為程序員美德的第一個要素。

Larry Wall 所說程序員應該具備的懶惰,並不是安於現狀、不思進取。而是一種為了達到同樣甚至更好的目標,而付出最少的時間或者精力的行為。一個懶惰的程序員會盡量使自己的代碼即實用又有很好的可讀性,這樣可以節省很多後面的維護的成本。一個懶惰的程序員會儘力完善代碼中的註釋及文檔,以免別人問自己太過問題。一個懶惰的程序員會擅長使用各種工具,從方方面面提升自己的效率。

懶惰是科技發展、人類進步的最大動力。從原始社會、農業時代、工業時代一直到如今的信息時代。因為懶惰,人們才會有動力去發明各種高效、便捷的工具,這些當初的工具,漸漸的就形成了如今的科技。所謂工欲善其事、必先利其器,說的就是這個道理。

在一篇文章中,作者將介紹多種實用的工具,全方位的武裝你,使我們的讀者都可以當一個“懶惰”的程序員。

搜索類在線工具

1、SearchCode(https://searchcode.com/ )是一個源碼搜索引擎,目前支持從 Github、Bitbucket、Google Code、CodePlex、SourceForge 和 Fedora Project 平台搜索公開的源碼。

2、mvnrepository(http://mvnrepository.com )這個不用詳細解釋了,就是查詢maven的gav等信息。

3、Iconfont(https://www.iconfont.cn )國內功能很強大且圖標內容很豐富的矢量圖標庫,提供矢量圖標下載、在線存儲、格式轉換等功能。阿里巴巴體驗團隊傾力打造,設計和前端開發的便捷工具。

4、BinaryDoc for OpenJDK(https://openjdk.binarydoc.org/net.java/openjdk/)直接從OpenJDK二進制文件生成文檔,二進制代碼是最好的文檔。

5、Unsplash(https://unsplash.com )是一個免費的圖片分享網站,可以在上面搜索無版權圖片

6、鳩摩搜書(https://www.jiumodiary.com/ )國內一款強大的电子書搜索引擎,整合了大部分电子書平台的資源,最重要的是他無需註冊登錄,可以直接下載。並且網站頁面清新、且資源免費。

7、MySlide(https://myslide.cn/ )是一個提供PPT分享服務的平台,在這裏你可以找到你想要的PPT。專註技術領域的PPT共享,各種技術大會的演講PPT這裏都有。

8、IT大咖說(https://www.itdks.com/ )是IT垂直領域的大咖知識分享平台,分享行業TOP大咖乾貨,技術大會在線直播錄播,在線直播知識分享平台。

生成類在線工具

1、BeJSON(http://www.bejson.com/json2javapojo )是一個比較好用將Json轉成Java對象的工具。json是目前JavaWeb中數據傳輸的主要格式,很多時候會有把json轉成Java對象的需求。有時候合作方會提供一個json的樣例,需要我們自己定義Java類,這時候這個工具就派上用場了。

2、在線corn生成工具(https://cron.qqe2.com/ ),Cron 一般用於配置定時任務的執行。但是要想一次性的把一個corn表達式配置好確實很難的,需要程序員記住他的語法。有一些在線工具可以提供圖形化的界面,只要輸入想要定時執行的周期等,就可以自動生成corn表達式。

3、正則表達式的生成工具(http://tool.chinaz.com/tools/regexgenerate )正則表達式,又稱規則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本。在使用正則表達式進行字符轉過濾的時候,需要用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。通常,這個規則字符串的定義是比較麻煩和複雜的。也需要經過大量的測試和驗證才能被採用。

4、 ASCII藝術生成工具(http://patorjk.com/software/taag/ )可以將輸入的字符快速轉換成ASCII藝術文字的形式。

5、ProcessOn(https://www.processon.com/ )是一個在線協作繪圖平台,為用戶提供最強大、易用的作圖工具!支持在線創作流程圖、BPMN、UML圖、UI界面原型設計、iOS界面原型設計。

6、MarkDown編輯器,Markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文本格式編寫文檔,深受廣大程序員們的喜愛,推薦幾款在線md編輯器:MaHua(https://mahua.jser.me/ ) 馬克飛象(https://maxiang.io/ ) Cmd(https://www.zybuluo.com/mdeditor )

轉換類在線工具

1、站長工具的編碼轉換(http://tool.chinaz.com/tools/unicode.aspx )比較全面,提供了Unicode編碼、UFT8編碼、URL編碼/解碼等功能。編碼問題一直困擾着開發人員,尤其在Java 中更加明顯,因為Java 是跨平台語言,不同平台之間編碼之間的切換較多。計算中提拱了多種編碼方式,常見的有 ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 等。有些時候開發人員需要通過編碼轉換的方式來查看不同編碼下面的文件內容。

2、時間戳轉換工具(http://tool.chinaz.com/Tools/unixtime.aspx),時間戳(英語:Timestamp)是指在一連串的資料中加入辨識文字,如時間或日期,用以保障本地端(local)資料更新順序與遠端(remote)一致。

3、Timebie(http://www.timebie.com/cn/easternbeijing.php )提供了世界時間相互轉換的功能。世界各地時間轉換在做國際業務的時候會經常用到,比如北京時間轉紐約時間,北京時間轉洛杉磯時間。

4、加密解密也是JavaWeb可能會經常遇到的,有的時候我們需要驗證加密算法是否正確,或者要解密等場景,就需要一個在線工具(http://tool.chinaz.com/tools/textencrypt.aspx )來快速驗證。

5、convertworld(https://www.convertworld.com/zh-hans/ )是一個比較全的單位換算的網站。我經常用它進行時間單位和貨幣單位的換算。

6、Convertio(https://convertio.co/zh/flv-mp4/ )是一個在線視頻格式轉換工具,支持多種常見視頻格式,如 FLV、MOV 和 AVI 等。上傳的視頻文件不能超過 100 MB。

7、Docsmall(https://docsmall.com/image-compress )是一個在線圖片壓縮工具,可以批量壓縮圖片、Gif 圖,一次最多上傳 30 張圖片,每張圖片最大為 25 MB。

檢查類在線工具

1、JSON格式化工具(https://www.json.cn/ )是我嘗試過很多同類工具之後最經常使用的一個,不僅支持json格式的驗證及格式化,還可以將json格式壓縮成普通文本等好用功能。有時候我們不確定這個文本是否完全符合JSON格式,有時候我們也想可以更清晰的查看這個JSON文本的格式關係。就可以使用這個工具來進行JSON格式的驗證和格式化。

2、正則驗證(http://tool.chinaz.com/regex ),Java開發對正則表達式肯定不陌生。站長工具提供的這個正則驗真工具還不錯。

3、Diffchecker(https://www.diffchecker.com/ )是一個使用很不錯代碼差異對比工具。使過svn或者git的人對diffcheck肯定不陌生,但有時候我們修改的文本內容並沒有被版本控制,那麼就可以使用在線的網站查看文件的修改情況。

對照類工具

1、ASCII對照表 : http://tool.oschina.net/commons?type=4 2、HTTP狀態碼 : http://tool.oschina.net/commons?type=5 3、HTTP Content-type : http://tool.oschina.net/commons 4、TCP/UDP常見端口參考 : http://tool.oschina.net/commons?type=7 5、HTML轉義字符 : http://tool.oschina.net/commons?type=2 6、RGB顏色參考 : http://tool.oschina.net/commons?type=3 7、網頁字體參考 : http://tool.oschina.net/commons?type=8

在線代碼運行

1、CodeRunner(https://tool.lu/coderunner/ )可以在線運行php、c、c++、go、python、java、groovy等代碼。當我們在外面,沒有IDE又想執行個小程序的時候是個不錯的選擇。

一個實用小插件

最後,再給大家推薦一個chrome插件,這個插件中囊括了很多上面介紹的在線工具的功能,如JSON格式化、時間戳轉換、Markdown工具、編碼解碼、加密解密、正則驗證等。

FeHelper ,可以關注我的公眾號,後台回復”在線工具”,我已經把安裝包給大家準備好了。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

※產品缺大量曝光嗎?你需要的是一流包裝設計!

一起玩轉微服務(1)——概念

一、什麼是微服務

隨着各行各業公司的快速發展,業務規模的不斷擴大,不可避免的造成原有架構不能夠適應快速的增長和變化。這時,微服務就進入大家的視野,其實在微服務之前,很多的公司已經做過服務化的改造,並且取得了一定的成果,但是對於整體流程的標準化還有一定有差距。那麼,什麼是微服務呢?
準確的說,微服務是一種軟件架構模式,將大型系統或者複雜的應用分割成多個服務的架構,服務之間互相協調、互相配合,為用戶提供最終價值。每個服務都有獨立的生命周期,可以單獨的維護和部署,各個業務模塊之間是松耦合的,比傳統的應用程序更有效地利用計算資源,應用的擴展更加靈活,能夠通過擴展組件來處理功能瓶頸問題。這樣一來,開發人員只需要為額外的組件部署計算資源,而不需要部署一個完整的應用程序的全新迭代。
一個微服務的架構如圖所示,單體應用被拆分成多個微小的服務:

也有人將微服務的開發比喻成搭積木,每個服務都是一個零件,使用這些不同的服務可以搭建出不同的形狀。簡單的說,微服務架構就是把一個大系統按業務功能分解成多個職責單一的小系統,並利用簡單的方法使多個小系統相互協作,組合成一個大系統。
其實這裏蘊含着自古以來的真理,就是分而治之,當一件事情大到不能處理的時候,就使用一定的切分方法,將其變成很多微小的類,然後分門別類的進行處理,以達到最好的效果,最終實現1+1>2的功效。
微服務的優點和缺點(或者說挑戰)一樣明顯。
優點

  • 開發簡單,每個服務完成獨立的功能

  • 技術棧靈活,可以選擇不同的語言完成不同的服務,發揮各種語言的最大優勢

  • 服務獨立無依賴,每個服務都可以單獨部署,一個服務出現問題不會導致整個系統癱瘓

  • 獨立按需擴展,以應對高併發以及大流量

  • 可用性高,當其中一個點出現問題時,能夠及時切換,不影響業務正常運行

  • 複雜應用解耦為小而眾的服務,拆分可以基於一定的原則,將耗時的應用解耦

  • 各服務精而專,也就是我們常說的專人干專事,映射到微服務中就是專服務干專事

  • 服務間通信通過API完成,選擇輕量的API通信

    缺點(挑戰)

  • 多服務運維難度,服務的增加意味着運維的困難,如何有效的管理是一個挑戰

  • 系統部署依賴,當業務複雜是,系統之間的耦合關係高度耦合,如何高效部署是一個挑戰

  • 服務間通信成本,包括網絡延遲,接口不可用性等,保證服務的高可用性是一個挑戰

  • 數據一致性,再各個服務間如何有效的共享數據,確保相應服務的數據需求一致性是一個挑戰

  • 系統集成測試,拆分后,原本需要測試的內容成倍的增加,如何高效的降低測試成本是一個挑戰

  • 重複工作,服務拆分之後,由於信息的不對稱導致的重複性工作,如何有效抽象是一個挑戰

  • 性能監控,原本只需要一個監控的部分,現在需要分開監控,如何快速定位問題是一個挑戰

  • 溝通成本的成倍增加,服務拆分后,各個服務由單獨的人來維護,如何高效的溝通是一個挑戰

二、為什麼微服務

從一般的平台遇到的問題說起,平台的問題包括:

  • 服務配置複雜。基礎服務多,服務的資源配置複雜。傳統方式管理服務複雜。
  • 服務之間調用複雜。檢索服務、用戶中心服務等,服務之間的調用複雜,依賴多。
  • 服務監控難度大。服務比較多,機器部署複雜,服務存活監控、業務是否正常監控尤為重要。
  • 服務化測試問題。服務依賴性比較大,測試一個小的功能,周邊服務也需要啟動。

那麼微服務的架構有什麼優勢,大家為什麼都懷着極高的熱情來應對微服務呢。

1. 區別

首先看一下兩者的區別,單體應用和分佈式應用都有哪些優點和缺點呢,通過下面的表格來做一下分析和對比?

 

 

從上面的表格我們可以看到,分佈式系統雖然有一些優勢,但也存在一些問題。

  • 架構設計變得複雜(尤其是其中的分佈式事務)。
  • 部署單個服務會比較快,但是如果一次部署需要多個服務,部署會變得複雜。
  • 系統的吞吐量會變大,但是響應時間會變長。
  • 運維複雜度會因為服務變多而變得很複雜。
  • 架構複雜導致學習曲線變大。
  • 測試和查錯的複雜度增大。
  • 技術可以很多樣,這會帶來維護和運維的複雜度。
  • 管理分佈式系統中的服務和調度變得困難和複雜。

也就是說,分佈式系統架構的難點在於系統設計,以及管理和運維。

接下來我們就一起來看一下架構的演變過程。

2. 從單體應用說起

下圖是我們非常熟悉的單體應用,或者說是非常傳統的應用架構。
從圖中可以看到,應用通過瀏覽器進行訪問,當訪問到訂單服務的時候,分單服務提供相應的功能,然後去訪問應用的數據層,數據層負責對數據的解析,這是一個極其典型的單體應用結構,這種結構所帶來的問題顯而易見,數據庫存在單點,所有服務都耦合在一個應用中,當其中一個服務出現問題的時候,整個工程都需要重新發布,從而導致整體業務不能提供響應。這種結構在小項目中是沒有什麼問題的,而且操作起來非常靈活,但當業務量爆增的時候,就無法靈活應對了。

 

 

3. 第一步切分

為了應對單體應對無法滿足業務增漲,需要對數據庫進行進一步的切分,以提高擴展性,下圖就是一個切分后的架構圖。

業務之間通過進程間的服務進行相互調用,數據庫之間沒有耦合性,不會存在單點故障。前端只需要調用相應的服務,返回自身需要的數據,然後與用戶進行交互。可以看到,這種方式比傳統的單體應用已經前進了一步,但是數據庫層面仍然存在着問題,根據數據量需要評估是否使用讀寫分離的設計,服務層面也增加了相應的複雜性。前端調用隨着調用接口數量的增加也急需治理。

4. 服務化所帶來的問題

隨着服務的拆分,新的問題應運而生。客戶端如何訪問這些服務?這些服務的調用情況,切分是否合理,安全問題,如果受到攻擊應該如何應對,是否可以使用限流或者降級的方式來及時解決。
應對這些問題,API網關是一個不錯的解決方案。當有新的設備需要調用這些接口時,可以復用原有接口,不需要進行二次開發。接口的維護也會更有條理性,對於訪問次數,安全等問題,都可以在這一層進行解決。

解決了應用前端訪問的問題后,服務之間的相互調用也是一個問題,如果整個系統內部調用關係混亂,就會帶來非常多的不必要的問題。所以約定好服務之間的通信方式是非常有必要的。不管是開源還是公司內部研發,都有非常多的解決方案。最簡單的方式,是通過rpc的調用,傳輸json或者XML,雙方定義好協議格式,通過報文的方式進行數據傳輸。
當多種服務需要互相調用的時候,服務的數量會急劇的增加。服務的治理就成為新的問題。不同的服務的版本問題。如果不能通過一個單獨的註冊地址,像書的目錄一樣來管理整個服務結構,服務的調用就侍显示非常混亂。
一般的分佈式服務,都有一個註冊中心,例如dubbo是基於zookeeper進行的二次開發,自身提供管理控制台,可以對服務進行註冊和查找,Spring Cloud有Eureka,還有etcd,consul等可供選擇。
經過上面的處理,整體上來看應用已經達到了一個非常好的狀態,但是每個應用服務仍然存在着單點問題,當一個服務出現問題的時候,有可能導致連鎖的反應,使用整個系統癱瘓。這時候需要除了監控告警之外的一種容錯機制保障整體服務的可運行性。
通過網關層的反向代理來實現高可用是一個不錯的解決方案,訪問層無需要了解整個體系有多少應用提供,只需要關心服務是否能夠提供服務,並且對必要的接口進行監測,當發現接口無法正常提供服務時,提供相應的告警機制,以微信、短信或者郵件的方式通知相關人及時進行處理。
隨着服務的切分,業務的擴展,數據量的激增也是一個非常大的問題,如果採用傳統的方案來應對,各種關係型數據庫都有瓶頸,把運算量比較大,比較耗資源的運算,跨庫統計查詢的需求。
再下一步隨着數據量的不斷增漲,需要業務和統計分離。
統計一般都是比較耗時的應用,比如計算用戶的留存情況,需要分析一周甚至是更長周期內的用戶數據,如果使用在線的方式分析顯然不太現實,所以,對於大數據量的分析和數據挖掘,需要從業務中抽取數據進行離線分析,然後將分析的結果進行展現。

5. 微服務的可擴展性

針對以上的分析,可以看到,微服務需要具備極強的可擴展性,這些擴展性包含以下幾個方面:
• 性能可擴展:性能無法完全實現線性擴展,但要盡量使用具有併發性和異步性的組件。具備完成通知功能的工作隊列要優於同步連接到數據庫。
• 可用性可擴展:CAP理論表明,分佈式系統無法同時提供一致性、可用性和分區容錯性保證。許多大規模Web應用程序都為了可用性和分區容錯性而犧牲了強一致性,而後者則有賴於最終一致性來保證。
• 維護可擴展:軟件和服務器都需要維護。在使用平台的工具監控和更新應用程序時,要盡可能地自動化。
• 成本可擴展:總成本包括開發、維護和運營支出。在設計一個系統時,要在重用現有組件和完全新開發組件之間進行權衡。現有組件很少能完全滿足需求,但修改現有組件的成本還是可能低於開發一個完全不同的方案。另外,使用符合行業標準的技術使組織更容易聘到專家,而發布獨有的開源方案則可能幫助組織從社區中挖掘人才。

6. 微服務與SOA的區別

面向服務的架構(SOA)是一個組件模型,它將應用程序的不同功能單元(稱為服務)通過這些服務之間定義良好的接口和契約聯繫起來。接口是採用中立的方式進行定義的,它應該獨立於實現服務的硬件平台、操作系統和編程語言。這使得構建在各種各樣的系統中的服務可以以一種統一和通用的方式進行交互。
都是做服務化,那麼微服務與SOA的異同有哪些呢?
相同點:

  • 需要Registry,實現動態的服務註冊發現機制;
  • 需要考慮分佈式下面的事務一致性,CAP原則下,兩段式提交不能保證性能,事務補償機制需要考慮;
  • 同步調用還是異步消息傳遞,如何保證消息可靠性?SOA由ESB來集成所有的消息;
  • 都需要統一的Gateway來匯聚、編排接口,實現統一認證機制,對外提供APP使用的RESTful接口;
  • 同樣的要關注如何再分佈式下定位系統問題,如何做日誌跟蹤,就像我們電信領域做了十幾年的信令跟蹤的功能;

差異點:

  • 是持續集成、持續部署?對於CI、CD(持續集成、持續部署),這本身和敏捷、DevOps是交織在一起的,所以這更傾向於軟件工程的領域而不是微服務技術本身;
  • 使用不同的通訊協議是不是區別?微服務的標杆通訊協議是RESTful,而傳統的SOA一般是SOAP,不過目前來說採用輕量級的RPC框架Dubbo、Thrift、gRPC非常多,在Spring Cloud中也有Feign框架將標準RESTful轉為代碼的API這種仿RPC的行為,這些通訊協議不應該是區分微服務架構和SOA的核心差別;
  • 是流行的基於容器框架還是虛擬機為主?Docker和虛擬機還是物理機都是架構實現的一種方式,不是核心區別;

SOA和微服務的一個主要不同點就是自動化程度上的不同。大部分的SOA實現只達到服務級別的抽象,而微服務走的更遠,它達到了對實現和運行環境的抽象級別。
而在一個規範的微服務中,每個微服務應該被構建成胖jar(fat Jar)其中內置了所有的依賴,然後作為一個單獨的java進程存在。

三、常見的微服務組件

既然談到了微服務架構,就說一下通用的微服務都包括哪些組件:

  • 服務註冊

服務註冊是一個記錄當前可用的微服務實例的網絡信息數據庫,是服務發現機制的主要核心,服務註冊表查詢api、管理api,使用查詢api獲得可用服務的實例,使用管理api實現註冊、註銷。

  • 服務發現

服務調用方從服務註冊中心找到自己需要調用的服務的地址。可以選擇客戶端服務發現,也可以選擇服務端服務發現。

  • 負載均衡

服務提供方一般以多實例的形式提供服務,負載均衡功能能夠讓服務調用方連接到合適的服務節點。並且,節點選擇的工作對服務調用方來說是透明的。可以選擇服務端的負載均衡也可以選擇客戶端的負載均衡。

  • 服務網關

服務網關是服務調用的唯一入口,可以在這個組件是實現用戶鑒權、動態路由、灰度發布、A/B測試、負載限流等功能。根據公司流量規模的大小網關可以是一個,也可以是多個。

  • 配置中心

將本地化的配置信息(properties, XML, yaml等)註冊到配置中心,實現程序包在開發、測試、生產環境的無差別性,方便程序包的遷移。配置部分可以單獨使用高可用的分佈式配置中心,確保一個配置服務出現問題是,其它服務也能夠提供配置服務。

  • API管理

以方便的形式編寫及更新API文檔,並以方便的形式供調用者查看和測試。通常需要加入版本控制的概念,以確保服務的不同版本在升級過程中都能夠提供服務。

  • 集成框架

微服務組件都以職責單一的程序包對外提供服務,集成框架以配置的形式將所有微服務組件集成到統一的界面框架下,讓用戶能夠在統一的界面中使用系統。

  • 分佈式事務

對於重要的業務,需要通過分佈式事務技術(TCC、高可用消息服務、最大努力通知)保證數據的一致性。根據業務的不同適當的需要犧牲一些數據的一致性要求,確保數據的最終一致性。

  • 調用鏈

記錄完成一個業務邏輯時調用到的微服務,並將這種串行或并行的調用關係展示出來。在系統出錯時,可以方便地找到出錯點。同時統計各個服務的調用次數,確保比較熱的服務能夠分配更多的資源。

  • 支撐平台

系統微服務化后,系統變得更加碎片化,系統的部署、運維、監控等都比單體架構更加複雜,那麼,就需要將大部分的工作自動化。現在,可以通過Docker等工具來中和這些微服務架構帶來的弊端。 例如持續集成、藍綠髮布、健康檢查、性能健康等等。可以這麼說,如果沒有合適的支撐平台或工具,就不要使用微服務架構。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

.Net 對於PDF生成以及各種轉換的操作

前段時間公司的產品,要做一個新功能,簽章(就是把需要的數據整理成PDF很標準的文件,然後在蓋上我們在服務器上面的章)

然後我就在百度上找了找,發現搞PDF的類庫很少,要麼就要錢,要麼就有水印,破解版的沒找到。

先講一講我是怎麼生成PDF的

1、生成PDF

  這裏用到了 Spire.Pdf    這個類庫可以在NuGet裏面搜索到,上面帶個小紅標的就是免費版本。  

  當然也可以去他們的官網,上面還有文檔(https://www.e-iceblue.cn/Introduce/Spire-PDF-NET.html)。

  代碼(這是我自己寫的一個測試的表格)

  

        public static void abc()
        {
            //創建PDF文檔
            Spire.Pdf.PdfDocument doc = new Spire.Pdf.PdfDocument();

            //添加一頁
            PdfPageBase page = doc.Pages.Add();
    //設置字體
            PdfTrueTypeFont font = new PdfTrueTypeFont(new System.Drawing.Font("Microsoft Yahei", 20f), true);
            PdfTrueTypeFont font1 = new PdfTrueTypeFont(new System.Drawing.Font("Microsoft Yahei", 11f), true);

            //創建一個PdfGrid對象
            PdfGrid grid = new PdfGrid();

        //這一段的內容是在表格只玩显示一些數據 根據坐標定位 第一個是內容,第二個是字體,第三個是顏色,第四第五是坐標
            page.Canvas.DrawString("XXXXXXXX管理中心回單",
                    font,
                    new PdfSolidBrush(System.Drawing.Color.Black), 130, 10);
            page.Canvas.DrawString("編號:31231",
                    font1,
                    new PdfSolidBrush(System.Drawing.Color.Black), 380, 60);
            page.Canvas.DrawString("經辦人:XXXX",
                    font1,
                    new PdfSolidBrush(System.Drawing.Color.Black), 60, 250);
            page.Canvas.DrawString("打印日期:2020/06/15",
                    font1,
                    new PdfSolidBrush(System.Drawing.Color.Black), 380, 250);
            //設置單元格邊距
            grid.Style.CellPadding = new PdfPaddings(1, 1, 4, 4);

            //設置表格默認字體
            grid.Style.Font = new PdfTrueTypeFont(new System.Drawing.Font("Microsoft Yahei", 12f), true);

            //添加4行4列
            PdfGridRow row1 = grid.Rows.Add();
            PdfGridRow row2 = grid.Rows.Add();
            PdfGridRow row3 = grid.Rows.Add();
            PdfGridRow row4 = grid.Rows.Add();
            PdfGridRow row5 = grid.Rows.Add();
            PdfGridRow row6 = grid.Rows.Add();
            grid.Columns.Add(4);

            //設置列寬
            foreach (PdfGridColumn col in grid.Columns)
            {
                col.Width = 120f;
            }

            //寫入數據 第一行第一個格式的值,第一行第二個格子的值 
            row1.Cells[0].Value = "收款單位";
            row1.Cells[1].Value = "{DW}";
            row2.Cells[0].Value = "收款單位";
            row2.Cells[1].Value = "{DW}";
            row3.Cells[0].Value = "匯款時間";
            row3.Cells[1].Value = "2016/06/02";
            row3.Cells[2].Value = "金額小寫";
            row3.Cells[3].Value = "¥231";
            row4.Cells[0].Value = "金額合計大寫";
            row4.Cells[1].Value = "大蘇打實打實";
            row5.Cells[0].Value = "用途:" +
                "付XXXX2020年04月至2020年04月";
            row6.Cells[0].Value = "提示:回單可重複打印,請勿重複XXX";

            //row5.Cells[0].Height = (float)20;
            //水平和垂直合併單元格 從那個格子開始合併幾個(包含當前格子)
            row1.Cells[1].ColumnSpan = 3;
            row2.Cells[1].ColumnSpan = 3;
            row4.Cells[1].ColumnSpan = 3;
            row5.Cells[0].ColumnSpan = 2;
            row5.Cells[2].ColumnSpan = 2;
            row6.Cells[0].ColumnSpan = 2;
            row6.Cells[2].ColumnSpan = 2;
        //這個是垂直合併,但是我之前合併的沒有效果
            row5.Cells[1].RowSpan = 2;

            //設置單元格內文字對齊方式
            row1.Cells[0].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row1.Cells[1].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row2.Cells[0].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row2.Cells[1].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row3.Cells[0].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row3.Cells[1].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row3.Cells[2].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row3.Cells[3].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row4.Cells[0].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row4.Cells[1].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row5.Cells[0].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            row6.Cells[0].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            //設置單元格背景顏色
            //row1.Cells[0].Style.BackgroundBrush = PdfBrushes.Gray;
            //row3.Cells[3].Style.BackgroundBrush = PdfBrushes.Green;
            //row4.Cells[3].Style.BackgroundBrush = PdfBrushes.MediumVioletRed;

            //設置邊框顏色、粗細
            PdfBorders borders = new PdfBorders();
            borders.All = new PdfPen(System.Drawing.Color.Black, 0.1f);
            foreach (PdfGridRow pgr in grid.Rows)
            {
                foreach (PdfGridCell pgc in pgr.Cells)
                {
                    pgc.Style.Borders = borders;
                }
            }
            //保存到文檔
            //在指定為繪入表格
            grid.Draw(page, new PointF(30, 80));
            doc.SaveToFile(@"路徑");
       //這句是在瀏覽器重打開這個PDF  
            System.Diagnostics.Process.Start(@"路徑");
        }

 

  保存我們看一下

  

 

 

2、之後就是關於PDF一些轉換的操作了(PDF轉base64,轉圖片之類的,我把代碼貼到下面)

 

 

 

  • 這個用到了iTextSharp類庫,也可以在Nuget下載到

 

/// <summary>
        /// 圖片轉pdf
        /// </summary>
        /// <param name="jpgfile"></param>
        /// <param name="pdf"></param>
        public static bool ConvertJPG2PDF(string jpgfile, string pdf)
        {
            try
            {
                var document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);
                using (var stream = new FileStream(pdf, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    PdfWriter.GetInstance(document, stream);
                    document.Open();
                    using (var imageStream = new FileStream(jpgfile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    {
                        var image = iTextSharp.text.Image.GetInstance(imageStream);
                        if (image.Height > iTextSharp.text.PageSize.A4.Height - 25)
                        {
                            image.ScaleToFit(iTextSharp.text.PageSize.A4.Width - 25, iTextSharp.text.PageSize.A4.Height - 25);
                        }
                        else if (image.Width > iTextSharp.text.PageSize.A4.Width - 25)
                        {
                            image.ScaleToFit(iTextSharp.text.PageSize.A4.Width - 25, iTextSharp.text.PageSize.A4.Height - 25);
                        }
                        image.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
                        document.NewPage();
                        document.Add(image);
                    }
                    document.Close();
                }

                return true;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
  • 這個用的是(O2S.Components.PDFRender4NET)
/// <summary>
        /// pdf轉img
        /// </summary>
        /// <param name="path">pdf位置</param>
        /// <param name="path2">img位置</param>
        public static void Pdf2Img(string path, string path2)
        {
            PDFFile pdfFile = PDFFile.Open(path);
            //實例化一個PdfDocument類對象,並加載PDF文檔
            using (Spire.Pdf.PdfDocument doc = new Spire.Pdf.PdfDocument())
            {
                doc.LoadFromFile(path);
                //調用方法SaveAsImage()將PDF第一頁保存為Bmp格式
                System.Drawing.Image bmp = doc.SaveAsImage(0);
                // //調用另一個SaveAsImage()方法,並將指定頁面保存保存為Emf、Png            
                System.Drawing.Image emf = doc.SaveAsImage(0, Spire.Pdf.Graphics.PdfImageType.Bitmap);
                System.Drawing.Image zoomImg = new Bitmap((int)(emf.Size.Width * 2), (int)(emf.Size.Height * 2));
                using (Graphics g = Graphics.FromImage(zoomImg))
                {
                    g.ScaleTransform(2.0f, 2.0f);
                    g.DrawImage(emf, new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), emf.Size), new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), emf.Size), GraphicsUnit.Pixel);
                    zoomImg.Save(path2, ImageFormat.Jpeg);
                    
                    zoomImg.Dispose();
                    emf.Dispose();
                    bmp.Dispose();
                }
                doc.Close();
                doc.Dispose();
            }
            
           
        }
  • 這個和上面用的也是同一個(我覺得這個比較好用一些)

 

/// <summary>
                /// 將PDF文檔轉換為圖片的方法
                /// </summary>
                /// <param name="pdfInputPath">PDF文件路徑</param>
                /// <param name="imageOutputPath">圖片輸出路徑</param>
                /// <param name="imageName">生成圖片的名字</param>
                /// <param name="startPageNum">從PDF文檔的第幾頁開始轉換</param>
                /// <param name="endPageNum">從PDF文檔的第幾頁開始停止轉換</param>
                /// <param name="imageFormat">設置所需圖片格式</param>
                /// <param name="definition">設置圖片的清晰度,数字越大越清晰</param>
        public static void ConvertPDF2Image(string pdfInputPath, string imageOutputPath,
      string imageName, int startPageNum, int endPageNum, ImageFormat imageFormat, Definition definition)
        {
            PDFFile pdfFile = null;
            FileStream fs = null;
            try
            {
                fs = new FileStream(pdfInputPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                pdfFile = PDFFile.Open(fs);

                if (startPageNum <= 0)
                {
                    startPageNum = 1;
                }
                if (endPageNum > pdfFile.PageCount)
                {
                    endPageNum = pdfFile.PageCount;
                }
                if (startPageNum > endPageNum)
                {
                    int tempPageNum = startPageNum;
                    startPageNum = endPageNum;
                    endPageNum = startPageNum;
                }
                string path = imageOutputPath + imageName + "1" + "." + imageFormat.ToString();
                Logger.WriteLogs("PDFIMG:" + path);
                using (Bitmap pageImage = pdfFile.GetPageImage(0, 56 * (int)definition))
                {
                    if (!File.Exists(path))
                    {
                        using (FileStream f = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
                        {
                            pageImage.Save(f, ImageFormat.Jpeg);
                            pageImage.Dispose();
                        }
                    }
                }
                fs.Flush();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (pdfFile != null)
                {
                    pdfFile.Dispose();
                }
                else if (fs != null)
                {
                    fs.Close();
                    fs.Dispose();
                }
            }
        }

    public enum Definition
    {
        One = 1, Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10
    }
  • PDF轉Base64
  • /// <summary>
            /// pdf轉base64
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns></returns>
            public static string PdfWord_To_Base64(string filePath)
            {
                try
                {
                    if (!string.IsNullOrWhiteSpace(filePath.Trim()))
                    {
                        
                            FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate);
                            byte[] bt = new byte[fileStream.Length];
                            fileStream.Read(bt, 0, bt.Length);
                            fileStream.Close();
                            fileStream.Dispose();
                            return Convert.ToBase64String(bt);
                    }
                    else
                    {
                        return "請輸入正確的路徑";
                    }
    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    我主要也就用到這些,之後在發現,我在往上加  

  鏈接: https://pan.baidu.com/s/16xEpLBJ3-8fGjNPyvHUSmA

  提取碼: p9qi

  這個是O2S.Components.PDFRender4NET的文件,我看評論里有問的,之前忘記發了,網上有的是收費的,Nuget裏面帶後綴的我沒用過。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

又要到處浪又要省油,有這種好事?這5款車就行

以不到30萬的價格買到一輛混動的大7座SUV,還要什麼入門BBA。再來看看同樣換新顏、尺寸大一號的全新秦pro,新車搭載一套由BYD476ZQA型1。5T發動機、電動機和鋰電池組構成的插電式混動系統后,工信部申報綜合油耗僅為1升/百公里。

前幾天正巧試駕了朋友剛提不久的雷克薩斯CT200h,除了非常不錯的操控感和車身動態表現之外,讓我印象最深刻的就是油耗,在一頓猛踩和駕駛模式來回切換之後,平均油耗也不過7L/百公里,我相信還有其他車主做出了更漂亮的數據。

雖然當初一早就布局混動車型市場的CT200h並沒有因此而大賣,但發展到今天,隨着混動技術的不斷成熟和國內市場政策的風雲變幻,已經有越來越多的消費者被混動車型的諸多優勢所打動,比如省油、安靜、駕駛體驗等等。所以今天就給大家盤點一下,北京車展之後都有哪些混動車型是值得消費者密切關注的。

1、卡羅拉/雷凌pHEV插電混動版

卡羅拉和雷凌可以說是豐田的兩個“開掛”車型,從燃油版到HEV油電混動版(雙擎)從來都不愁賣,而此次北京車展上豐田終於兌現了兩年前的承諾,在國內正式發布了卡羅拉/雷凌pHEV插電混動版車型。

這兩款新車可以說是含着金鑰匙出生的“富二代”,畢竟豐田多年以來經營的品牌形象、技術實力和市場口碑為這二者打下了堅實的銷量基礎,所以目測上市后月銷1萬輛是基本操作,想要入手的朋友們可要盯緊了。

在外形上兩款新車與普通版的差別並不大,僅針對細節進行了微調,比如車頭和車尾部分都加入了藍色元素。此外,由於插電混動版搭載了更大容量的電池組,所以內部空間與普通版車型稍有差異。

值得一提的是,這兩款車屬於中國特供車,意味着自帶銷量BUG,並且其搭載了1.8L自然吸氣發動機+電動機組,同時還配備容量為9-13kWh的鋰離子電池組,純電動條件下的續航里程可超過100km。

這是神馬概念?起碼就目前我國市場上銷售的插電混動車型,大部分純電動續航里程都只在50-80km以內,並且考慮到緊湊級車推出pHEV版本的多是自主品牌車型,而它們的老對手軒逸、朗逸等還沒加入這個市場,所以此次亮相的卡羅拉和雷凌pHEV版本只要定價合適,銷量應該不成問題,別忘了它們還可獲得一部分政策補貼哦(雙擎版本沒有)。

2、領克01 pHEV插電混動版

說領克01 pHEV版之前必先提一提燃油版領克01,這款車型自去年11月上市以來便憑藉優秀的做工和沃爾沃技術的加持迅速圈粉,獲得市場的好評如潮。本以為領克會按部就班、穩紮穩打地推出新能源產品,不過眼看WEY氣勢洶洶地推出了p8之後,領克怕也是坐不太住了,於是便適時地推出了領克01 pHEV版。

在外觀和內飾方面,該車和之前的燃油版車型基本相同,只是在前進氣格柵以及前翼子板處增加了藍色元素進行點綴,表明其新能源型的身份。而尾部右下側還貼有“01 pHEV”的字樣。

動力方面,領克01 pHEV則搭載了1.5T發動機和電動機所組成的插電式混合動力系統,發動機最大凈功率約180馬力,動力電池為鎳鈷錳三元鋰離子電池,官方宣稱該車的百公里油耗僅為1.8L,同時其純電動模式下最大行駛里程為51km。如果想要入手朋友,其量產車型最快會在今年年內上市,所以準備好鈔票就是了。

3、比亞迪唐DM/秦pro

我們都知道,自從前奧迪設計師艾格入主比亞迪之後,旗下打頭陣車型瞬間秒變高富帥,就連之前被人嫌棄的“BYD”都多了一個洋氣的註釋–Build Your Dream!如果你還沒什麼畫面感的話,在此貢獻兩張圖讓大家感受一下:

了解更多點擊視頻:

全新一代唐从里裡外外都整了個遍,多了幾分國際范。首先在外觀上採用了家族最新的Dragon Face設計語言,整體大氣而又十分吸睛;

內飾同樣話題性十足,其中最搶眼的部分當屬中控可90°旋轉的超級大屏,同時全液晶儀錶和藍色氛圍燈增加了車內的科技感。

動力方面,其將搭載2.0T發動機與電動機組成的插電式混動系統,系統綜合最大功率超過500馬力,而高配車型百公里加速僅需4.5秒,咳咳划重點了–奔馳GLC43 AMG的成績為4.9秒。

值得一提的是,新一代唐標配7座布局,其長寬高分別為4870/1940/1720mm,軸距為2820mm,相比上一代車型在軸距和寬度上有所增加,所以能帶來更寬敞的乘坐體驗。另外在此次北京車展,新一代唐公布預售價–補貼后25萬起步。港真!以不到30萬的價格買到一輛混動的大7座SUV,還要什麼入門BBA!

再來看看同樣換新顏、尺寸大一號的全新秦pro,新車搭載一套由BYD476ZQA型1.5T發動機、電動機和鋰電池組構成的插電式混動系統后,工信部申報綜合油耗僅為1升/百公里!並且根據車尾標判斷,新車的官方百公里加速時間或為5.9秒,看來是充分體現了什麼叫“雨露均沾”了。

4、廣汽謳歌CDX混動版

每每提到謳歌這個品牌,總有兩道跨不過的坎,一個是跟長安LOGO抹不去的姻緣,另一個就是跟隔壁家的雷克薩斯比境遇,很顯然以上兩項都是招黑的。不過也必須承認,痛定思痛的謳歌如今似乎也有點重新步入正軌的意思了。

在此次北京車展,廣汽謳歌就帶來了CDX的混動版本,並且從售價上看還是蠻有誠意的。新車共推出了三款車型,售價區間為29.98-35.28萬元,同時新車外觀顏色增加磨砂皓灰和混動版專屬的藍紫色車漆,內飾則增加了紅色內飾可選,而頂配版車型還將增配Acura Watch。

畢竟謳歌也是“本田大法”的受益者,所以混動版車型相比同級別對手的較大優勢就體現在動力系統上。新車將搭載本田的i-MMD混合動力系統,其由一台2.0L的阿特金森循環自然吸氣發動機、由驅動電機和發電機組成的“電動CVT”直驅傳動機構、動力控制單元及鋰電池組等組成。

這套系統可以根據負載和使用條件的不同,在純電動、混合動力和發動機直驅三種模式之間無縫切換。參數方面,2.0L發動機最大功率146馬力,混動系統綜合最大功率215馬力,而官方公布的綜合油耗為5.0L/百公里。所以三十萬買一台省油的豪華SUV,好像很不錯的樣子!

5、雷克薩斯ES混動版

此次北京車展雷克薩斯的展台只放了兩台車,沒錯!只有兩台!在大多數人看來這就是典型的“寒酸”,而在雷粉眼裡這就叫“傲嬌”,因為雷克薩斯選擇把ES混動版的全球首發放在了中國,雖說一直不願意國產,雖說看展的觀眾不一定get到這樣做的用心良苦,但足以說明其對中國市場的看重。

雷克薩斯全新一代ES基於TNGA平台打造,除搭載全新2.0L發動機外,還配有2.5L多級混合動力系統,也就是全新凱美瑞上用的那一套,沒錯,就是傳說中41%熱效率的那一款名機。同時它還搭載了結構更緊湊的全新一代E-CVT电子無極變速系統,以及布局更為合理的鎳氫電池組。另外,最高純電巡航時速由前一代的75km/h提升到120km/h。

如想了解更多,點擊下方視頻:

結語

從當初雷克薩斯CT200h的“天生異質”,到如今各家廠商混合動力車型的日漸成熟,可以說能活下來的、能在市場上銷售的技術都是好技術。不管是自主品牌的比亞迪、長城、吉利,還是合資品牌的兩田,甚至是進口品牌,都在加緊布局新能源戰線,所以這對我們消費者來說無疑是個大利好。至於混動車型值不值得買這樣俗套的話題,我想就不用多糾結了,畢竟買車從來都是按需購買的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

最高優惠8萬,這款20多萬的SUV牌子超硬,車主卻說…

6/7百公里油耗(L):6。5/7。3車主百公里油耗(L):9。08/10。5驅動方式:前置前驅/前置四驅底盤懸挂:前麥弗遜/后多連桿實際體驗(體驗者182cm):前排頭部3指/後排頭部3指/後排腿部1拳。感興趣的朋友可以點擊小程序查看詳細口碑,從口碑中可以看到車主們對奔馳GLA的內外設計可謂相當滿意,也稱它為適合年輕人代步的車型。

奔馳GLA類似跨界SUV的車身結構極富有衝擊力,動感化的車身設計語言,還能給用戶帶來一些柔美的觀感體驗!

而比較特別的是,GLA的坐姿並不高,較低的車身重心帶來更充足的操控信心。它的1.6T車型的動力在D擋模式下被調得頗為平順,而在S擋模式下,動力則靈敏不少,動力輸出變得強勁起來!駕駛起來也挺有樂趣的。

長寬高:4449*1804*1535mm

軸距:2699mm

定位:緊湊型SUV

在形象方面,奔馳GLA輪廓飽滿、線條充滿力量感,更展現運動與時尚,相對低矮的車身運動氣息強烈!

內飾方面它不僅做工細緻且設計也有不錯的豪華氣質,獨立是中控屏查看便利,值得一提的是它採用個性的多個圓形空調出風口,精緻感得以體現!

發動機:1.6T/2.0T

最大馬力(pS):156/184/211

最大扭矩(Nm):250/300/350

變速箱:7DCT

百公里加速(s):8.5/7.6/7

百公里油耗(L):6.5/7.3

車主百公里油耗(L):9.08/10.5

驅動方式:前置前驅/前置四驅

底盤懸挂:前麥弗遜/后多連桿

實際體驗(體驗者182cm):前排頭部3指/後排頭部3指/後排腿部1拳。

感興趣的朋友可以點擊小程序查看詳細口碑,從口碑中可以看到車主們對奔馳GLA的內外設計可謂相當滿意,也稱它為適合年輕人代步的車型!只是對於車燈光源、頭部空間、懸架的軟硬程度有些不滿。

咱們發現奔馳GLA的優惠幅度相當可觀,在廣州、武漢、上海等地優惠幅度較大,但需要搭配加裝飾、購買精品、店內上保險、貸款等項目。所有實際能優惠多少還是因為各個地區而有所差異,各位在購車前可要注意了。

奔馳CLA的內外設計頗有特色,內飾大面積銀色裝飾的運用、鍍鉻的出風口加上懸浮的中控大屏都彰顯檔次感!而且操控性也不錯,只是低配車型的配置不算太高,如果價格適宜的話選擇中配車型更加實用!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

這款帥氣SUV僅8.98萬起步,還能免幾千塊稅費,值嗎?

另一款是最大功率為90kW,這款動力強,0-50km/h加速為4。2秒,極速135km/h,但續航里程只有252km。江鈴E400前麥弗遜后扭力梁的懸挂也是小型SUV的標配。后扭力梁懸挂結構緊湊,可以將空間留給乘客。江鈴E400的加速響應不是很快,地板油下去,加速度會慢慢提升,到達頂點的時候又會立刻下降,跟汽油車非常不同。

4月30日,江鈴E400正式上市,補貼后的售價為8.98萬-10.98萬(全國統一價格)。同天下午,我們有幸試駕這款純電動SUV—江鈴E400。說實話,我原本有點擔心純電動車高重量的特性會拉低整車的駕駛和乘坐感受,但實際體驗下來,純電動車在某些方面反而有所提升。另外,純電動車前期購買免購置稅,免拍牌費,後期超低使用成本。讓直呼,我還買什麼汽油車。在下文就磕叨磕叨為什麼。

江鈴E400的車身尺寸並不大,屬於小型SUV的範疇。由於小型SUV多數是面向年輕人的產品,所以江鈴E400的外觀也有不錯的設計感,側面雙腰線的組合令整車充滿動感,起伏有致的尾部與車頭互為呼應。整車的外觀顏值算比較高的。

江鈴E400的內飾簡潔,用料非常豐富,基本上與人體接觸的地方都用軟性材料包裹。全液晶儀錶盤信息豐富,但是設計感略為不足,比較重要的時速,剩餘電量,續航里程不夠顯眼。另一個問題是,把坐姿調高一點,是看不到儀錶盤轉向燈的指示,只能將座椅調低。希望下一個版本能夠改進。7英寸的中控屏採用了安卓系統,未來可以通過網絡升級系統,目前的功能不多,但是導航,音樂,藍牙電話,電台這幾個基本配置還是有的。

乘坐空間是江鈴E400的優點,1米75的乘客在前排可頭部有1拳以上的空間。同一位乘客在後排可以獲得兩拳以上的腿部空間,一拳以上的頭部空間。另外,後排中央地台全平,後排中間座椅也沒有凸起。江鈴E400可以保證5個成年人獲得不錯的乘坐空間。

江鈴E400有兩款動力配置,一款是最大功率為50kW的電機,這款動力弱一點,0-50km/h加速小於6秒,極速120km/h,但是續航更長,達到310km。另一款是最大功率為90kW,這款動力強,0-50km/h加速為4.2秒,極速135km/h,但續航里程只有252km。

江鈴E400前麥弗遜后扭力梁的懸挂也是小型SUV的標配。后扭力梁懸挂結構緊湊,可以將空間留給乘客。

江鈴E400的加速響應不是很快,地板油下去,加速度會慢慢提升,到達頂點的時候又會立刻下降,跟汽油車非常不同。江鈴E400的坡道輔助邏輯也很有趣,會先溜后一段,然後剎住。江鈴E400沒有怠速這一功能,起步必須踩油門才能走,不支持蠕動。這兩個點是需要加強的地方。

江鈴E400的駕駛和乘坐舒適性方面確實給了我很大的驚喜。試駕前,我認為過重的車身會讓懸挂很難找到平衡點,太硬,舒適性差,太軟,點頭嚴重。實際上,我之前是想錯了一點。純電動車將電池裝在前後軸之間,所以前軸和后軸的重量布置更加均勻,不會因為車身重了而加重前軸的負荷。所以江鈴E400的舒適性和操控性都得到了很好地保障。後排舒適性比前排稍差。

江鈴E400的隔音水準一般,而且配置上寫好的隔熱玻璃也不太隔熱,下午被曬得好燙,這有可能是試裝車的緣故。

慣例附上充電速度。

總結:江鈴E400在大方面其實是做得很出色的。整車的空間、舒適性、操控性跟燃油車相比不落下風。但是江鈴E400的小細節上有些粗枝大恭弘=叶 恭弘,所幸的是,這些點可以通過後期軟件的升級來完善。江鈴E400的續航里程可以滿足市區代步,周末短途旅行的需求。個人認為,如果你99%的情況都是在城市生活,一款純電動車會比汽油車來得更加省心省錢。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

※產品缺大量曝光嗎?你需要的是一流包裝設計!

同是2.0T+7速雙離合,為何那麼多人放棄大眾買貴4萬的豪車?

我曾經從一位一汽的裝配工口中聽過這樣一句話:大眾的車底盤焊縫要求不能伸進指甲就合格,但是。奧迪的要求是不能伸進頭髮。上面我們說到了兩車的造車成本以及測試種類,那就不免出現一個更加專業名詞——NVH,直白一點說就是車輛的胎噪,風噪和發動機噪音。

在如今這個車水馬龍的城市中,滿大街都是車,而車一多,咱們買車選車就自然變得更加困難了。而且中國人買車需要的可不單單隻是性價比,更需要的是面子,並且一定要大。

特別是當BBA這種豪華品牌不斷的將車型價格下探之後,吸引了更多的中國人可以花普通品牌的價錢買到掛着“豪華品牌商標”的汽車,這也是為什麼如今奔馳、寶馬、奧迪這些車會滿大街跑的原因。

當然,相比起豪華品牌的紙醉金迷,普通品牌的優勢更多在於極高性價比。不過不可否認的是,豪華品牌的品牌溢價能力,的確是普通品牌無法比擬的。

並且豪華車除了可以給人帶來身份的象徵,還帶來了更極佳的駕乘感受,畢竟“豪華”兩字已經說明了一切。如今各類豪華品牌的入門車型售價,儼然已經可以跟普通品牌針鋒相對了。

那在面對預算有限的情況下,到底是咬咬牙弄台豪華品牌,享受一下豪車帶來的優越感呢,還是輕鬆的拿下普通品牌,得到其極具性價比配置的同時還能多買幾台蘋果XXX呢?

如果有一天,你開着一輛頂配大眾高爾夫GTI去相親,對方父母只會認為你混得一般,但是當你開着一輛掛這“四個環”的丐版奧迪A3去相親,人家則會認為,這家孩子不錯,年紀輕輕就開得起奧迪了。

一輛頂配的GTI比起低配的奧迪A3,怎麼著也得貴上好幾萬吧,但是為什麼人人都會認為奧迪更高級呢。

奧迪嘛,在國人心目中一直存在着“官車”的形象,而大眾則是普羅大眾都消費得起的存在。而且再怎麼說你也只是大眾,我可是奧迪啊,世界公認的三大豪華品牌之一,買車看的不正是牌子,面子嘛!

不過很多朋友都認為,A3其實就是換標高爾夫,而且那個標還不便宜。那這次咱們就以高爾夫GTI以及奧迪A3兩廂頂配來說話。到底用幾台蘋果XXX的錢去買一個四環標值不值得?

目前兩車在廣州的裸車價基本是:奧迪A3頂配23萬左右,高爾夫GTI19萬左右,也就是四萬左右的差價,雖然不同地區情況不同,不過差價相信基本也是相差無幾。

相信有了解過這兩款車的朋友都知道,兩者同為一汽旗下合資公司的產品、同是MQB平台、同一工廠生產、相同的EA888發動機、相同的變速箱。聽起來兩者的差異性極小,但是細分之後你就知道還是有區別的。

相同的EA888發動機,在奧迪A3頂配身上只能輸出190匹馬力,但是在GTI身上則能爆發出220馬力。兩者都匹配了7速雙離合變速器,不過在大眾身上叫DSG,在奧迪身上喊S tronic而已。

從平台上看,兩者均出於MQB橫置模塊化平台,這就不難讓人認為兩者的底盤變現以及操控性上是不是一致呢?事實卻並非如此。就好比一台計算機,平台就如同一個主板,再裝配不同的顯卡,聲卡,內存,CpU,不同搭配所得出的效果自然也是截然不同的。

另外,雖然奧迪有着品牌溢價,但相對應的供應商也會與大眾有所區別,零配件的成本也會相應的提高,並且在裝配工藝上奧迪也高於大眾。。單單從用漆方面就可以看得出這點,奧迪A3大部分採用的均為高成本、高品質的珠光漆。

還有奧迪需要做的測試種類,無論是整車測試還是零部件試驗的嚴苛程度,複雜性,精密度,都遠遠高於大眾。我曾經從一位一汽的裝配工口中聽過這樣一句話:大眾的車底盤焊縫要求不能伸進指甲就合格,但是………奧迪的要求是不能伸進頭髮!!!

上面我們說到了兩車的造車成本以及測試種類,那就不免出現一個更加專業名詞——NVH,直白一點說就是車輛的胎噪,風噪和發動機噪音。從各大測評機構的測試結果都不難看出,奧迪A3對NVH的把控要比高爾夫好,另一方面也表明了,豪華品牌在駕乘感受上下的功夫要比大眾這種普通品牌更多。

至於外觀,咱們就略過不說了,反正蘿蔔青菜各有所愛,奧迪自帶四環光環,高爾夫GTI則滿身情懷。內飾的話,GTI也不能說完敗,只能說那萬年不變的布局真的讓人又愛又恨,而A3的內飾那才真的稱得上人人喜愛,既精緻又簡潔還顯高級感,而且細看內飾的做工用料,無論是視覺的衝擊力還是觸感的細膩度上,相信什麼叫奧迪,什麼叫大眾自然一目瞭然了。

不過在配置的差異上,奧迪A3比起GTI似乎真的閹割太多了,要知道那可是四萬塊的差價啊。此外,奧迪選裝配置的價錢也非常感人,一套真皮座椅就小一萬了,估計想選裝到GTI這麼豐富配置的時候你就得多掏幾百張毛爺爺了,不得不說奧迪這生意還真好賺!

估計看到這裏,大家都不難得出一個結論:奧迪A3當然不是換標高爾夫那麼簡單。

儘管GTI的馬力、配置都比A3更優越,但是從用料做工、質感品控、駕乘感受方面來看,A3比起GTI則是更勝一籌。終究是豪華品牌嘛,還是會有自己的擔當,哪怕是十幾萬起步的入門車型,他們都會用心去對待。所以與其說多花了幾萬塊錢要裝逼買個豪華商標,倒不如老老實實的承認“一分錢一分貨”這個道理。

再舉個例子,如果奧迪A3賣着高爾夫的價錢,我估計你也不大敢買吧?又或者說,奧迪如果把A3的價格降低到高爾夫這個層次,我相信一定會大大衝擊高爾夫的銷量,而且奧迪作為豪華品牌的形象也會因此大打折扣。在汽車界,類似的例子比比皆是,所以單單拿平台來說事,似乎就有點無稽之談了。

至於遇到類似的問題該怎麼去選擇,那就只能看個人需求以及兜里毛爺爺的多與少啦。反正有錢的話,那必須選豪華品牌,去酒吧把鑰匙往桌子一拍,嘿嘿,那效應老司機都懂都懂!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

玩車的人都在捧的本田發動機,真的這麼神?

然而,這種熟悉的“爆tec”感覺沒有出現在最新的謳歌TLX-L上。謳歌是本田的豪華品牌,一切的用料,技術,做工等都用上高標準。就連本田被人詬病的隔音謳歌也能做得安靜。被拉高轉的本田發動機“爆tec”時的感覺聲音和動力都有着明顯變化,讓人為之興奮,但開着謳歌TLX-L卻沒有這種感覺。

本田,一個無人不知無人不曉的一個汽車品牌。尤其是在廣東地區,更是本田粉活躍的地方,大街上跑的10輛車中,有4輛或5輛是本田車型。

買本田車,除了買質量可靠性外,更多的是為了“買發動機送車”,而坊間也流傳着本田金句VTEC is the best。可想而知,本田發動機技術含量和民望有多高。

本田發動機的看家技術VTEC和i-VTEC技術外,在近年也推出VTEC Turbo這渦輪組合技術。

那本田技術牛在哪?主要除了有可變氣門正時外,還有氣門升程這一技術。氣門升程技術並不是很多發動機有,除了寶馬和英菲尼迪VQ37系列外,還真是寥寥無幾。

開過本田的人未必知道什麼叫“爆tec”,但拉過高轉的人就知道。當發動機轉速拉到5000轉左右的時候,聲音突變,發動機也感覺顫抖一下。這就是“爆tec”給人的感覺。

然而,這種熟悉的“爆tec”感覺沒有出現在最新的謳歌TLX-L上。謳歌是本田的豪華品牌,一切的用料,技術,做工等都用上高標準。就連本田被人詬病的隔音謳歌也能做得安靜。

被拉高轉的本田發動機“爆tec”時的感覺聲音和動力都有着明顯變化,讓人為之興奮,但開着謳歌TLX-L卻沒有這種感覺。難道就因為高端車型而被“技術”隔絕?

其實這種“爆tec”的感覺在自主品牌的渦輪車上有着“更好的體現”。只不過我們吐槽它而已,這一技術就是渦輪遲滯。體驗過大部分自主品牌渦輪車,輕踩油門不去,踩重一點像是被踢出去的感覺。這種感覺比“爆tec”還爽快。

總結:高轉“爆tec”還是低轉渦輪介入明顯,都使得發動機動力輸出沒那麼“線性”。只是拉高轉的時候,亢奮的聲音和動力的凸顯使得“爆tec”的感覺被神化。渦輪介入明顯,其實就是“爆tec”時動力凸顯的一部分,只是沒有亢奮的聲音罷了。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益