Dubbox入门示例(注册服务器使用zookeeper)

jopen 8年前

前言:Dubbox now means Dubbo eXtensions, and it adds features like RESTful remoting, Kyro/FST serialization, etc to the Dubbo service framework. http://dangdangdotcom.github.io/dubbox

本文将在Dubbox的基础上进行演示

github地址:https://github.com/dangdangdotcom/dubbox

 

准备工作:

1,安装好 zookeeper (可参考前一篇文章)

2,安装好maven

3,安装git(也可以不安装,直接下载源码)

下面进入正式步骤

1,在 git 命令行下,下载项目源码  

git clone https://github.com/dangdangdotcom/dubbox

2,对下载下来的源码进行编译

mvn install -Dmaven.test.skip=true

3,下载下来的有一个文件夹  dubbo-demo ,这里包含了官方demo,可以参考。

    官方demo里包含了3个文件夹 dubbo-demo-api(服务接口及传输对象)、dubbo-demo-provider(服务生产者)、dubbo-demo-consumer(服务消费方)

4,下载下来的有一个文件夹 dubbo-admin,这个是dubbo的后台管理,其配置文件在webapp\WEB-INF\底下,名为 dubbo.properties

dubbo.registry.address=zookeeper://127.0.0.1:2181  dubbo.admin.root.password=root  dubbo.admin.guest.password=guest

    将 dubbo-admin 打成war包,放在tomcat底下,即可以在浏览器进入dubo的后台,进行管理。

    注意:zookeeper启动之后会占用8080端口。

    

5,dubbo-monitor项目用于性能监控

6,模拟官方demo,编写小demo

    6.1,新建api项目

    

    pom.xml

<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/maven-v4_0_0.xsd">   <modelVersion>4.0.0</modelVersion>   <groupId>org.viking</groupId>   <artifactId>dubbo-hello-api</artifactId>   <version>0.0.1-SNAPSHOT</version>   <name>dubbo-hello-api</name>   <dependencies>    <dependency>              <groupId>com.alibaba</groupId>              <artifactId>dubbo</artifactId>              <version>2.8.4</version>          </dependency>          <dependency>              <groupId>javax.validation</groupId>              <artifactId>validation-api</artifactId>              <version>1.0.0.GA</version>          </dependency>          <dependency>              <groupId>javax.annotation</groupId>              <artifactId>javax.annotation-api</artifactId>              <version>1.2</version>          </dependency>          <dependency>              <groupId>org.codehaus.jackson</groupId>              <artifactId>jackson-mapper-asl</artifactId>              <version>1.9.12</version>          </dependency>   </dependencies>   <build>    <finalName>dubbo-hello-api</finalName>   </build>  </project>

    SerializationOptimizerImpl.java

/**   * Copyright 1999-2014 dangdang.com.   *   * Licensed under the Apache License, Version 2.0 (the "License");   * you may not use this file except in compliance with the License.   * You may obtain a copy of the License at   *   *      http://www.apache.org/licenses/LICENSE-2.0   *   * Unless required by applicable law or agreed to in writing, software   * distributed under the License is distributed on an "AS IS" BASIS,   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   * See the License for the specific language governing permissions and   * limitations under the License.   */  package viking.dubbo.demo.api;    import com.alibaba.dubbo.common.serialize.support.SerializationOptimizer;  import java.util.Collection;  import java.util.LinkedList;  import java.util.List;    /**   * This class must be accessible from both the provider and consumer   *   * @author lishen   */  public class SerializationOptimizerImpl implements SerializationOptimizer {        public Collection<Class> getSerializableClasses() {          List<Class> classes = new LinkedList<Class>();          classes.add(User.class);          return classes;      }  }

    User.java

