Tìm hiểu về Smart Deploy trong Seasar

Xin chào mọi người, Trong tháng này, em có được làm việc với một task liên quan đến Smart Deploy tron Seasar. Task này yêu cầu em phải check được môi trường em đang làm việc là môi trường Dev hay môi trường Production. Vậy em xin chia sẻ một chút hiểu biết mà em đã học được về** Smart Deploy** trong Seasar Framework. Mọi người có thể sử dụng Smart Deploy từ bản Seasar 2.4 trở lên. Smart Deploy bao gồm 3 loại: "HOT deploy", "COOL deploy", "WARM deploy". Tùy thuộc vào mỗi loại môi trường, ta sẽ define loại deploy khác nhau. Trước tiên, ta cùng tìm hiểu về đặc điểm của mỗi loại deploy:

Các loại Deploy

  • HOT deploy HOT deploy là một kĩ thuật cho phép bạn deploy/redeploy các component mà không rebooting app server khi thay đổi source code. Nó giúp tránh lãng phí thời gian reboot xảy ra khi phát triển web system. Bạn có thể kiểm tra các source đã thay đổi trong kết quả, từ đó sửa chữa từng chút một. Vì vậy mà chất lượng cũng được cải thiện hơn. Hot deploy không phù hợp với hệ thống sử dụng Multithread. Để sử dụng HOT deploy, bạn cần phải include "hotdeploy.dicon" trong s2container.dicon.
<components> 
	<include condition = "# ENV == 'ut'" path = "hotdeploy.dicon" /> 
	<include condition = "# ENV! = 'Ut '"Path =" cooldeploy.dicon "/> 
</ components>

Trong đó ENV chính là biến môi trường ta sẽ define trong file env.txt của mỗi folder tương ứng với môi trường khác nhau. Chúng ta sẽ đề cập đến vấn đề này ở phần sau.

  • COOL deploy COOL deploy sẽ hoàn thành công việc deploy cùng với việc khởi tạo application. Sau khi các component được cài đặt trong container, hiệu suất sau khi khởi tạo sẽ được cải thiện đáng kể. Trong đó hiệu suất của COOL deploy là nhanh nhất trong các loại Smart Deploy. Tuy nhiên, khi số lượng Classes trở lên lớn hơn, thì thời gian để khởi tạo cũng sẽ trở nên lâu hơn. Để sử dụng COOL deploy, bạn cần include "cooldeploy.dicon" trong s2container.dicon.
<components> 
	<include condition = "# ENV == 'ut'" path = "hotdeploy.dicon" /> 
	<include condition = "# ENV! = 'Ut '"Path =" cooldeploy.dicon "/> 
</ components> 
  • WARM deploy WARM deploy mang đặc điểm trung gian của HOT deploy và WARM deploy. Yêu cầu deploy của Warm deploy giống với HOT deploy. Tuy nhiên, chúng sẽ không loại bỏ những thành phần đã từng cài đặt. Sau khi cài đặt, chúng sẽ vẫn duy trì những nội dung giống như COOL deploy đã làm. Giống như HOT deploy, chúng sẽ không thể phản ánh trực tiếp những source code đã thay đổi. Để sử dụng WARM deploy, bạn cần include "warmdeploy.dicon" trong s2container.dicon.
<components> 
	<include condition = "# ENV == 'ut'" path = "hotdeploy.dicon" /> 
	<include condition = "# ENV! = 'Ut '"Path =" warmdeploy.dicon "/> 
</ components>

Các cấu trúc file dicon

Tên file dicon Nội dung
App.dicon File được sử dụng khi tạo các setting tùy chọn cho project, khi đó ta sẽ add các mô tả các setting đó vào file.
S2container.dicon File chưa các setting để load môi trường và điều kiện cho việc sử dụng SMART deploy
Jdbc.dicon Chứa các setting kết nối database khác nhau
Convention.dicon Là file để thiết lập các root package cho khởi tạo ban đầu
Creator.dicon File chứa định nghĩa các thành phần tự động thiết lập. Với SMART deploy, định nghĩa các components phụ thuộc vào file Convention. Để tạo ra file này, ta sử dụng các class implements org.seasar.framework.container.customizer
Customizer.dicon Chứa các định nghĩa của các components được thiết lập tự động

Để hiểu rõ hơn, về 3 file Convention.dicon, Creator.dicon và Customizer.dicon, ta có các ví dụ sau: File Convention.dicon:

<? Xml version = "1.0" encoding = "UTF - 8"?> 
<! DOCTYPE components PUBLIC "- // SEASAR 2.1 // DTD S2 Container // EN" 
	"http://www.seasar.org/dtd/ Components 21. dtd "> 
<components> 
	<component class =" org.seasar.framework.convention.impl.NamingConventionImpl "> 
		<initMethod name =" addRootPackageName "> 
			<arg>" aaaaa "</ arg> 
		</ initMethod> 
	</ Component> 
</ components>

File Creator.dicon

<? Xml version = "1.0" encoding = "Shift_JIS"?> 
<! DOCTYPE components PUBLIC "- / / SEASAR 2.1 // DTD S2Container // EN" 
	"http://www.seasar.org/dtd/components21. dtd "> 
