【ITOO】--專案系統架構圖

ZeroWM發表於2015-12-16


一、專案流程及工具

   簡單的介紹一下整個ITOO專案維護流程。首先是開發階段,使用Eclipse開發工具進行開發。

        開發所需要的Jar包,通過Maven+Negiux進行統一的管理,Negiux將本地Maven倉庫和中央管理倉庫解耦和,先將中央倉庫中的某些資料下載到私服器(Negiux)上面,本地的Maven就可以直接訪問區域網中的Negiux,而無需遠端中央倉庫了。這樣好處就是節省網路頻寬,加速本地快速搭建。

  開發的程式碼首先經過Junit測試,本地測試通過後才能提交到版本控制工具SVN上面。與此同時,專案進行過程中遇到的問題及解決方案、會議、技術點、管理經驗等等,都需要通過文件保留下來。這些文件統一由Confluence進行知識管理。

  程式碼通過Jekins進行持續整合,Jekins各個子系統需要配置幾個重要的地址:1.SVN本模組的地址 2.Negiux在區域網中的位置資訊 3.Jboss的地址資訊。

       程式碼可以邊整合,邊測試 ,我們通過禪道建立產品,關聯專案,建立測試用例,進行測試和bug修復工作。




二、系統框架


  整個系統前臺web容器主要採用SpringMVC框架,有助於頁面顯示、業務邏輯的解耦,使整個Web頁面更加整潔。SpringMVC中的Bean通過IOC容器來進行管理。通過SET的方式進行IOC依賴注入。

        後臺主要採用EJB容器,業務邏輯層主要採用的sessionBean中的無狀態會話Bean,當客戶端請求服務端的時候,無狀態會話bean處理單一請求或商務過程。無需從之前的請求中提取任何狀態。事務必須在一個方法中結束,通常資源佔有量小,可以被共享。

       持久層採用的JPA規範的實現之一EclipseLink。它和Hibernate同屬於ORM思想的產物。它將EntityBean持久化到資料庫,並且支援多租戶。它對多租戶的支援細化到了表,很不錯的持久層框架。

     

三、程式碼級別的系統框架和各種配置檔案

      


itoo-basic-api:

1) jndi.properties檔案:

 在進行JNDI查詢前,設定應用伺服器的上下文資訊(一般通過配置jndi.properties檔案實現),主要是設定JNDI驅動的類名(java.naming.factory.initial)和命名服務提供者的URL(java.naming.prvoider.url)

java.naming.factory.initial=bitronix.tm.jndi.BitronixInitialContextFactory

2)persistence.xml:

在EJB中,一個實體Bean應用由實體類和persistence.xml檔案檔案組成,共同完成持久化工作。

<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	
	<!-- Name屬性用於定義持久化單元的名字,transaction-type指定事務型別 -->
	<persistence-unit name="MT_HOTEL_SERVICE"
		transaction-type="JTA">
		
		<!-- javax.persistence.PersistenceProvider介面的一個實現類(可選) -->
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
		<!-- Jta-data-source和 non-jta-data-source用於分別指定持久化提供商使用的JTA和/或non-JTA資料來源的全域性JNDI名稱(可選) -->
		<jta-data-source>java:jboss/datasources/CloudMysqlDS</jta-data-source>
		<!--   廠商專有屬性(可選)   -->
		<properties>
		<!-- 修改第一次載入時間長的問題 -->
			<property name="eclipselink.deploy-on-startup" value="True" />			
			<property name="eclipselink.jdbc.allow-native-sql-queries"
				value="true" />
			<!-- 設定伺服器型別 -->
			<property name="eclipselink.target-server" value="JBoss" />
			<!-- logging -->
			<property name="eclipselink.logging.level" value="FINE" />
			<property name="eclipselink.weaving" value="static" />
			<property name="eclipselink.session.customizer" value="com.tgb.itoo.base.util.uuid.UUIDSequence" />
		</properties>
	</persistence-unit>
</persistence>
</span>


3)MANIFEST.MF

Jar檔案資訊

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: itoo-basic-api
Bundle-SymbolicName: itoo-basic-api
Bundle-Version: 1.0.0.qualifier
Export-Package: com.tgb.itoo.basic.entity,
 com.tgb.itoo.basic.service


4)pom.xml

POM包含了一個project所需要的所有資訊,當然也就包含了構建過程中所需要的外掛的配置資訊,事實上,這裡申明瞭"who","what","where",然而構建生命週期(buildlifecycle)s中說的是"when""how"。POM定義的三座標,標記了倉庫中的特定位置,groupId :artifactId:version

<span style="font-size:14px;"><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	
	<!-- 基本設定 -->
	<parent> 
		<groupId>com.tgb</groupId>
		<artifactId>itoo-basic-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		<relativePath>../itoo-basic-parent/pom.xml</relativePath>
	</parent>
	<artifactId>itoo-basic-api</artifactId>
	<packaging>ejb</packaging>


	<dependencies>
		<dependency>
			<groupId>com.tgb</groupId>
			<artifactId>itoo-base</artifactId>
		</dependency>

		<dependency>
			<groupId>com.tgb</groupId>
			<artifactId>itoo-tool</artifactId>
<!-- 			<version>${project.version}</version> -->
		</dependency>
 
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
		</dependency>

		<dependency>
			<groupId>org.eclipse.persistence</groupId>
			<artifactId>org.eclipse.persistence.jpa</artifactId>
			<version>${org.eclipse.persistence.jpa.version}</version>
