dubbo的初級例子搭建

dubbo的初級例子搭建


一、服務端

首先新建一個工程,這裏採用微服務規範,新建一個user服務

目錄格式大概如上。


其中api是暴露給客戶端的,接口包含一個傳遞string方法和一個傳遞對象(dto)方法。

同樣dto暴露給客戶端


實現是兩個接口的實現

package com.dubbo.demo.impl;

import com.dubbo.demo.api.UserService;
import com.dubbo.demo.dto.UserDTO;
import org.springframework.stereotype.Service;

/**
 * Created by Administrator on 2016-12-12.
 */
@Service("userService")
public class UserServiceImpl implements UserService {

    /**
     * @return
     */
    public UserDTO getUserDTO() {
        UserDTO userDTO = new UserDTO();
        userDTO.setName("一頭豬");
        userDTO.setPassword("yitouzhu");
        userDTO.setAge(16);
        return userDTO;
    }
    
    /**
     * @return
     */
    public String getName() {
        return "String name hhhhhhhh";
    }
    
}

啓動服務的main方法:

package com.dubbo.demo.startup;

/**
 * Created by Administrator on 2016-12-12.
 */

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 *  啓動dubbo 服務
 *  
 */
public class DubboStart {
    public static void main(String[] args) {
        try {
            // 初始化Spring
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            System.out.println("dubbo provider is running...");
            System.in.read();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

配置文件:

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
     http://code.alibabatech.com/schema/dubbo
	 http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
	
	
	<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
	
    <context:component-scan base-package="com.dubbo.demo.*"/>

	<!-- enable autowire -->
	<context:annotation-config />


	<!-- 將服務service封裝成可以對外開放的服務, 同時提供負載均衡算法,loadbalance可選有random,roundrobin(輪詢) -->
	<!--service中加入   mock="return null"當service所有都掛掉以後,client調用時自動獲取到return null -->
	<!--service中加入 actives="10" 表示限制所有服務在每個客戶端調用都不能同時超過10個 -->
	<!--service中加入  executes="10" 表示限制所有服務在每個服務器端被調用都不能同時超過10個 -->
	<!-- 可以在service中加入內部標籤   <dubbo:method name="sayHello" actives="10" />來控制每個方法的執行併發個數 -->
	<!-- timeout="300" retry="2" 超時時間300    重試2次 -->
	<!-- owner=”WangHeping,Guoyong”該服務的負責人 -->
	<dubbo:service interface="com.dubbo.demo.api.UserService" ref="userService" loadbalance="roundrobin" />
	<!-- 提供方應用信息,用於計算依賴關係,不要與消費方一樣 -->
	<dubbo:application name="dubbo-service-demo" />
	<!-- 使用multicast廣播註冊中心暴露服務地址 <dubbo:registry address="multicast://224.5.6.7:1234" 
		/> -->
	<!-- 使用zookeeper註冊中心暴露服務地址 -->
	<dubbo:registry address="zookeeper://127.0.0.1:2181" />
	<!-- 用dubbo協議在20880端口暴露服務 ,注意不能與其他服務端口相同  -->
	<!-- dispatcher all所有請求都發到線程池處理,threadpool fixed固定線程池大小,初始化後不進行伸縮,threads 線程池內線程個數 -->
	<!-- <dubbo:protocol accesslog="true" />開啓訪問日誌記錄 -->
	<!-- <dubbo:protocol accesslog="http://10.20.160.198/wiki/display/dubbo/foo/bar.log" />規定訪問日誌的路徑 -->
	<!-- <dubbo:protocol name="dubbo" connections="2" accepts="1000"/> dubbo協議使用長連接和nio,這裏connections=2表示同時建立兩個長連接(要在provier和consumer同時寫上)
		accepts=1000  表示爲了防止同時過來大量連接而被幹掉,限制最大爲1000-->
	<dubbo:protocol name="dubbo" port="9090" server="netty" client="netty" 
					serialization="hessian2" charset="UTF-8" dispatcher="all" threadpool="fixed" threads="100" accesslog="true"/>
</beans>


這裏註冊中心使用的是zk,windows本地安裝,做一個假集羣可以。很方便。

netty協議,序列化使用hession2 別的好像沒什麼,dubbo的配置簡介方便是真的。


貼一下pom記錄吧。

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>dubbo</artifactId>
        <groupId>com.cl.dubbo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-service-impl</artifactId>

    <properties>
        <spring.version>3.0.5.RELEASE</spring.version>
        <slf4j.version>1.6.1</slf4j.version>
        <log4j.version>1.2.16</log4j.version>
    </properties>
    
    
    <dependencies>

        <dependency>
            <groupId>com.cl.dubbo</groupId>
            <artifactId>dubbo-service-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- spring  begin-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>


        <!--spring end -->

        <!-- dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.3.6</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.18.1-GA</version>
        </dependency>
        <!--dubbo end-->

        <!-- slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>dubbo-web</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

父pom

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>com.cl.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    
    <modules>
        <module>dubbo-service-api</module>
        <module>dubbo-service-impl</module>
    </modules>


    
    
</project>



下面是客戶端


客戶端創建一個maven的簡單web工程即可,maven是習慣,其他是測別的用的,我這有ssh velocity 等,都可以忽略。

目錄如下:



其中action調用服務端接口,獲取數據對象

代碼如下

package com.dubbo.demo.action;

import javax.annotation.Resource;

import com.dubbo.demo.dto.UserDTO;
import com.dubbo.demo.service.RemoteService;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;


/**
 * cltest
 */
@ParentPackage("default")
@Namespace("/")
public class UserAction extends UserBaseAction {
    
    @Resource
    RemoteService remoteService;

    @Action(value = "index", results = {
            @Result(name = "success", type = "velocity", location = "/content/index.vm")
    })
    public String index(){

        request = getRequest();
        UserDTO userDTO = remoteService.getTestName();
        request.setAttribute("name",userDTO.getName()+" "+userDTO.getPassword()+" "+ userDTO.getAge());
        
        
        return "success";
    }
    
    
}
package com.dubbo.demo.service;

import com.dubbo.demo.api.UserService;
import com.dubbo.demo.dto.UserDTO;
import org.springframework.stereotype.Service;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletContext;

import static org.apache.struts2.ServletActionContext.getServletContext;

/**
 * Created by Administrator on 2016-12-12.
 */
@Service("remoteService")
public class RemoteService {


    /**
     * 調用服務獲取name
     * @return
     */
    public UserDTO getTestName(){

        ServletContext context = getServletContext();
        WebApplicationContext applicationContext  = WebApplicationContextUtils.getWebApplicationContext(context);
        UserService userService = (UserService) applicationContext.getBean("userService"); // 獲取遠程服務代理
        UserDTO userDTO = userService.getUserDTO(); // 執行遠程方法
        return userDTO;
    }
    
}

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
	 http://code.alibabatech.com/schema/dubbo
	 http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
	
	
	<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
	
    <context:component-scan base-package="com.dubbo.demo.service"/>

	<!-- enable autowire -->
	<context:annotation-config />

	<!--名稱-->
	<dubbo:application name="dubbo-service-demo" />
	<dubbo:registry address="zookeeper://127.0.0.1:2181" />
	<!-- 生成遠程服務代理,可以像使用本地bean一樣使用demoService -->
	<dubbo:reference interface="com.dubbo.demo.api.UserService" id="userService">
	</dubbo:reference>


	<dubbo:protocol name="dubbo" port="9090" server="netty" client="netty" 
					serialization="hessian2" charset="UTF-8" dispatcher="all" threadpool="fixed" threads="100" accesslog="true"/>

</beans>


配置仍然很簡單,服務端端口,協議,接口路徑 id zk地址 這些基礎……



其實初級應用的角度,到這就可以實現一些東西去使用了

但是學習的角度,還需要深入瞭解dubbo具體服務如何註冊的,如何獲取,如何建立連接,維護連接池,序列化等等。

後續繼續吧,上個月的例子,做個備份。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章