package viking.dubbo.demo.api;  import org.codehaus.jackson.annotate.JsonProperty;  import javax.validation.constraints.Min;  import javax.validation.constraints.NotNull;  import javax.validation.constraints.Size;  import javax.xml.bind.annotation.XmlAccessType;  import javax.xml.bind.annotation.XmlAccessorType;  import javax.xml.bind.annotation.XmlElement;  import javax.xml.bind.annotation.XmlRootElement;  import java.io.Serializable;     @XmlRootElement  @XmlAccessorType(XmlAccessType.FIELD)  public class User implements Serializable {         @NotNull      @Min(1L)      private Long id;         @JsonProperty("username")      @XmlElement(name = "username")      @NotNull      @Size(min = 6, max = 50)      private String name;         public User() {      }         public User(Long id, String name) {          this.id = id;          this.name = name;      }         public Long getId() {          return id;      }         public void setId(Long id) {          this.id = id;      }         public String getName() {          return name;      }         public void setName(String name) {          this.name = name;      }         @Override      public String toString() {          return "User (" +                  "id=" + id +                  ", name='" + name + '\'' +                  ')';      }  }

    UserRestService.java

package viking.dubbo.demo.api;    import javax.validation.constraints.Min;    public interface UserRestService {   User getUser(@Min(value = 1L, message = "User ID must be greater than 1") Long id);  }

    UserService.java

package viking.dubbo.demo.api;    public interface UserService {   User getUser(Long id);  }

    

    6.2,新建provider

    pom.xml

<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/maven-v4_0_0.xsd">   <modelVersion>4.0.0</modelVersion>   <groupId>org.viking</groupId>   <artifactId>dubbo-hello-provider</artifactId>   <version>0.0.1-SNAPSHOT</version>   <name>dubbo-hello-provider</name>   <dependencies>    <!--公用的服务接口 -->    <dependency>     <groupId>org.viking</groupId>     <artifactId>dubbo-hello-api</artifactId>     <version>0.0.1-SNAPSHOT</version>    </dependency>      <dependency>     <groupId>com.alibaba</groupId>     <artifactId>dubbo</artifactId>     <version>2.8.4</version>    </dependency>      <dependency>     <groupId>org.javassist</groupId>     <artifactId>javassist</artifactId>     <version>3.15.0-GA</version>    </dependency>      <dependency>     <groupId>org.apache.mina</groupId>     <artifactId>mina-core</artifactId>     <version>1.1.7</version>    </dependency>      <dependency>     <groupId>org.glassfish.grizzly</groupId>     <artifactId>grizzly-core</artifactId>     <version>2.1.4</version>    </dependency>      <dependency>     <groupId>org.apache.httpcomponents</groupId>     <artifactId>httpclient</artifactId>     <version>4.2.1</version>    </dependency>      <dependency>     <groupId>com.alibaba</groupId>     <artifactId>fastjson</artifactId>     <version>1.1.39</version>    </dependency>      <dependency>     <groupId>com.thoughtworks.xstream</groupId>     <artifactId>xstream</artifactId>     <version>1.4.1</version>    </dependency>      <dependency>     <groupId>org.apache.bsf</groupId>     <artifactId>bsf-api</artifactId>     <version>3.1</version>    </dependency>      <dependency>     <groupId>org.apache.zookeeper</groupId>     <artifactId>zookeeper</artifactId>     <version>3.4.6</version>    </dependency>      <dependency>     <groupId>com.github.sgroschupf</groupId>     <artifactId>zkclient</artifactId>     <version>0.1</version>    </dependency>      <dependency>     <groupId>org.apache.curator</groupId>     <artifactId>curator-framework</artifactId>     <version>2.5.0</version>    </dependency>      <dependency>     <groupId>com.googlecode.xmemcached</groupId>     <artifactId>xmemcached</artifactId>     <version>1.3.6</version>    </dependency>      <dependency>     <groupId>org.apache.cxf</groupId>     <artifactId>cxf-rt-frontend-simple</artifactId>     <version>2.6.1</version>    </dependency>      <dependency>     <groupId>org.apache.cxf</groupId>     <artifactId>cxf-rt-transports-http</artifactId>     <version>2.6.1</version>    </dependency>      <dependency>     <groupId>org.apache.thrift</groupId>     <artifactId>libthrift</artifactId>     <version>0.8.0</version>    </dependency>      <dependency>     <groupId>com.caucho</groupId>     <artifactId>hessian</artifactId>     <version>4.0.7</version>    </dependency>      <dependency>     <groupId>javax.servlet</groupId>     <artifactId>javax.servlet-api</artifactId>     <version>3.1.0</version>    </dependency>      <dependency>     <groupId>org.mortbay.jetty</groupId>     <artifactId>jetty</artifactId>     <version>6.1.26</version>     <exclusions>      <exclusion>       <groupId>org.mortbay.jetty</groupId>       <artifactId>servlet-api</artifactId>      </exclusion>     </exclusions>    </dependency>      <dependency>     <groupId>log4j</groupId>     <artifactId>log4j</artifactId>     <version>1.2.16</version>    </dependency>      <dependency>     <groupId>org.slf4j</groupId>     <artifactId>slf4j-api</artifactId>     <version>1.6.2</version>    </dependency>      <dependency>     <groupId>redis.clients</groupId>     <artifactId>jedis</artifactId>     <version>2.1.0</version>    </dependency>      <dependency>     <groupId>javax.validation</groupId>     <artifactId>validation-api</artifactId>     <version>1.0.0.GA</version>    </dependency>      <dependency>     <groupId>org.hibernate</groupId>     <artifactId>hibernate-validator</artifactId>     <version>4.2.0.Final</version>    </dependency>      <dependency>     <groupId>javax.cache</groupId>     <artifactId>cache-api</artifactId>     <version>0.4</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-jaxrs</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-client</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-netty</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-jdk-http</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-jackson-provider</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-jaxb-provider</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.apache.tomcat.embed</groupId>     <artifactId>tomcat-embed-core</artifactId>     <version>8.0.11</version>    </dependency>      <dependency>     <groupId>org.apache.tomcat.embed</groupId>     <artifactId>tomcat-embed-logging-juli</artifactId>     <version>8.0.11</version>    </dependency>      <dependency>     <groupId>com.esotericsoftware.kryo</groupId>     <artifactId>kryo</artifactId>     <version>2.24.0</version>    </dependency>      <dependency>     <groupId>de.javakaffee</groupId>     <artifactId>kryo-serializers</artifactId>     <version>0.26</version>    </dependency>      <dependency>     <groupId>de.ruedigermoeller</groupId>     <artifactId>fst</artifactId>     <version>1.55</version>    </dependency>   </dependencies>   <build>    <finalName>dubbo-hello-provider</finalName>   </build>  </project>

    DemoProvider.java

