dubbo本地服務化實現(dubbo三)


一、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服務。如果checkfalse,啟動時不會報錯,調用時才報錯。如果checktrue,啟動時就報錯。調試時用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

利用TomcatJettyWEB容器啟動Dubbo服務。

缺點:增加管理配置的復雜性,不必要地使用http端口,浪費內存資源

2、 JavaMain方法/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函數)並運行。

  &保持一致運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM