使用 TeamCity 實現 Auto Build ~~進階設定篇

繼上一篇針對Bitbucket與TeamCity的設定後,我們大致上已經完成了Project整合的部分,接下來這一篇會來實作算是比較進階的設定

  • GitServer即時通知TeamCity Build Project
  • TeamCity Auto Build完成之後,幫我們Auto Deployment到 TomCat
  • 信件通知

Part 1. GitServer即時通知TeamCity Build Project 

我們這邊依樣事先用BitBucket來做測試,而我們會使用到的設定就是Webhook(意指鉤子),我們需要透過這個鉤子去通知TeamCity有新的Commit,接著我們就開始來設定

step 1. 我們一樣先登錄我們BitBucket的網頁,點選專案下面的設定,接著點選Webhooks >> Add Webhook

螢幕快照 2018-02-04 下午8.13.27

step 2. 接下來的畫面我們需要輸入TeamCity提供給外部Server呼叫的Url 格式範例,更多的Api可以參考官網的介紹

如下圖

  • <user name> : Teamcity 的帳號
  • <user password> : Teamcity 的密碼
  • <server address> : Teamcity 的url
  • <build configuration Id>: Teamcity 專案build id

範例如下

其中<build configuration Id> 大家可已到Teamcity Web ,Project > build > General Setting就可以看到build configuration Id

螢幕快照 2018-02-04 下午8.37.17

輸入完Url後我們就可以點選Save,這時候我們可以試著Push Code 到 Bitbucket ,Bitbucket就會透過Webhook的設定即時通知TeamCity程式碼有被修改,TeamCity就會自動當我們執行該Project的Build Agent,這樣的設定是不是比原本透過TeamCity本身的Trigger聰明多了呢?!

Part 2. TeamCity Auto Build完成之後,幫我們Auto Deployment到 TomCat

這個功能應該可以說是我們整合的最後一步,就是TeamCity可以幫我們自動Deploy,而這邊我們先用Tomcat來做設定

step 1. 我們先到TeamCity >> Project >> Build Step的設定,點選Add Build Step

螢幕快照 2018-02-04 下午8.58.42

step 2. 接著會到Build Step的設定頁面

  1. Runner Type : 選擇Container Depolyer
  2. Target : Tomcat Server 的 url
  3. Container Type : 選擇Tomcat的版本
  4. username : tomcat 的帳號(必須要擁有manager-script 的角色)
  5. Password : tomcat 的密碼
  6. Path to war archive : build完成後,產生的War檔位置

輸入完相關設定後就可以點選Save

螢幕快照 2018-02-04 下午9.01.02

最後我們就可以開始測試囉~~~

ps. 因為目前TeamCity只提供tomcat的container,其他的例如jboss,spring boot等…專案我們也可以透過Runner Type 選擇Command Line or SSH Upload的方式來達到Auto Deploy的目的喔!

part 3. TeamCity mail 通知

TamCity 可以幫我們Auto Build , Auto Deploy那可不可以寄信通知Build成功或失敗呢?當然是可以的喔~最後我們就來設定信件通知吧!!!

step 1. 首先我們先到Administrator的Email Notifier的設定

螢幕快照 2018-02-04 下午9.27.36

smtp server這邊是用Gmail的來設定,當然也可以自己架設一個smtp server(比較麻煩XD),我們只要準備一個gmail 帳號

  • SMTP host : smtp.gmail.com
  • SMTP port : 587
  • Send email messages from : gmail 信箱
  • SMTP login : gmail 信箱
  • SMTP password : gmail密碼
  • SMTP connection : StartTLS

設定完我們可以點選Test connection測試一下設定是否可以成功寄信喔!如果測試沒問題點選Save,到這邊我們已經完成了smtp Server的設定

step 2. 接著我們要針對使用者來設定各自的寄信規則,我們先到Teamcity的使用者設定>>Notification Rules>>Add Rules

螢幕快照 2018-02-04 下午9.43.21

接著選擇該使用者需要收到通知的專案,以及通知的狀況,選擇之後點選Save

螢幕快照 2018-02-04 下午9.47.46

最後大家就可以收到TeamCity的信件通知囉~~如此一來我們Push上去的Code就有一套很好的機制幫我們Build and Deploy如果有錯誤也可以即時寄信通知我們,這樣是不是讓我們在專案的開發上可以更得心應手呢?!

TeamCity的介紹到這一篇大概也要告一個段落了,如果有什麼錯誤的地方也請各位前輩多多指教,當然還有許多更進階的功能可以使用,如果之後有用到什麼好用的功能再上來跟大家分享喔~~~

 

Facebook Comments

軟體開發 之持續整合 Continuous Integration 簡介篇

– 前言