package viking.dubbo.demo.provider;    import java.io.IOException;  import org.springframework.context.support.ClassPathXmlApplicationContext;    public class DemoProvider {   public static void main(String[] args) throws IOException {          ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/*.xml");          context.start();          System.out.println("服务已经启动...");          System.in.read();      }  }

    UserRestServiceImpl.java

package viking.dubbo.demo.provider;    import com.alibaba.dubbo.rpc.RpcContext;  import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;  import viking.dubbo.demo.api.User;  import viking.dubbo.demo.api.UserRestService;  import viking.dubbo.demo.api.UserService;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  import javax.ws.rs.*;  import javax.ws.rs.core.MediaType;     @Path("users")  @Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})  @Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})  public class UserRestServiceImpl implements UserRestService {         private UserService userService;         public void setUserService(UserService userService) {          this.userService = userService;      }         @GET      @Path("{id : \\d+}")      public User getUser(@PathParam("id") Long id) {          if (RpcContext.getContext().getRequest(HttpServletRequest.class) != null) {              System.out.println("Client IP address from RpcContext: " + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr());          }          if (RpcContext.getContext().getResponse(HttpServletResponse.class) != null) {              System.out.println("Response object from RpcContext: " + RpcContext.getContext().getResponse(HttpServletResponse.class));          }          return userService.getUser(id);      }  }

    UserServiceImpl.java

package viking.dubbo.demo.provider;    import viking.dubbo.demo.api.User;  import viking.dubbo.demo.api.UserService;    public class UserServiceImpl implements UserService {   public User getUser(Long id) {    return new User(id, "username" + id);   }  }

    dubbo-demo-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="demo-provider" owner="programmer" organization="dubbox"/>        <dubbo:registry address="zookeeper://127.0.0.1:2181"/>        <dubbo:protocol name="dubbo" serialization="kryo" optimizer="viking.dubbo.demo.api.SerializationOptimizerImpl"/>        <!-- use tomcat server -->      <dubbo:protocol name="rest" port="8888" threads="500" contextpath="services" server="tomcat" accepts="500"                      extension="com.alibaba.dubbo.rpc.protocol.rest.support.LoggingFilter"/>          <dubbo:service interface="viking.dubbo.demo.api.UserService" ref="userService" protocol="dubbo" />        <dubbo:service interface="viking.dubbo.demo.api.UserRestService" ref="userRestService" protocol="rest"  validation="true"/>        <bean id="userService" class="viking.dubbo.demo.provider.UserServiceImpl"/>        <bean id="userRestService" class="viking.dubbo.demo.provider.UserRestServiceImpl">          <property name="userService" ref="userService"/>      </bean>    </beans>

    6.3,新建 consumer

    pom.xml

<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/maven-v4_0_0.xsd">   <modelVersion>4.0.0</modelVersion>   <groupId>org.viking</groupId>   <artifactId>dubbo-hello-consumer</artifactId>   <version>0.0.1-SNAPSHOT</version>   <name>dubbo-hello-consumer</name>   <dependencies>    <!--公用的服务接口 -->    <dependency>     <groupId>org.viking</groupId>     <artifactId>dubbo-hello-api</artifactId>     <version>0.0.1-SNAPSHOT</version>    </dependency>        <dependency>     <groupId>com.alibaba</groupId>     <artifactId>dubbo</artifactId>     <version>2.8.4</version>    </dependency>      <dependency>     <groupId>org.javassist</groupId>     <artifactId>javassist</artifactId>     <version>3.15.0-GA</version>    </dependency>      <dependency>     <groupId>org.apache.mina</groupId>     <artifactId>mina-core</artifactId>     <version>1.1.7</version>    </dependency>      <dependency>     <groupId>org.glassfish.grizzly</groupId>     <artifactId>grizzly-core</artifactId>     <version>2.1.4</version>    </dependency>      <dependency>     <groupId>org.apache.httpcomponents</groupId>     <artifactId>httpclient</artifactId>     <version>4.2.1</version>    </dependency>      <dependency>     <groupId>com.alibaba</groupId>     <artifactId>fastjson</artifactId>     <version>1.1.39</version>    </dependency>      <dependency>     <groupId>com.thoughtworks.xstream</groupId>     <artifactId>xstream</artifactId>     <version>1.4.1</version>    </dependency>      <dependency>     <groupId>org.apache.bsf</groupId>     <artifactId>bsf-api</artifactId>     <version>3.1</version>    </dependency>      <dependency>     <groupId>org.apache.zookeeper</groupId>     <artifactId>zookeeper</artifactId>     <version>3.4.6</version>    </dependency>      <dependency>     <groupId>com.github.sgroschupf</groupId>     <artifactId>zkclient</artifactId>     <version>0.1</version>    </dependency>      <dependency>     <groupId>org.apache.curator</groupId>     <artifactId>curator-framework</artifactId>     <version>2.5.0</version>    </dependency>      <dependency>     <groupId>com.googlecode.xmemcached</groupId>     <artifactId>xmemcached</artifactId>     <version>1.3.6</version>    </dependency>      <dependency>     <groupId>org.apache.cxf</groupId>     <artifactId>cxf-rt-frontend-simple</artifactId>     <version>2.6.1</version>    </dependency>      <dependency>     <groupId>org.apache.cxf</groupId>     <artifactId>cxf-rt-transports-http</artifactId>     <version>2.6.1</version>    </dependency>      <dependency>     <groupId>org.apache.thrift</groupId>     <artifactId>libthrift</artifactId>     <version>0.8.0</version>    </dependency>      <dependency>     <groupId>com.caucho</groupId>     <artifactId>hessian</artifactId>     <version>4.0.7</version>    </dependency>      <dependency>     <groupId>javax.servlet</groupId>     <artifactId>javax.servlet-api</artifactId>     <version>3.1.0</version>    </dependency>      <dependency>     <groupId>org.mortbay.jetty</groupId>     <artifactId>jetty</artifactId>     <version>6.1.26</version>     <exclusions>      <exclusion>       <groupId>org.mortbay.jetty</groupId>       <artifactId>servlet-api</artifactId>      </exclusion>     </exclusions>    </dependency>      <dependency>     <groupId>log4j</groupId>     <artifactId>log4j</artifactId>     <version>1.2.16</version>    </dependency>      <dependency>     <groupId>org.slf4j</groupId>     <artifactId>slf4j-api</artifactId>     <version>1.6.2</version>    </dependency>      <dependency>     <groupId>redis.clients</groupId>     <artifactId>jedis</artifactId>     <version>2.1.0</version>    </dependency>      <dependency>     <groupId>javax.validation</groupId>     <artifactId>validation-api</artifactId>     <version>1.0.0.GA</version>    </dependency>      <dependency>     <groupId>org.hibernate</groupId>     <artifactId>hibernate-validator</artifactId>     <version>4.2.0.Final</version>    </dependency>      <dependency>     <groupId>javax.cache</groupId>     <artifactId>cache-api</artifactId>     <version>0.4</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-jaxrs</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-client</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-netty</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-jdk-http</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-jackson-provider</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.jboss.resteasy</groupId>     <artifactId>resteasy-jaxb-provider</artifactId>     <version>3.0.7.Final</version>    </dependency>      <dependency>     <groupId>org.apache.tomcat.embed</groupId>     <artifactId>tomcat-embed-core</artifactId>     <version>8.0.11</version>    </dependency>      <dependency>     <groupId>org.apache.tomcat.embed</groupId>     <artifactId>tomcat-embed-logging-juli</artifactId>     <version>8.0.11</version>    </dependency>      <dependency>     <groupId>com.esotericsoftware.kryo</groupId>     <artifactId>kryo</artifactId>     <version>2.24.0</version>    </dependency>      <dependency>     <groupId>de.javakaffee</groupId>     <artifactId>kryo-serializers</artifactId>     <version>0.26</version>    </dependency>      <dependency>     <groupId>de.ruedigermoeller</groupId>     <artifactId>fst</artifactId>     <version>1.55</version>    </dependency>   </dependencies>   <build>    <finalName>dubbo-hello-consumer</finalName>   </build>  </project>

DemoConsumer.java

package viking.dubbo.demo.consumer;    import org.springframework.context.support.ClassPathXmlApplicationContext;  import viking.dubbo.demo.api.UserService;  import javax.ws.rs.client.Client;  import javax.ws.rs.client.ClientBuilder;  import javax.ws.rs.client.WebTarget;  import javax.ws.rs.core.Response;     public class DemoConsumer {         public static void main(String[] args) {          final String port = "8888";             //测试Rest服务          getUser("http://localhost:" + port + "/services/users/1.json");          getUser("http://localhost:" + port + "/services/users/1.xml");             //测试常规服务          ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/*.xml");          context.start();          UserService userService = context.getBean(UserService.class);          System.out.println(userService.getUser(1L));      }            private static void getUser(String url) {          System.out.println("Getting user via " + url);          Client client = ClientBuilder.newClient();          WebTarget target = client.target(url);          Response response = target.request().get();          try {              if (response.getStatus() != 200) {                  throw new RuntimeException("Failed with HTTP error code : " + response.getStatus());              }              System.out.println("Successfully got result: " + response.readEntity(String.class));          } finally {              response.close();              client.close();          }      }  }

    dubbo-hello-consumer.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="demo-consumer" owner="programmer" organization="dubbox"/>        <dubbo:registry address="zookeeper://127.0.0.1:2181"/>        <dubbo:reference id="userRestService" interface="viking.dubbo.demo.api.UserRestService"/>        <dubbo:reference id="userService" interface="viking.dubbo.demo.api.UserService"/>    </beans>

 

7,运行查看结果

    首先运行 provider,然后运行 consumer,同时也可以在dubbo的后台管理查看结果

Getting user via http://localhost:8888/services/users/1.json  log4j:WARN No appenders could be found for logger (org.jboss.resteasy.plugins.providers.DocumentProvider).  log4j:WARN Please initialize the log4j system properly.  log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.  Successfully got result: {"id":1,"username":"username1"}  Getting user via http://localhost:8888/services/users/1.xml  Successfully got result: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><id>1</id><username>username1</username></user>  User (id=1, name='username1')

来自: http://my.oschina.net/u/238296/blog/602446