<!-- 			<scope>provided</scope> -->
		</dependency>
		
	</dependencies>

	<!-- 構建的過程 -->
	<build>
	<pluginManagement>
		<plugins>
			<plugin>
				<groupId>au.com.alderaan</groupId>
				<artifactId>eclipselink-staticweave-maven-plugin</artifactId>
				<version>1.0.3</version>
				<executions>
					<execution>
						<phase>process-classes</phase>
						<goals>
							<goal>weave</goal>
						</goals>
						<configuration>
							<persistenceXMLLocation>META-INF/persistence.xml</persistenceXMLLocation>
							<logLevel>FINE</logLevel>
						</configuration>
					</execution>
				</executions>
				<dependencies>
					<dependency>
						<groupId>org.eclipse.persistence</groupId>
						<artifactId>eclipselink</artifactId>
						<version>2.6.0</version>
					</dependency>
				</dependencies>
			</plugin>
		</plugins>
		</pluginManagement>
	</build>
</project></span>



itoo-basic-course-ear:

1)jboss-deployment-structure.xml

目的找到War包裡面的jndi配置。

<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
	<sub-deployment name="itoo-basic-course-web-0.0.1-SNAPSHOT.war">
		<dependencies>
			<module name="org.jboss.xnio" />
			<module name="org.apache.shiro">
				<imports>
					<include path="META-INF**" />
					<include path="org**" />
				</imports>
			</module>
			<module name="org.jasig.cas.client">
				<imports>
					<include path="META-INF**" />
					<include path="org**" />
				</imports>
			</module>
			<module name="org.springframework.data">
				<imports>
					<include path="META-INF**" />
					<include path="org**" />
				</imports>
			</module>
			<module name="org.crazycake">
				<imports>
					<include path="META-INF**" />
					<include path="org**" />
				</imports>
			</module>
			<module name="commons-fileupload">
				<imports>
					<include path="META-INF**" />
					<include path="org**" />
				</imports>
			</module>
			<module name="org.codehaus.jackson">
				<imports>
					<include path="META-INF**" />
					<include path="org**" />
				</imports>
			</module>
			<module name="redis.clients">
				<imports>
					<include path="META-INF**" />
					<include path="org**" />
				</imports>
			</module>
			<module name="commons-lang">
				<imports>
					<include path="META-INF**" />
					<include path="org**" />
				</imports>
			</module>
			<module name="org.apache.commons.commons-pool2">
				<imports>
					<include path="META-INF**" />
					<include path="org**" />
				</imports>
			</module>
			<module name="org.springframework">
				<imports>
					<include path="META-INF**" />
					<include path="org**" />
				</imports>
			</module>

		</dependencies>
	</sub-deployment>
</jboss-deployment-structure>
		</span>


2)jboss-ejb-client.xml

配置遠端呼叫

<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<jboss-ejb-client xmlns="urn:jboss:ejb-client:1.0">
    <client-context>
        <ejb-receivers>                                
		<!--需要多個的話-->
		<!--遠端呼叫基礎的配置-->
            <remoting-ejb-receiver outbound-connection-ref="remote-ejb-connection-jc"/>
			
			
        </ejb-receivers> 
    </client-context>
</jboss-ejb-client></span>


itoo-basic-course-web:

1)applicationContext-common.xml

這樣的目的是通過evn找到相應的JBOSS的配置,也就是需要遠端呼叫的JBOSSip,埠號,使用者名稱和密碼。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:util="http://www.springframework.org/schema/util" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
	http://www.springframework.org/schema/tx  
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
	http://www.springframework.org/schema/util 
    http://www.springframework.org/schema/util/spring-util-3.0.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<!-- 這樣的目的是通過evn找到相應的JBOSS的配置,也就是需要遠端呼叫的JBOSS的ip,埠號,使用者名稱和密碼。 -->
		<util:properties id="evn"
		location="classpath:config/jboss-ejb-client.properties"></util:properties>
	
	
</beans>


2)Jboss-ejb-client.properties

主要是配置IP和埠號以及需要遠端呼叫的JBOSS的賬戶名和密碼,同時我們還可以再JBOSS中配置多個遠端呼叫的介面。


endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
org.jboss.ejb.client.scoped.context=true
jboss.naming.client.ejb.context=true
Context.URL_PKG_PREFIXES=org.jboss.ejb.client.naming
javax.naming.Context.INITIAL_CONTEXT_FACTORY=org.jboss.naming.remote.client.InitialContextFactory
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connectionprovider.create.options.org.xnio.Options.SSL_STARTTLS=false
jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false

remote.connections=one,two
remote.connection.one.host=192.168.24.115
remote.connection.one.port=4447
remote.connection.one.username=adminqx
remote.connection.one.password=!admin123
#add log
remote.connection.two.host=192.168.24.74
remote.connection.two.port=4447
remote.connection.two.username=adminjc
remote.connection.two.password=!admin123 

3 )maven中的倉庫

分為兩種,snapshot快照倉庫和release釋出倉庫。snapshot快照倉庫用於儲存開發過程中的不穩定的版本,release正式倉庫則是用來儲存穩定的發行版本。


四、總結

  整個框架很龐大,先巨集觀的鳥瞰一下,接下來就是各個擊破了。學習就是從巨集觀到細節,在細節實踐,然後再從回到巨集觀補充整個知識網的過程。



相關文章