作爲一名軟件開發人員,成爲架構師是追求之一。系統架構師的能力不僅僅體現在書寫業務代碼上,更重要的是系統的結構和性能,是否具有可拓展性、高併發性和穩定性。
在研究Dubbo的架構的時候,網上的例子是在開發當中,構建一個server的java項目,customer的消費者,customer項目進行dependcy依賴就可以調用服務了,但是這樣耦合性太多,經過下午的研究,發現了DUBBO的重點方法,就是把DUBBO打成jar包,採用命令執行jar包,把服務註冊到Zookeper,消費者通過Zookeper進行調用,就可以了。
轉載請註明出處:http://blog.csdn.net/l1028386804/article/details/70500018
服務器:192.168.1.121(mydubbo-server)
一、Dubbo服務的運行方式
1、使用Servlet容器運行(Tomcat、Jetty等)----不可取 缺點:增加複雜性(端口、管理)
tomcat/jetty等佔用端口,dubbo服務也需要端口
浪費資源(內存):單獨啓動tomcat,jetty佔用內存大
2、自建Main方法類來運行(spring容器) ----不建議(本地調試可用)
缺點: Dobbo本身提供的高級特性沒用上
自已編寫啓動類可能會有缺陷
3、使用Dubbo框架提供的Main方法類來運行(Spring容器)----建議使用 優點:框架本身提供(com.alibaba.dubbo.container.Main)
可實現優雅關機(ShutdownHook)
注意點
- spring-context.xml
- <import resource="classpath:spring/xxx.xml" />
Dubbo是通過JDK的ShutdownHook來完成優雅停機的,所以如果用戶使用"kill -9 PID"等強制關閉指令,是不會執行優雅停機的,只有通過"kill PID"時,纔會執行。
原理:
服務提供方停止時,先標記爲不接收新請求,新請求過來時直接報錯,讓客戶端重試其它機器。 然後,檢測線程池中的線程是否正在運行,如果有,等待所有線程執行完成,除非超時,則強制關閉。
服務消費方停止時,不再發起新的調用請求,所有新的調用在客戶端即報錯。然後,檢測有沒有請求的響應還沒有返回,等待響應返回,除非超時,則強制關閉。
二、Maven構建Dubbo服務可執行Jar包的配置
- <!--MAVEN打包duboo可執行jar begin -->
- <build>
- <finalName>mydubbo-server</finalName>
- <resources>
- <resource>
- <targetPath>${project.build.directory}/classes</targetPath>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- <includes>
- <include>**/*.xml</include>
- <include>**/*.properties</include>
- </includes>
- </resource>
- <!-- 結合com.alibaba.dubbo.container.Main -->
- <resource>
- <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
- <directory>src/main/resources/spring</directory>
- <filtering>true</filtering>
- <includes>
- <include>spring-context.xml</include>
- </includes>
- </resource>
- </resources>
- <pluginManagement>
- <plugins>
- <!-- 解決Maven插件在Eclipse內執行了一系列的生命週期引起衝突 -->
- <plugin>
- <groupId>org.eclipse.m2e</groupId>
- <artifactId>lifecycle-mapping</artifactId>
- <version>1.0.0</version>
- <configuration>
- <lifecycleMappingMetadata>
- <pluginExecutions>
- <pluginExecution>
- <pluginExecutionFilter>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <versionRange>[2.0,)</versionRange>
- <goals>
- <goal>copy-dependencies</goal>
- </goals>
- </pluginExecutionFilter>
- <action>
- <ignore />
- </action>
- </pluginExecution>
- </pluginExecutions>
- </lifecycleMappingMetadata>
- </configuration>
- </plugin>
- </plugins>
- </pluginManagement>
- <plugins>
- <!-- 打包jar文件時,配置manifest文件,加入lib包的jar依賴 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <configuration>
- <classesDirectory>target/classes/</classesDirectory>
- <archive>
- <manifest>
- <mainClass>com.alibaba.dubbo.container.Main</mainClass>
- <!-- 打包時 MANIFEST.MF文件不記錄的時間戳版本 -->
- <useUniqueVersions>false</useUniqueVersions>
- <addClasspath>true</addClasspath>
- <classpathPrefix>lib/</classpathPrefix>
- </manifest>
- <manifestEntries>
- <Class-Path>.</Class-Path>
- </manifestEntries>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>copy-dependencies</id>
- <phase>package</phase>
- <goals>
- <goal>copy-dependencies</goal>
- </goals>
- <configuration>
- <type>jar</type>
- <includeTypes>jar</includeTypes>
- <useUniqueVersions>false</useUniqueVersions>
- <outputDirectory>
- ${project.build.directory}/lib
- </outputDirectory>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- <!--MAVEN打包duboo可執行jar end -->