从demo 开始学dubbo
dubbo 介绍
dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案, 以及SOA服务治理方案.
其核心部分包含:
远程通信:
提供对多种基于长连接的NIO框架抽象封装, 包括多种线程模型,序列化, 以及”请求-响应”模式的信息交换方式.
集群容错:
提供基于接口方法的透明远程过程调用, 包括多协议支持,以及软负载均衡,失败容错, 地址路由, 动态配置等集群支持。
自动发现:
基于注册中心目录服务,使服务消费者能动态查找服务提供方, 是地址透明,是服务提供方可以平滑增加或者减少机器。
【引自[dubbo官网介绍](http://dubbo.io/Home-zh.htm】
demo地址
下载三个项目并导入到eclipse中:
- test-service-api
IUserService 服务接口:
package jzq.lz.test_service_api;
public interface IUserService {
UserEntity queryUserEntity();
}
UserEntity:
import java.io.Serializable;
public class UserEntity implements Serializable {
private static final long serialVersionUID = 1L;
private String userName;
private Integer userId;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserEntity [userName=" + userName + ", userId=" + userId + ", password=" + password + "]";
}
}
- dubbo-demo-consumer
App :
package jzq.lz.test_service_consumer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import jzq.lz.test_service_api.IUserService;
import jzq.lz.test_service_api.UserEntity;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-consumer.xml");
IUserService demoService = (IUserService)context.getBean("userService"); // 获取远程服务代理
UserEntity user = demoService.queryUserEntity();
System.out.println(user);
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
dubbo-consummer.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-userService" />
<!-- 使用multicast广播注册中心暴露服务地址 -->
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://192.168.0.223:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="userService" interface="jzq.lz.test_service_api.IUserService" />
</beans>
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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jzq.lz</groupId>
<artifactId>test-service-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test-service-consumer</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<distributionManagement>
<repository>
<id> releases </id>
<name> Nexus Release Repository </name>
<url> http://192.168.0.101:8081/nexus/content/repositories/releases/ </url>
</repository>
<snapshotRepository>
<id> snapshots </id >
<name> Nexus Snapshot Repository </name >
<url> http://192.168.0.101:8081/nexus/content/repositories/snapshots/ </url>
</snapshotRepository>
</distributionManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jzq.lz</groupId>
<artifactId>test-service-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.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>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
</dependencies>
</project>
- dubbo-demo-provider
Main:
package jzq.lz.test.service.provider;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Hello world!
*
*/
public class Main
{
public static void main( String[] args )
{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml");
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
UserServiceIml服务是实现:
package jzq.lz.test.service.provider;
import jzq.lz.test_service_api.IUserService;
import jzq.lz.test_service_api.UserEntity;
public class UserServiceIml implements IUserService {
@Override
public UserEntity queryUserEntity() {
UserEntity userEntity = new UserEntity();
userEntity.setPassword("123456");
userEntity.setUserId(123);
userEntity.setUserName("18320928860");
return userEntity;
}
}
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="hello-world-app" />
<!-- 使用multicast广播注册中心暴露服务地址 -->
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://192.168.0.223:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="jzq.lz.test_service_api.IUserService" ref="userService" />
<!-- 和本地bean一样实现服务 -->
<bean id="userService" class="jzq.lz.test.service.provider.UserServiceIml" />
</beans>
运行结果
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
UserEntity [userName=18320928860, userId=123, password=123456]
xml报错提示
cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dubbo:application'.
可参考 esclipse 添加xsd 校验