一、dubbo服務化架構包含的內容
對於傳統工程而言,分層的依據是按照包來區分。由於在相同的工程中,所以服務的提供和調用可以方便的實現。
但是對於分布式架構而言,服務的提供者負責服務具體的實現和接口規范,服務的消費者只關心接口規范即可。但是
無論是服務的提供者還是服務的消費者都會涉及到諸如公共工具類、接口、DO、VO、等公共代碼,因此一個簡單的
dubbo服務架構模式如下:
服務提供者:提供服務接口的實現,發布服務地址,提供服務
服務消費者:獲取服務地址,使用服務接口調用服務,處理服務調用結果
公共項目: 包含公共配置:DO(和數據庫同步,用於持久化對象)、VO(傳輸數據)、工具包、接口等
依賴關系:依賴項目就像依賴jar包一樣
二、創建公共項目工程
創建公共項目工程,普通的maven項目,提供utils、DO、接口等代碼
三、服務提供者實現
普通的Maven工程(依賴Dubbo),提供服務實現、服務啟動功能。
①:創建項目並導入dubbo.jar
pom.xml
<dependencies> <dependency> <groupId>cn.itsource.dubbo.core</groupId> <artifactId>dubbo-demo-core</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!--以上的導入就是公共部分。--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.8.4a</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.9</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.9</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
②:實現本地服務類,不需要標記遠程服務
在調用過程中存在數據傳輸,因此需要轉成二進制,因此服務對象需要實現序列化,也就是實現Serializable接口
③:以spring配置文件的方式來注冊服務
dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="dubbo-test-provider" owner="sampson"></dubbo:application> <dubbo:protocol name="dubbo" port="20880"></dubbo:protocol> <!-- 局域網廣播注冊中心 --> <dubbo:registry address="multicast://239.5.6.7:1234" /> <!-- 配置式發布 --> <bean id="userService" class="cn.itsource.dubbo.provider.service.UserServiceImpl"></bean> <dubbo:service interface="cn.itsource.dubbo.core.service.IUserService" ref="userService"> </dubbo:service> <!-- 注解式發布 --> <!-- 掃描注解包路徑,多個包用逗號分隔,不填pacakge表示掃描當前ApplicationContext中所有的類 --> <dubbo:annotation package="cn.itsource.dubbo.provider.service" /> </beans>
④:啟動spring,並且加載配置文件,才能發布服務
啟動服務監聽
String configLocation = "classpath*:/dubbo-provider.xml"; ApplicationContext context = new ClassPathXmlApplicationContext(configLocation); System.out.println("dubbo-server服務正在監聽,按任意鍵退出"); System.in.read();//作用是從鍵盤讀出一個字符,返回unicode編碼(數字)此處用來終止程序結束,因為不輸出就不會結束
四、服務消費者實現
創建服務消費者項目:普通的Maven工程(依賴Dubbo),完成服務調用功能。
①:創建項目並導入dubbo.jar
pom.xml
<dependencies> <dependency> <groupId>cn.itsource.dubbo.core</groupId> <artifactId>dubbo-demo-core</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.8.4a</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.9</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.9</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.1.2.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
②:通過配置文件對接口的配置獲取本地代理對象的代碼
dubbo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <dubbo:application name="dubbo-test-consumer"></dubbo:application> <!-- 局域網廣播注冊中心 --> <dubbo:registry address="multicast://239.5.6.7:1234" /> <!-- 配置式調用服務 --> <!-- <dubbo:reference id="helloService" interface="cn.itsource.dubbo.core.service.IHelloService"> </dubbo:reference> --> <!-- 注解式調用服務 --> <!-- 掃描注解包路徑,多個包用逗號分隔,不填pacakge表示掃描當前ApplicationContext中所有的類 --> <dubbo:annotation package="cn.itsource.dubbo.consumer" /> </beans>
③:給接口產生了本地代理對象,並且把它納入spring管理
④:直接注入代理對象,調用方法完成遠程調用
JUnit4調用dubbo服務測試類
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.alibaba.dubbo.config.annotation.Reference; importcn.itsource.dubbo.core.service.IHelloService; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath*:/dubbo-consumer.xml"}) publicclass DubboServiceTest { @Reference private IHelloService helloService; @Test publicvoid testHello(){ String sayHi = helloService.sayHi("老宋"); System.out.println(sayHi); } }
五、直連模式
當消費者和服務者在同一台電腦或者服務器,可以采取直連模式。一般用於本地測試,部署在同一個
容器將失去微服務架構的優勢。
與之相對的check(檢查模式)。例如:A服務啟動會依賴於B服務,如果B服務沒有啟動的情況下,去
啟動A服務。如果check為false啟動時不會報錯,如果check為true,啟動就會報錯。
check:啟動檢查依賴關系
服務提供者:
修改注冊中心為:N/A模式(不注冊)
<dubbo:registry address="N/A" check="false"/>
check,A服務的啟動會依賴於B服務。如果B服務沒有啟動的情況下,去啟動A服務。如果check為false,啟動時不會報錯,調用時才報錯。如果check為true,啟動時就報錯。調試時用false,上線的時為true。
服務消費者:
修改注冊中心為:N/A模式(不注冊)
<dubbo:registry address="N/A" check="false"/>
配置本地調用地址映射:
然后在${user.home}/dubbo-resolve.properties文件中配置對應服務調用的本地地址
${user.home} 一般代表:C:\Users\{你當前登錄名}
dubbo-resolve.properties示例
cn.itsource.dubbo.core.service.IUserService=dubbo://localhost:20880 cn.itsource.dubbo.core.service.IHelloService=dubbo://localhost:20880 .....其它服務配置 |
六、dubbo服務打包
①. Dubbo服務提供者的運行方式有三種
通過一個配置文件初始化一個Spring容器。dubbo就會解析配置文件完成對應服務注冊。換句話說就是要啟動一個Spring。
1、 使用Servlet容器(不用)-ContextLoadListener
利用Tomcat、Jetty等WEB容器啟動Dubbo服務。
缺點:增加管理配置的復雜性,不必要地使用http端口,浪費內存資源
2、 Java的Main方法/Test方法中(不建議,本地調試可以用)
基於Spring框架,寫一個Java類並提供Main方法啟動。 new ApplicationContext
缺點:無法使用Dubbo的一些高級特性,服務的管理需要自己額外提供實現
3、 Dubbo框架Main方法(項目上線使用)
Dubbo框架本身提供了服務運行支持方法,基於com.alibaba.dubbo.container.Main
簡單高效地運行服務,該類其實就是一個帶Main函數的類,該main函數會根據特定路徑的配置文件創建一個Spring的容器。
很好地支持Dubbo服務的發布、關停(ShutdownHook)
②:Maven編譯打包
<groupId>cn.itsource.service</groupId>
<artifactId>service-user</artifactId>
<version>${service-user.version}</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 打包jar詳細配置 -->
<build>
<!-- jar包名字 -->
<finalName>service-user</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
官方文檔:dubbo會自動在classes/META-INF/spring下去加載spring的配置文件
因此打包時需要將spring配置文件復制到該目錄
-->
<resource>
<targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>spring-dubbo-provider.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>
<dependencies>
</dependencies>
③:dubbo服務jar包運行
Cmd窗口:
1、定位到jar包所在目錄
2、輸入命令並回車執行:java -jar xxxxx.jar &
dubbo服務打包是部署dubbo服務的必要方式之一。當執行java -jar時,會自動尋找程序入口(main函數)並運行。
&保持一致運行。