1、zookeeper的安装
首先从网上下载zookeeper版本,我这里使用的是3.4.10,上传至Linux服务器/opt路径,并解压

将/opt/zookeeper-3.4.10/conf路径下的zoo_sample.cfg复制一份并修改名称为zoo.cfg

进入到/opt/zookeeper-3.4.10/bin目录,然后启动(这里我没有做集群)

启动命令如下:

注意将防火墙关闭掉。service iptables stop
2、新建3个Spring boot项目(maven工程)
一个接口工程(dubbo-interface)、一个提供者(dubbo-provider)、一个消费者(dubbo-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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.demo</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入dubbo包和zkclient包 由于maven中央库中无此jar,需要手动下载然后放入到本地库中 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
</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>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>3.7.0.Final</version>
</dependency>
<!-- -->
<dependency>
<groupId>com.company.demo</groupId>
<artifactId>dubbo-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
消费者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>com.company.demo</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入dubbo包和zkclient包 由于maven中央库中无此jar,需要手动下载然后放入到本地库中-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.1-GA</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>3.7.0.Final</version>
</dependency>
<dependency>
<groupId>com.company.demo</groupId>
<artifactId>dubbo-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
接口工程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>com.company.demo</groupId>
<artifactId>dubbo-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、提供者目录结构如下:

application.properties中为
dubbo.application.name=dubbo-provier
dubbo.application.logger=slf4j
dubbo.annotation.package=com.company.service (因为我使用的注解,所以这里要添加dubbo注解包所在的范围,如果设置,默认为Spring 容器所扫描到的组件)
dubbo.protocol.name=dubbo
dubbo.protocol.port=21883
dubbo.protocol.accessLog=true
dubbo.provider.timeout=20000
dubbo.provider.retries=1
dubbo.provider.delay=-1
dubbo.registr.protocol=zookeeper
dubbo.registry.address=192.168.0.136:2181
dubbo.registry.register=true
dubbo.reference.check=false
DubboConfiguration.java 文件为配置文件,内容如下:
package com.company.service.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.AnnotationBean;
import com.alibaba.dubbo.rpc.Exporter;
@Configuration
@ConditionalOnClass(Exporter.class)
@PropertySource(value = "classpath:/application.properties")
public class DubboConfiguration {
@Value("${dubbo.application.name}")
private String applicationName;
@Value("${dubbo.registr.protocol}")
private String protocol;
@Value("${dubbo.registry.address}")
private String registryAddress;
@Value("${dubbo.protocol.name}")
private String protocolName;
@Value("${dubbo.protocol.port}")
private int protocolPort;
@Value("${dubbo.provider.timeout}")
private int timeout;
@Value("${dubbo.provider.retries}")
private int retries;
@Value("${dubbo.provider.delay}")
private int delay;
@Value("${dubbo.reference.check}")
private boolean check;
/**
* 设置dubbo扫描包
*
* @param packageName
* @return
*/
@Bean
public static AnnotationBean annotationBean(@Value("${dubbo.annotation.package}") String packageName) {
AnnotationBean annotationBean = new AnnotationBean();
annotationBean.setPackage(packageName);
return annotationBean;
}
/**
* 注入dubbo上下文
*
* @return
*/
@Bean
public ApplicationConfig applicationConfig() {
// 当前应用配置
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName(this.applicationName);
return applicationConfig;
}
/**
* 注入dubbo注册中心配置,基于zookeeper
*
* @return
*/
@Bean
public RegistryConfig registryConfig() {
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setProtocol(protocol);
registry.setAddress(registryAddress);
registry.setTimeout(100000); //自行添加的2017-12-25 由于报错 Unable to connect to zookeeper server within timeout: 5000
return registry;
}
/**
* 默认基于dubbo协议提供服务
*
* @return
*/
@Bean
public ProtocolConfig protocolConfig() {
// 服务提供者协议配置
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName(protocolName);
protocolConfig.setPort(protocolPort);
protocolConfig.setThreads(200);
System.out.println("默认protocolConfig:" + protocolConfig.hashCode());
return protocolConfig;
}
/**
* dubbo服务提供
*
* @param applicationConfig
* @param registryConfig
* @param protocolConfig
* @return
*/
@Bean(name = "dubboProvider")
public ProviderConfig providerConfig(ApplicationConfig applicationConfig, RegistryConfig registryConfig, ProtocolConfig protocolConfig) {
ProviderConfig providerConfig = new ProviderConfig();
providerConfig.setTimeout(timeout);
providerConfig.setRetries(retries);
providerConfig.setDelay(delay);
providerConfig.setApplication(applicationConfig);
providerConfig.setRegistry(registryConfig);
providerConfig.setProtocol(protocolConfig);
return providerConfig;
}
/**
* dubbo消费
*
* @param applicationConfig
* @param registryConfig
* @return
*/
@Bean(name = "defaultConsumer")
public ConsumerConfig consumerConfig(ApplicationConfig applicationConfig, RegistryConfig registryConfig) {
ConsumerConfig consumerConfig = new ConsumerConfig();
consumerConfig.setCheck(check);
return consumerConfig;
}
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public String getRegistryAddress() {
return registryAddress;
}
public void setRegistryAddress(String registryAddress) {
this.registryAddress = registryAddress;
}
public String getProtocolName() {
return protocolName;
}
public void setProtocolName(String protocolName) {
this.protocolName = protocolName;
}
public int getProtocolPort() {
return protocolPort;
}
public void setProtocolPort(int protocolPort) {
this.protocolPort = protocolPort;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public int getRetries() {
return retries;
}
public void setRetries(int retries) {
this.retries = retries;
}
public int getDelay() {
return delay;
}
public void setDelay(int delay) {
this.delay = delay;
}
}
在提供者工程中写一个实现类,需要实现一个接口(位于接口工程中的)

接口类如下

接口工程比较简单,详见上面截图
消费者工程如下:

其中application.properties文件内容如下;
server.port=8888 (我这里是一个Web工程,所以这里是设置了端口号)
dubbo.application.name=dubbo-consumer
dubbo.application.logger=slf4j
dubbo.annotation.package=com.company.controller(理由同上,我这里使用的注解,所以最好设置下dubbo注解所在类的包路径,不设置的话默认为Spring Bean所在的包路径)
dubbo.protocol.name=dubbo
dubbo.protocol.port=21883
dubbo.protocol.accessLog=true
dubbo.provider.timeout=20000
dubbo.provider.retries=1
dubbo.provider.delay=-1
dubbo.registr.protocol=zookeeper
dubbo.registry.address=192.168.0.136:2181
dubbo.registry.register=true
dubbo.reference.check=false
启动类为:
package com.company.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
Controller为:
package com.company.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.company.service.UserInfoService;
@RestController
public class UserInfoController {
private static final Logger logger = LoggerFactory.getLogger(UserInfoController.class);
@Reference(version = "1.0.0",consumer = "defaultConsumer")
private UserInfoService userInfoService;
@RequestMapping(value = "/test/{name}")
public String getUser(@PathVariable String name) {
logger.debug("传入参数:" + name );
logger.info("调用dubbo方法:" + userInfoService.getUserInfo(name));
return name;
}
}
dubbo配置类和提供者工程中保持一致即可,如下所示
package com.company.controller.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.AnnotationBean;
import com.alibaba.dubbo.rpc.Exporter;
@Configuration
@ConditionalOnClass(Exporter.class)
@PropertySource(value = "classpath:/application.properties")
public class DubboConfiguration {
@Value("${dubbo.application.name}")
private String applicationName;
@Value("${dubbo.registr.protocol}")
private String protocol;
@Value("${dubbo.registry.address}")
private String registryAddress;
@Value("${dubbo.protocol.name}")
private String protocolName;
@Value("${dubbo.protocol.port}")
private int protocolPort;
@Value("${dubbo.provider.timeout}")
private int timeout;
@Value("${dubbo.provider.retries}")
private int retries;
@Value("${dubbo.provider.delay}")
private int delay;
@Value("${dubbo.reference.check}")
private boolean check;
/**
* 设置dubbo扫描包
*
* @param packageName
* @return
*/
@Bean
public static AnnotationBean annotationBean(@Value("${dubbo.annotation.package}") String packageName) {
AnnotationBean annotationBean = new AnnotationBean();
annotationBean.setPackage(packageName);
return annotationBean;
}
/**
* 注入dubbo上下文
*
* @return
*/
@Bean
public ApplicationConfig applicationConfig() {
// 当前应用配置
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName(this.applicationName);
return applicationConfig;
}
/**
* 注入dubbo注册中心配置,基于zookeeper
*
* @return
*/
@Bean
public RegistryConfig registryConfig() {
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setProtocol(protocol);
registry.setAddress(registryAddress);
registry.setTimeout(100000);registry.setTimeout(100000); //自行添加的2017-12-25 由于报错 Unable to connect to zookeeper server within timeout: 5000
return registry;
}
/**
* 默认基于dubbo协议提供服务
*
* @return
*/
@Bean
public ProtocolConfig protocolConfig() {
// 服务提供者协议配置
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName(protocolName);
protocolConfig.setPort(protocolPort);
protocolConfig.setThreads(200);
System.out.println("默认protocolConfig:" + protocolConfig.hashCode());
return protocolConfig;
}
/**
* dubbo服务提供
*
* @param applicationConfig
* @param registryConfig
* @param protocolConfig
* @return
*/
@Bean(name = "dubboProvider")
public ProviderConfig providerConfig(ApplicationConfig applicationConfig, RegistryConfig registryConfig, ProtocolConfig protocolConfig) {
ProviderConfig providerConfig = new ProviderConfig();
providerConfig.setTimeout(timeout);
providerConfig.setRetries(retries);
providerConfig.setDelay(delay);
providerConfig.setApplication(applicationConfig);
providerConfig.setRegistry(registryConfig);
providerConfig.setProtocol(protocolConfig);
return providerConfig;
}
/**
* dubbo消费
*
* @param applicationConfig
* @param registryConfig
* @return
*/
@Bean(name = "defaultConsumer")
public ConsumerConfig consumerConfig(ApplicationConfig applicationConfig, RegistryConfig registryConfig) {
ConsumerConfig consumerConfig = new ConsumerConfig();
consumerConfig.setCheck(check);
return consumerConfig;
}
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public String getRegistryAddress() {
return registryAddress;
}
public void setRegistryAddress(String registryAddress) {
this.registryAddress = registryAddress;
}
public String getProtocolName() {
return protocolName;
}
public void setProtocolName(String protocolName) {
this.protocolName = protocolName;
}
public int getProtocolPort() {
return protocolPort;
}
public void setProtocolPort(int protocolPort) {
this.protocolPort = protocolPort;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public int getRetries() {
return retries;
}
public void setRetries(int retries) {
this.retries = retries;
}
public int getDelay() {
return delay;
}
public void setDelay(int delay) {
this.delay = delay;
}
}
最后先确保zookeeper在运行,并且端口能访问。然后先启动提供者工程,后启动消费者工程
最后测试下,看是否能正常调用