<Components> 
	<Include Path =" Convention.Dicon "/> 
	<Include Path =" Customizer.Dicon "/> 
	<Component Class =" Org.Seasar.Framework.Container.Creator.PageCreator "/> 
	<Component Class = "Org.seasar.framework.container.creator.ActionCreator" /> 
	<component class = "org.seasar.framework.container.creator.DaoCreator" /> 
	<component class = "org.seasar.framework.container.creator. DtoCreator "/> 
	<component class =" org.seasar.framework.container.creator.DxoCreator "/> 
	<component class =" org.seasar.framework.container.creator.HelperCreator "/> 
	<component class =" org.seasar .framework.container.creator.LogicCreator "/> 
	<component class =" org.seasar.framework.container.creator.ServiceCreator "/> 
	<component class =" org.seasar.framework.container.creator.InterceptorCreator "/> 
	< Component class = "org.seasar.framework.container.creator.ValidatorCreator" /> 
	<component class = "org.seasar.framework.container.creator.ConverterCreator" /> 
</ components>

File Customizer.dicon:

<? Xml version = "1.0" encoding = "UTF - 8"?> 
<! DOCTYPE components PUBLIC "- // SEASAR 2.1 // DTD S2 Container // EN" 
	"http://www.seasar.org/dtd/ Component 21. dtd "> 
<components> 
	<component name =" defaultCustomizer " 
		class =" org.seasar.framework.container.customizer.AspectCustomizer "> 
		<property name =" interceptorName ">" aop.traceInterceptor "</ property> 
	</ Component 
	name = "commandAspectCustomizer" 
		class = "org.seasar.framework.container.customizer.AspectCustomizer"> 
		<property name = "interceptorName"> "aop.traceInterceptor" </ property> 
		<property name = "pointcut"> "Do. *, Initialize, prerender" </ property> 
	</ component> 

<! - 

	abbreviation -> <component name = "interceptorCustomizer" 
		class = "org.seasar.framework.container.customizer.CustomizerChain"> 
	< Component 
	name <component name = "validatorCustomizer" 
		class = "org.seasar.framework.container.customizer.CustomizerChain"> 
	</ component> 
	<component name = "converterCustomizer" 
		class = "org.seasar.framework.container.customizer.CustomizerChain "> 
	</ Component> 
</ components>

Cách phân biệt các env khi deploy sử dụng Maven

Ta có các folder cấu trúc như sau:

$ find .
.
./pom.xml
./src
./src/main
./src/main/resources
./src/main/resources-devel/
./src/main/resources-release/
./src/main/resources-test/
./src/main/webapp
./src/main/webapp/mylogo.png
./src/main/webapp/mywebapp.css
./src/main/webapp/WEB-INF

Khi đó các file configure chung của project ta sẽ để chung vào folder "./src/main/resources". Các configure cho riêng từng môi trường ta sẽ đặt vào các folder tương ứng. Ví dụ, configure cho môi trường dev ta đặt vào folder "./src/main/resources-devel/", môi trường test tương ứng với folder "./src/main/resources-test" và môi trường production tương ứng với folder "./src/main/resources-release/" Khi build project bằng maven, ta phải sử dụng profile, khi đó ta sẽ define nó theo từng môi trường khác nhau như ví dụ sau:

<profiles>
    <profile>
        <id>development</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.0.0</version>
                    <configuration>
                        <webResources>
                            <resource>
                                <directory>${devResourcesDir}</directory>
                                <filtering>true</filtering>
                                <targetPath>views</targetPath> <!-- target/WebModule/ subdirectory -->
                                <include>index.jsp</include>
                            </resource>
                        </webResources>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>production</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.0.0</version>
                    <configuration>
                        <webResources>
                            <resource>
                                <directory>${prodResourcesDir}</directory>
                                <filtering>true</filtering>
                                <targetPath>views</targetPath> <!-- target/WebModule/ subdirectory -->
                                <include>index.jsp</include>
                            </resource>
                        </webResources>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Khi đó, các biến directory ${devResourcesDir} và ${prodResourcesDir} sẽ tương ứng với các folder "./src/main/resources-devel/" "./src/main/resources-release/" và "./src/main/resources-test/". Khi chạy câu lệnh build của maven, ta sẽ run theo id của profile theo môi trường mà ta mong muốn. Khi đó, source code trong các folder tương ứng sẽ được build cùng ra file war. Ví dụ khi ta run câu lệnh sau:

mvn package -P production

Ta đang muốn build ra file .war với môi trường production. Khi đó, source code trong folder lấy trong biến directory ${prodResourcesDir} (giả dụ là folder "./src/main/resources-release/") sẽ được build cùng project. Vậy là ta đã hiểu cơ chế define profile để sử dụng khi build tên từng môi trường khác nhau. Vậy để liên hệ với SMART deploy ra sao, ta sẽ cùng tìm hiểu ngay sau đây.

Trong mỗi folder của từng môi trường, ta sẽ có 1 file env.txt. File này sẽ chứa các define sau: +ut là môi trường cho unit testing. +ct là môi trường cho connection testing. +it là môi trường cho intergration testing. +product là môi trường production. Khi không có file env.txt, default environment sẽ là môi trường này. Tương ứng với các env define trên mà sẽ tương ứng với các loại SMART deploy. Nếu env.txt là ut Seasar 2 sẽ làm việc với WARM deploy. Seasar 2 sẽ làm việc với COOL deploy, nếu env.txt là it hoặc product. Cuối cùng, nếu env.txt là ct, Seasar 2 sẽ làm việc với HOT deploy.

Như vậy chúng ta đã hiểu được phần nào về SMART deploy trong Seasar rồi. Hi vọng bài posts này sẽ có thể rút ích phần nào cho mọi người khi làm việc với Environment khi sử trọng Seasar framework. Tài liệu tham khảo: http://s2container.seasar.org/2.4/ja/S2.4SmartDeploy.html http://portofino.manydesigns.com/en/docs/portofino3/tutorials/using-maven-profiles-and-resource-filtering http://stackoverflow.com/questions/41103253/maven-resources-plugin-profiles http://sastruts.seasar.org/fileReference.html#env


All Rights Reserved