相信在目前的軟體工作環境裏,每一位開發人員都會用到一些版本管理工具,如 Git/SVN/VCS 等。(*當然,偶爾還是會看到傳說中的「資料夾管理法」 ~~~ XD

時賦科技 - 資料夾版本控制法
資料夾版本控制法

– 主旨

有了版本控制軟體之後,基本上我們就能共用同一份程式碼,並且從Log能知道是誰,在何時改的程式碼(*人是誰殺的) ~

時賦科技 - git log

不過… 我們透過版本管理軟體 取得最新的程式碼時,我們並無法確定 程式是否可以正常編譯?!
導至有時一早進辦公室就會遇到 編譯問題/Compiler Error ~ (*曾有朋友反應,因此他都很晚進公司~ XDD)

有沒有一種方式,可以程式工程師能安心(也專心地)開發程式 。
就算程式裏的語法上有錯誤 ~ 也可以在寫入(版本控制)時 能立即通知。(如下)

時賦科技 - Auto Build Email 通知

 

在這種時候,我們就需要一些輔助工具可以達到這種功能,所謂的 Continued Integration (我們這邊稱它 持續整合工具)

如圖,
CI Tools by APPX

目前我們常聽到的工具 大概就都在圖上,主要像 Jenkins, TeamCity, Travis CI, Bamboo 等。 對CI 界,排名前八大有興趣的可以看這裏

– 專案實作考量

這次,我們考量的點 有以下幾項
一、新建立的 Build Server 能連接到 Bitbucket Git Server (幾乎每家都可以~)
二、能夠支援 .net 以及 Java 程式碼 (*因為我們的案子主要以這兩種語言為主)
三、最少能週期性的Pulling 檢查 是否有最新的更新(code commit) ;
最好的情境 應該不要一直問Git,而是當Bitbucket有更新時 主動通知 Build Server,再進行編譯動作。

四、能夠將編譯的結果 盡快通知給團隊人員或是負責人,如 email。(*最好還可以看到程式的diff 差異)

五、費用考量 ~ (*free 當然很好,不過如果需要一些費用而提供多一點的功能 也是可以接受的~ 畢竟,就像投資一樣,投的好,相對的回收一定會更好的 ~)

六、(*非必要性) 支援  SSO/LDAP 整合

在看了以上的工具 及加入所有考量的情境之後,我們決定先採用 JetBrain 的 TeamCity 試試看 ~
最起碼看了官網上的介紹(*連結) 最起碼前面一到五項,相信是沒問題的 ~
(*google的 Android Studio 好歹也是從這家公司的IDEA J 衍生出來的,相信不會差到哪裏去)

甚至在2017年中間推出的版本裏,它還支援 docker, .net CLI, Kotlin DSL project 等 ~
相信對一般的開發團隊應該很足夠,再者  去年還放寬了免費版的限制
(從 20 build config -> 100 build config)
這家軟體商真的是佛心來著 !!!

詳細的功能介紹 請見官網說明(*網址: https://www.jetbrains.com/teamcity/features/

接下來的幾週,就讓我們以實際使用的過程 來分享給各位 ~
預計會有
一、TeamCity 安裝篇 (*已完成)
二、TeamCity 設定篇
三、TeamCity 進階設定篇

希望大家在軟體開發的生活裏能夠更輕鬆,將時間用在更珍貴的地方 (如喝咖啡,逛fb  等美好的事物上~ XD)

時賦科技 - 美好的事物
比如像這樣 ~

Cheers ~

Facebook Comments

使用 TeamCity 實現 Auto Build ~ BitBucket設定篇

上一篇安裝好TeamCity Server後,我們就可以來實作Project整合的部分了,而TeamCity也支援常見的Git Server( BitBucket,Github ………. ),在這篇實作的部分我是選擇BitBucket來當作我的Git Server,接下來就進入TeamCity 與 BitBucket設定的部分

step 1. 我們先登入TeamCity Web 接著點選右上角的Administrator 接著點選 Create Project

螢幕快照 2018-01-21 下午10.36.47

step 2. 接著我們選擇 From BitBucket Cloud

螢幕快照 2018-01-21 下午10.41.55

step 3. 因為還設定過BitBucket的Connection所以系統會自動幫我們導向設定Connection的頁面

螢幕快照 2018-01-22 上午10.28.45

step 4. 因為需要BitBucket的 key and secret來驗證連線,所以我們先登入BitBucket來取得key and secret ,我們點選BitBucket DashBoard左下角的BitBucket Setting

螢幕快照 2018-01-21 下午10.50.10

step 5. 接著點選OAuth

螢幕快照 2018-01-21 下午10.54.34

step 5. 點選 Add consumer

螢幕快照 2018-01-21 下午10.55.05

step 6. 填入相關資訊,選擇所需權限後點選save

ps. Callback url ,url ,Permissions可以照TeamCity Connection設定畫面上面的黃底提示填入即可

螢幕快照 2018-01-21 下午11.05.52

step 7. 回到OAuth的頁面後我們就可以看到Key and Secret

螢幕快照 2018-01-21 下午11.13.33

step 8.接著把Key and Secret填入TeamCity Connection 設定的頁面,然後點選Save

螢幕快照 2018-01-21 下午10.42.48

step 9. 接著就會回到Create Project的畫面,下面會出現Sign in to BitBucket的按鈕點選它

螢幕快照 2018-01-22 上午10.33.28

step 10. 登入BitBucket後就會出現BitBucket確認是否授權給TeamCity的頁面,我們點選Grant Access

螢幕快照 2018-01-22 上午10.33.54

step 11. 畫面回到Create Project會發現我們BitBucket上面的Project已經被載入了,接著我們就選擇我們要Build的專案

螢幕快照 2018-01-27 下午10.18.23

step 12. 接著會出現以下畫面,輸入密碼接著點選Proceed

螢幕快照 2018-01-27 下午10.32.09

step 13. 接著會出現以下畫面,點選Proceed

螢幕快照 2018-01-27 下午10.38.54

step 14.  接下來TeamCity會自動配置Build step,我們可以直接選擇TeamCity幫我們配置好的,當然也可以自己手動設定,設定好之後Use select

螢幕快照 2018-01-27 下午10.48.19

step 15. 接下來在以下畫面我們就可以看到有一個Bulid step,這時候我們可以點選上方的run執行看看

螢幕快照 2018-01-28 上午2.18.41

step 16. 接著我們可以點選上方Project選取自己專案接著點選Build,就可以看到Project Build成功或失敗囉~~~

螢幕快照 2018-01-28 上午2.38.35 螢幕快照 2018-01-28 上午2.38.55

step 17. 最後大家應該都會覺得,每一次Push Code都要自己來點選Run很不聰明,而TeamCity這邊也有提供trigger的功能可以去設定時間固定去判斷GitServer是否有新的Commit產生 ,依照下圖進入設定頁面

PS .TeamCity已經幫我們預設會有trigger了,所以我們只需要調整我們的時間即可

螢幕快照 2018-01-28 上午2.50.01

step 18. 可以選擇Globle或是選擇該專案自己的設定,這邊我們把時間設定成5秒方便測試,修改完儲存就可以囉~~這時候我們Push Code後就可以看到TeamCity會自動幫我們Build Code了~

螢幕快照 2018-01-28 上午2.50.35

PS.  下圖提供Globle的時間設定~

螢幕快照 2018-01-28 上午3.15.36

以上我們已經完成了Auto Build的設定了~但對我來說還是有美中不足的地方

例如:

  • 需要用Trigger去偵測是否有新的Commit,可否讓GitServer即時通知呢?
  • Auto Build完成之後,可以幫我們Auto Deployment到 Web Server呢?

下一篇我們就會開始實作以上兩個主題,讓我們的整合可以達到最大的效益~~

APPX 時賦科技介紹的CI整合真方便
一起獲勝吧 !
Facebook Comments

使用 TeamCity 實現 Auto Build ~ 安裝篇

因為工作上專案需求所以有機會接觸到 Java 專案整合的部分,也因此開始搜尋相關資料,最後決定使用TeamCity來實現 Java 整合,而我們想要達成的目標有下列幾項

  1. 當我們 push 至 git server 後,git server 去通知TeamCity
  2. TeamCity接收到通知後可以自動下載project 並且 build 該project
  3. 把打包好的project自動deploy到tomcat server
  4. 最後在寄信通知使用者 build 成功或是失敗

而此篇先簡單介紹TeamCity安裝的部分,如果有什麼地方有問題也請大家不吝指教

安裝環境

  • Windows 10
  • Jdk 1.8
  • TeamCity 2017.2.1( 下載連結 )
  • MS SQL 2014

安裝步驟

step 1. 開起安裝檔並且點選Next

螢幕快照 2018-01-19 下午4.27.51

step 2. 接下來幾個步驟都可以直接按下一步,安裝完之後就會出現輸入TeamCity Server 要走的 port(*可依個人習慣) 輸入完點選 next

螢幕快照 2018-01-19 下午4.35.22

step 3. 設定Build Agent(*用來執行project) ,在這個階段我們使用系統預設的可以直接點選 save

螢幕快照 2018-01-19 下午4.36.40

step 4. 接著要設定Server 及agent 的Service 帳號,在這邊我們都點選第一個就好,然後點選next

螢幕快照 2018-01-19 下午4.39.03 螢幕快照 2018-01-19 下午4.39.19

step 5.選擇在完成安裝後要啟動的Server

螢幕快照 2018-01-19 下午4.43.45

step 6. 最後點選 Finish 完成安裝

螢幕快照 2018-01-19 下午4.54.45

step 7. 在瀏覽器輸入 http://localhost:9998 >> 點選 Proceed

螢幕快照 2018-01-19 下午5.00.50

step 8. database type 的部分這邊選擇MS SQL Server,選擇之後會出現紅匡中的錯誤訊息(這是正常的因為沒有MS SQL Server JDBC的driver)

螢幕快照 2018-01-19 下午5.04.48

step 9. 我們到微軟官網下載MS SQL Server JDBC( 下載連結 ) 並且把

  • sqljdbc.jar複製到C:\ProgramData\JetBrains\TeamCity\lib\jdbc

PS. ProgramData >> 是隱藏項目,沒看到的話記得要去資料夾選項設定

螢幕快照 2018-01-19 下午5.15.31

step 10. 點選Refresh JDBC drivera ,這個時候就會出現成功載入JDBC的訊息

螢幕快照 2018-01-19 下午5.26.03

step 11.接下來我們需要到MS SQL新增一個TeamCity的資料庫

螢幕快照 2018-01-19 下午5.28.29

step 12. 接著填入資料後點選Procced就會開始建立資料庫的Table

PS. 在這邊還有可能會遇到無法連接到資料庫的問題 ,可以優先至SQL Server的組態管理員檢查TCP/IP是否有Enable

螢幕快照 2018-01-20 下午11.15.06

step 13. 建立好資料庫之後會自動導向這一個頁面>>紅匡處打勾>>點選contiune

螢幕快照 2018-01-20 下午10.09.26

step 14. 這時候就會進入要求建立一組帳號密碼的頁面,輸入完成點選creat acount

螢幕快照 2018-01-20 下午11.21.35

step 15. 最後會進入Team City Web的帳號設定頁面,到這裡Team City Server的安裝已完成

螢幕快照 2018-01-20 下午11.22.54

其實Team City的安裝並不會太複雜,只要一步一步的設定基本上是不會遇到什麼問題的,如果有遇到安裝上的問題也歡迎大家提出來一起討論

下一篇將會接著設定TeamCity 與 Git Server的連動~~~

Facebook Comments

Java Struts Web 初體驗~~~

近期因為負責的案子大多都是Java Web,所以也開始接觸了一些Java 的開源框架,也慢慢對Java有了更進一步的了解,而今天要介紹的就是Java Struts,Java Struts是一種走(MVC)架構的框架,跟之前學習過的Spring MVC在應用以及設定上其實有許多相似的地方,接下來就簡單的介紹一下Struts的Hello Worlds!!以及簡單的表單傳送~~~

  • 開發工具 : Eclipse Java Neon.3 Release (4.6.3)
  • Struts版本 : 1.3.10
  • Server : Tomcat 9.0

step 1. 先下載Structs1.3.10 ( https://struts.apache.org/download.cgi )

step 2. 接著我們先從Eclipse新增一個Dynamic Web Project

struts-1

step 3. 把剛才下載好的Struts 1.3.10( \struts-1.3.10-all\struts-1.3.10\lib ) 裡面的jar檔加入參考

  • 在專案folder上面點右,選擇Bulid Path >> Add Library

struts-2

  •  選擇User Libraries點選Next,將( \struts-1.3.10-all\struts-1.3.10\lib ) 裡面的jar檔加入

struts-3

struts-4

step 4. 到剛才下載好的Struts1.3.10,找到 struts-blank-1.3.10.war ( struts-1.3.10\apps ) 將副檔名改成*.zip 並且解壓縮 ,將裡面的檔案複製到專案的WebContent下面

struts-5

這個是一個空白的範例~可以直接使用~裡面包含了核心設定檔struts-config.xml及web.xml透過這個可以加速我們Web App的開發,這時候我們可以直接用Tomcat執行此專案如果出現下圖所示的畫面代表Struts基本設定已經成功了~

struts-6

step 5. 接下來我們打開web.xml

從web.xml中的<servlet>設定我們可以看到幾個重點

  • 負責Controller工作的是ActionServlet,理論上只要是Client Request都會經過ActionServlet來發送
  • ActionServlet會去讀取struts-config.xml這隻設定檔其中包含了Sturts的一些相關設定
  • servlet-mapping設定,ActionServlet 會去處理所有來自*.do的Request

這些就是web.xml的幾個較為重要的設定~~~

step 6. 打開struts-config.xml,顧名思義這個檔案就是Struts的核心所在了

在struts-config.xml中,透過 action-mappings 的設定,來達成Client Request與Server的溝通

  • action-mappings : 設定Request與Server Action的對應關係,path=”Hello” and  type=”com.appx.action.HelloAction”  時,當我們的Request是Hello發出時,就會使用HelloAction來處理這個Request,而forward的設定則是HelloAction執行結速後要導向的對象,一個action中可以有多個forward對象,在action中將會去對應forward上的name來尋找並返回對應ActionForward 物件,ActionServlet會根據action傳回的ActionForward來將請求轉發至指定的對象。
  • form-bean : 設定View(表單),與對應的Class,當表單被送到Server時會將表單的name,去對應form-bean是否有相同的name,如果有找到相同的name,就會將值注入該form-bean對應的Class

step 7. 由action-mappings 的設定我們可以知道,必須要有一個HelloAction來處理Hello發出的請求,而HelloAction是必須繼承org.apache.struts.action.Action且覆寫execute()

如此一來~只要是Hello發出的請求,就都會交由HelloAction來處理,當我們處理完這個Action要做的事之後,必須呼叫ActionMapping的物件,ActionMapping就會去struts-config.xml尋找是否有這個forward對象,如果有找到,Servlet就使用回傳的ActionForward將Request轉發至指定的對象。

因為我們設定的<forward name=”helloUser” path=”/pages/Hello.jsp” />因此我們在相對應得路徑中加入Hello.jsp的頁面

然後就可以啟動Server,http://localhost:8080/${web.xml的display-name}/Hello.do,就可以看到以下畫面

struts-7

這樣我們就完成了Struts 的HelloWorld!!!

另外Struts中還有一個ActionForm的應用,ActionForm可以把我們的表單以物件來表示,所以當我們在設計物件時必須繼承org.apache.struts.action.ActionForm,並且要提供getter及setter的方法,在ActionForm產生後會去與相對應的物件做比對,如果有相同的參數就會用setter將數值注入其中,以下提供簡單的ActionForm操作例子~~~

step 1. 我們先來建立表的物件 UserForm.java

ps.要記得繼承org.apache.struts.action.ActionForm才會有效果喔~~~

step 2. 在struts-config.xml加入<form-bean>設定表單名稱以及與剛剛建立的UserForm對應,並且在action中加入對應的表單名稱

step 3. 接著處理Login的Action  LoginAction.java

經過設定,我們的表單會透過ActionForm傳進來,在這裡我們還需要把ActionForm轉型成UserForm才可以使用UserForm的getter方法,經過簡單的帳號密碼驗證,我們透過forward的方式導向登入成功就導向[helloUser]的頁面,失敗就回到登入頁面並顯示登入敗的訊息~~

step 4. 最後我們要加上登入表單的頁面 LoginForm.jsp

最後我們就可以啟動Server來測是囉~~

struts-8

struts-9

到這邊ActionForm的基本應用也告段落了~~~

最後附上程式連結供大家參考喔~https://github.com/jimmingOu/StrutsWebDemo/

Facebook Comments

Microsoft Azure Web App 自動調整規模[Auto Scaling]

暨上一篇完成Web App的基本架設後,緊接著要考慮的就是,架設網站通常都需要面臨的問題,就是如果流量超過網站負荷,有沒有好的解決方式?大家應該還記得 Azure VM 可以透過可用性群組的設定來實現負載平衡,想當然爾Web App也有類似的機制去達成這個目的!接下來就與大家分享Auto Scaling的一些簡單設定~~~

step 1  在建立WebApp 選擇方案時記得有選擇有支援自動調整規模的方案

scaling

step 2 在應用程式左邊選單找到相應放大(Scale out)並點選進入,一開始Web App 的AutoScale是Disabled的,所以我們先把AutoScale打開

scaling-1

step 3  點選Add a rule新增一個自動調整的規,然後依照自己的需求選擇計量方式及其增加的規則

scaling-2

需要注意的一點:當我們設定了一個增加規模的規則,相對應的也應該要有一個減少規模的規則,因為一旦增加了規模後,系統並不會自動減少規模,所以我們應該要設定一個減少規模的規則,如此當網站壓力變小後才會把資源釋放出來

scaling-3

除了Default的Auto created scale condition之外我們還可以新增Auto Scale的排程,我們可以點選下方的[ Add a scale condition],設定要執行Auto Scale的時間區段

scaling-5

最後我們可以從上方的[執行歷程記錄]觀察到scale的增加或減少

scaling-6
Auto Scale 讓我們可以簡單的透過網頁上的設定,達到分流的效果,因此也不需要因為分流而需要管理多台伺服器,所以我們在架設伺服器及管理上也有了更多的彈性及選擇~~
Facebook Comments

Microsoft Azure 建立 Web App Service 分享~~~

針對雲端的學習與研究也好一陣子了,自從上次使用雲端虛擬器建立了一個Web Service ,最近就在想透過 Azure VM 還是需要自己去管理VM 的設定 ,備份,負載平衡等……是不是有更快的方式可以讓我們在Azure上面架設一個網站,答案是有的!其實Microsoft Azure還提供另一個服務[Azure App Service for Web],因此也動手玩了一下這個功能,順便也記錄下來與大家分享~

step 1 首先我們一樣先找到Web App Service這個服務

webApp

step 2 點選Web App,輸入名稱及資源群組後,App Service 的方案系統會自動幫我們帶出預設的(S1),當然如果我們有不一樣的需求也可以選擇新建一個自己的方案,確定好方案後建可以點選建立Web App Service

webApp1

step 3  到這裡我們就可以在儀表板上面看到剛剛建立的Web App Service,接著我們就準備把程式部屬到App Service上面,在這邊有很多種部屬的方式(Visual Studio,Github,DropBox…..),我們先用FTP來上傳程式(可以下載FileZilla),所以我們先下載發行設定檔來取得FTP的帳號密碼

webApp-2

step 4 打開發行設定檔就可以看到FTP的連線相關資訊

  • publishUrl : 主機名稱
  • userName : 帳號
  • userPWD : 密碼

webApp-3

我們把相關資訊輸入至FileZilla並建立連線,然後把程式上傳到wwwroot下面

step 5  程式上傳完成後,我們到應用程式設定 >> 虛擬應用程式和目錄(這裡是設定我們應用程式與網址對應的路徑)

  • 虛擬目錄 : url 路徑
  • 網站根目錄的相對實體路徑 : 應用程式對應url的絕對路徑

webApp-4

設定好之後記得要儲存喔~~~

step 6 接著我們就可以把App Service 的 Url + (剛剛設定的虛擬目錄),貼到瀏覽器上就可以連上我們的應用程式了

webApp-6

webApp-5

到這裡我們Web App Service 大致上已經完成了

 

使用 Azure Web App Service 來部屬應用程式與Azure VM 相較之下,確實方便快速許多,如果沒有比較特殊的需求,使用 Azure Web App Service 其實已經很足夠了,但是如果必須對Server有比較進階的一些設定或是需要安裝其他的Framework來驅動應用程式的話,Azure VM 還是比較好的選擇

Facebook Comments

[Microsoft Azure VM] Web App 如何達成 負載平衡(Load Balance)

自從用Microsoft Azure VM建立完Web App之後緊接著就面臨了另一個問題,就是當使用者多到Server負擔的上限時,如何去做到分流達成負載平衡(LoadBalance),查了一下資料發現,微軟於201603時有更新了虛擬機器的負載平衡功能,也讓負載平衡更容易上手,以下就是簡單的建立負載平衡器的步驟供大家參考~

step 1  在建立負載平衡器之前,我們必需先建立[可用性設定組(Availability set)],可用性設定組可以將多台VM組成一個群組,負載平衡器則會在這多部虛擬機器之間分配流量

  • 容錯域(Fault Domain) 在可用性集中,容錯域的數量就代表這個可用性集會把虛擬機器分佈在幾個不同的機櫃之中,主要就是避免虛擬機器建立在相同的機櫃中,增加了因為硬體故障就同時發生問題的風險。
  • 更新域(Update Domain) 更新域讓你可以將虛擬機器分成不同的群組,每次新增虛擬機器進可用性集時就會放在另一個更新域。當 Azure 機房在進行系統升級或預定維護作業時,會一次處理一個群組,對使用者而言就是一次只會重啟同一群內的虛擬機器,但順序是不固定的。

azure_lb_0919

step 2 接著我們就可以開始建立Vm ,記得將剛剛建立的Availability set加入新建的Vm中(*Vm建立完成後就不能修改Availability set了喔~)

azure_lb_0919-1

接下來我們可以到儀表板點選剛剛建立的Availability set確認是否有加入剛才建立的VMazure_lb_0919-2

step 3 接著就可以開始建立我們的負載平衡器了(Load Balancer)

  • 這邊我們先選擇public Ip(*待會要透過負載平衡器連入Web的IP)

azure_lb_0919-3

step 4  建立好負載平衡器後,我們到負載平衡器的設定點選[後端集區(backend pools)] 將剛剛建好的Availability set加入,之後我們會透過負載平衡器的公用IP去連結backend pools裡面的VM

azure_lb_0919-4

azure_lb_0919-5

step 5 接著我們點選[探查(Health probes)] ,Health probes主要目的是要用來檢查Vm的健康狀態(伺服器是否正常運作中),因為是Web網站,所以就先選擇通訊協定Http

  • path : 探查的路徑( “/” 表示IIS的根目錄 ,也可在後面加上應用程式的路徑 )
  • Interval : 負載平衡器會定期探查端點,此為檢查時間的區隔

azure_lb_0919-6

step 6 最後一個步驟,我們須要建立[負載平衡規則(Load balancing rules)]

  • Session Persistence : 選擇[Client IP] 會根據用戶端的 IP 位址固定在同一台虛擬機器(有利於Session的運作,但可能會降低負載平衡的彈性),選擇[Client IP and protocol]則會加上通訊協定來做判斷

    azure_lb_0919-8

到這個步驟基本上我們已經完成了[負載平衡器]的設定

step 7 最後一個步驟,我們就要來驗證,[負載平衡器]的效果,在這裡提供一個簡單的方法,我們可以遠端至VM,將兩台VM的 iisstart.htm 修改為不一樣的內容(*方便區分連到哪一台)azure_lb_0919-10

接著我們先啟動其中一台VM,開啟瀏覽器貼上 http://[負載平衡器] IP 位置,重瀏覽器上可以發現我們連到的是appxWeb01這台VM

azure_lb_0919-9

接著我們啟動令另一台VM,再將第一台VM關閉,一樣在瀏覽器貼上 http://[負載平衡器] IP 位置,我們會發現[負載平衡器]就導向另一台健康的VM,這樣也表示我們已經成功設定好[負載平衡器]了

azure_lb_0919-11

以上就是簡單的建立負載平衡器的步驟供大家參考~更詳細的內容可以去參考官方的文件喔~

參考資料 https://www.azure-vm.recipes/  ,  https://docs.microsoft.com/zh-tw/azure

 

Facebook Comments

Microsoft Azure VM 建立 Windows Web App 分享~~~

    最近因為工作的關係,需要再Azure上建立一個Web App 因此我需要一個Web Server VM 和Sql Server  Vm,所以就開始上網查了一些關資料,經過努力終於建立好一個Web  App,以下就是建立Azure Vm的簡單分享~

    開始前我們需要先有一個帳號登入Azure (https://portal.azure.com) 第一次使用可以有一個月的試用期,並且會贈送6000點的點數,大家可以善用這些點數去熟悉Azure的一些功能 ,登入後就可以開始建立第一個Azure VM了

ps.申請帳號時需輸入信用卡資訊~~這是必填的~所以就勇敢的給他填下去吧~~

setp 1     建立Web App VM

1.點選[新增]在右邊的視窗直選擇[Windows Server 2016 Datacenter]

azure-1

2.填入*的必填欄位後點選[確定]前往下一個步驟

  • User name and Password :就是之後遠端登入VM時的帳號密碼
  • Resource group:如果沒有群組就新建一個
  • 位置 :VM建立的位置,通常選擇離自己近的區域

azure-2

3.  選擇符合自己需求的 VM 機器(~如果將來有需要用到Load balancer需要選有這一 個選項的VM)

azure-3

4.  此步驟基本上可以直接按[確定]前往下一步,需要注意的如果有需要用到Load balancer需建立一個Availability set( 要達成負載平衡的vm群組設定 ),如果不需要就可以直接前往下一步

azure-4

5.按下[購買]就會開始建立VM ,建立好之後就可以在儀表板看到剛剛建立的VM

azure-5

6.點選建立好的VM進入VM的詳細資訊頁面,複製Public Ip address使用遠端桌面就可以進入剛剛建好的VM

azure-6

7. VM基本上已經裝好Internet Inforemation Service 所以瀏覽器入 http://localhost 看到以下畫面代表Web Service已經基本的部屬成功,剩下的就是把應用程式加入就可以了

azure-7

8. 接下來測試一下是否可以從外部去連結到VM,因此我們回到自己的本機開啟瀏灠器輸入http://[Vm ip] 正常的話應該要出現跟上圖一樣的畫面,如果是出現以下畫面,大部分的原因是被VM的防火牆擋住了

azure-8

9.為了要可以從外部連接到VM Web Service我們需要加入Http的[輸入規則]讓防火牆 可以順利通過,所以我們回到Azure VM 的設定畫面點選該VM下的 Networking加入Http 使用的 80 port ,加入後我們restart  VM 再次輸入 http://[Vm ip]  就可以正常顯示IIS的起始畫面了

azure-9

10.如果您的應用程式需要用到 Asp.Net Framework 的話,需要自己在VM上手動安裝喔 ~可以從Service Management  去安裝需要的角色~~

azure-10

step 2   建立Web SQL VM

1.點選[新增]在右邊的視窗直選擇[Windows Server 2016 Datacenter]

azure-11

2.其他的步驟跟建立Web Vm 大同小異,選擇這個方案的原因是VM建起來後就會先幫我們安裝好SQL Server了

3.VM 建立好之後一樣要記得在Azure 該VM的設定頁面中加入MSSQL預設的1433port如此一來才可以從外部連結到

azure-12

4.當我們VM建好後除了可以遠端進去管理DataBase外,也可以經由SQL的角色從本機的 SQL Server Management Studio 遠端連接管理DataBase

           以上就是很基本的Azure Web VM and Sql VM 的基本安裝方式,Azure 上還有許多其他很實用的功能,例如load balancer ,Web app(不需建立VM) ,Sql DataBase(不需建立VM) 等,有時間的時候再將有使用過的其他功能Post上來與大家分享~~

這是不是太棒了 ~ 胖達 (Panda)!!!
3B5766BC-0023-465A-ACA5-47631A62A2C7

更多功能的介紹與使用可以參考https://docs.microsoft.com/zh-tw/azure/index官方文件有很詳細的說明喔~~~

Facebook Comments

[Java 101 基礎篇] Java程式出錯的九種最佳處理方式 ! ( 前篇 )

前言:  通常我們程式執行正常的時候,一切都很美好。但是月有陰晴圓缺,往往都會有意外發生。這篇就是來分享一下遇到意外時,該如何處理 ~

像是下面這張圖,相信大家很常見到 ~ 就是一個常見的情境 ~

在開始進入正題(Exception Handling)之前 ,先說明一下 Java 跟 Exception 關係 ~


(* Exception 跟 Error 以及 RuntimeException的繼承關係圖)
https://docs.oracle.com/javase/tutorial/figures/essential/exceptions-throwable.gif

程式裏面,如果是遇到  Error/RuntimeException ,這一類的類別被Java歸類成 UnChecked Exception,代表  程式人員 不用特別寫程式進行處理。(*因為這一類的情形,如果真有發生,我們也來不及救了…  。如果JVM 出現OutMemoryError,我們也只能舉雙手投降了)。

至於像其它常見的,像 IOException,FileNotFoundException 等,
都分類為 Checked Exception,這些都是代表程式出錯時,JVM 會把 出錯的資訊 包裝成特定型態的物件,方便程式人員可以用程式來挽救出錯的情形,但不致於讓程式整個直接結束( Game Over)。

Java對所謂的 Checked Exception,在語法上有提供了幾個相關的關鍵字,
如 try / catch 以及 throws。接下來,我們先來看 用 try / catch的用法 ~

Round 1 :  通常程式需要 I/O,  connect Network, 或 Database 時,我們都會加上 try/catch
如下

上面的寫法,相信很容易在各種案子或各個地方看到~
基本上是ok的…javac 編譯也會過…我們稱 「有借有還」
就像 有 open動作,就該會有 close的動作。

不過,重點 不只要寫 close,還要在對的地方寫 ,寫錯地方 就等同於沒寫。
在上面第五行的地方,使用了 new  FileInputStream(file) ;
也許各位會想,就是 new FileInputStream的物件,為何會出錯呢 ?!
原因可能會有很多,舉簡單二、三個原因 來看,

  1. 檔案已經存在。代表無法再產生一個 FileInputStream來存取同一份檔案資源
  2. 寫入權限不足,比如說 一般user無法寫入系統的資料夾
  3. 硬碟空間已滿,這理由也很有可能會發生的喔 ~~~

那出錯之後呢 ?!  程式沒出錯的話,會一路從上往下執行,然後略過 catch。
但是如果一出錯,則程式流程會立即跳出 try { } 的區塊,然後進入 catch 的部份。
以上面來說的話,就是第五行出錯,會直接跳到第七行的 catch ,
而忽略最重要的第六行 close() .  (*進而可能會導致記憶體一直浪費,而沒有被回收,也就是所謂的 Memory Leak)

所以,該怎麼做比較對呢 ?!
Round 2 : 加上 finally  ,如下面的第九行

但是別忘了,即使在第九行之後,如果有呼叫 close() 時,也還是要再加一個 try/catch 才能真正的讓編譯器通過。 (*不然就是考慮 throws 用法 ,我們稱之謂 「轉身逃避」)

但…又有人會說,為何已經用 try / catch 了,而裏面還要再包一層呢 ~~
是不是 感覺有點多餘呢 ~?!

沒錯,就是有點多餘… 所以在 JDK 7 出來後,Oracle 原廠有加入個簡化的語法,
稱之為  try-with-resource,
語法:
try (  欲使用後關閉的物件  )  {
//  正常地 使用物件
}  catch (相對應的例外) {
// 例外發生時的處理,如 log, rollback 或 send email 等
}

範例如下 :

不知各位有沒有注意到,

  1. 沒有 close()
  2. 更沒有巢狀的 try / catch

try-with-resource的語法就是要讓開發人員更簡便的開發程式,
這麼好用的語法有沒有限制呢 ?!      答案是 有 !!!!

限制就是  欲使用後關閉的物件 必需直接或間接地  實作 AutoCloseable ,至於有哪些類別已經實作,請參考下圖

如果 使用的物件不符合期待(也就是直接/間接地 實作 AutoCloseable) ,
編譯器會”好心的提醒”開發人員…

是不是真的很實用呢 ?!


也許會想問說,如果是用 JDK6 甚至是 JDK5 的話呢 ?! 嗯~~ 沒問題的,就像下面這張~


(* 就別做夢了,趕快昇級 JDK 版本囉 ~  XD

後半部,我們會再接著介紹程式出錯之後, Exception 的建議處理方式 ~

參考資料(Reference)  :
https://dzone.com/articles/9-best-practices-to-handle-exceptions-in-java

Facebook Comments