dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务或Rpc服务
1.下载,编译,运行demo
1).安装zookeeper
下载:http://apache.claz.org/zookeeper/
配置 conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:/java/zookeeper-3.4.6/data
dataLogDir=D:/java/zookeeper-3.4.6/log
clientPort=2181
#server.1=localhost:2287:3387
启动
bin/zkServer.cmd 启用zookeeper
2).下载dubbo
git clone https://github.com/dangdangdotcom/dubbox
mvn install -Dmaven.test.skip=true 跳过测试编译
3).运行demo
运行服务提供方,zk里多出了一个dubbo的节点,服务全注册
dubboxdubbo-demodubbo-demo-providersrc estjavacomalibabadubbodemoproviderDemoProvider.java
运行服务消费方调用测试
dubboxdubbo-demodubbo-demo-consumersrc estjavacomalibabadubbodemoconsumerDemoConsumer.java
rest调用
dubboxdubbo-demodubbo-demo-consumersrc estjavacomalibabadubbodemoconsumerRestClient.java
浏览器访问
http://localhost:8888/services/users/100.xml 或 http://localhost:8888/services/users/100.json
2.简单demo
1).公用对象和接口
User
package cn.com.hello; import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 1L; private int age; private String name; private String sex; public User() { super(); } public User(int age, String name, String sex) { super(); this.age = age; this.name = name; this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
UserService
package cn.com.hello; import java.util.List; public interface UserService { String sayHello(String name); public List<User> getUsers(); }
2).生产者Provider
实现UserServiceImpl
package cn.com.hello.provider.impl; import java.util.ArrayList; import java.util.List; import com.alibaba.dubbo.config.annotation.Service; import cn.com.hello.UserService; import cn.com.hello.User; //@Service public class UserServiceImpl implements UserService { public String sayHello(String name) { return "Hello " + name; } public List<User> getUsers() { List<User> list = new ArrayList<User>(); User u1 = new User(); u1.setName("jack"); u1.setAge(20); u1.setSex("m"); User u2 = new User(); u2.setName("tom"); u2.setAge(21); u2.setSex("m"); User u3 = new User(); u3.setName("rose"); u3.setAge(19); u3.setSex("w"); list.add(u1); list.add(u2); list.add(u3); return list; } }
配置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.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="provider-helloworld" /> <!-- 使用 multicast广播注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" check="false" subscribe="false" register=""></dubbo:registry> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" server="grizzly" port="20880" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="cn.com.hello.UserService" ref="userService" /> <!-- 和本地bean一样实现服务 --> <bean id="userService" class="cn.com.hello.provider.impl.UserServiceImpl" /> </beans>
启动 Provider
package cn.com.hello.provider; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "dubbo-provider.xml" }); context.start(); System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟 } }
3).消费者Consumer
配置 dubbo-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.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="consumer-helloworld" /> <!-- 使用multicast广播注册中心暴露发现服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="userService" interface="cn.com.hello.UserService" /> </beans>
启动 Consumer
package cn.com.hello.consumer; import java.util.List; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.com.hello.UserService; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "dubbo-consumer.xml" }); context.start(); UserService userService = (UserService) context.getBean("userService"); String hello = userService.sayHello("guoxue"); System.out.println(hello); List list = userService.getUsers(); if (list != null && list.size() > 0) { for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } System.in.read(); } }
4).依赖jar
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>cn.com.hello</groupId> <artifactId>dubbo-hello</artifactId> <packaging>jar</packaging> <version>1.0.0</version> <properties> <spring_version>4.1.6.RELEASE</spring_version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring_version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</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-beans</artifactId> <version>${spring_version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring_version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring_version}</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.20.0-GA</version> </dependency> <dependency> <groupId>grizzly</groupId> <artifactId>grizzly</artifactId> <version>1.0.28</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>9.3.5.v20151012</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.4</version> </dependency> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.9.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.8.4</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- log --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.6.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.6.1</version> </dependency> <!-- log end --> <!-- TODO move versions into properties --> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0</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.glassfish.grizzly</groupId> <artifactId>grizzly-core</artifactId> <version>2.1.4</version> </dependency> </dependencies> <build> <finalName>dubbo-hello</finalName> </build> </project>
5).日志