前言: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的后台管理,其配置文件在webappWEB-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 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 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 |