基本步骤
- 创建接口api
- 创建服务提供方
- 创建服务消费者
创建接口api
基本步骤:
- 创建一个maven项目
- 修改pom.xml文件
- 新增接口
创建一个maven项目
配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<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.ahut</groupId>
<artifactId>demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo-api</name>
<description>demo-api</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<build>
<!-- 新增配置 -->
<!-- 添加默认的全局,不然会打包失败 -->
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建com.ahut.service包,创建DemoService接口,代码如下:
package com.ahut.service;
/**
* @author cheng
* @interfaceName: DemoService
* @description: 用于演示的业务逻辑接口
* @dateTime 2018/5/14 15:46
*/
public interface DemoService {
/**
* @description: 演示接口
* @author cheng
* @dateTime 2018/5/14 15:49
*/
void sayHello(String name);
}
发布项目到maven本地仓库
创建服务提供方
基本步骤:
- 创建一个springboot项目
- 在pom.xml中添加依赖
- 新增接口api的实现
- 新增dubbo的配置
- 配置application.properties
- 修改程序主入口
创建一个spring boot项目
在pom.xml中新增以下依赖:
<?xml version="1.0" encoding="UTF-8"?>
<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.ahut</groupId>
<artifactId>demo-producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo-producer</name>
<description>demo-producer</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- 引入接口api -->
<dependency>
<groupId>com.ahut</groupId>
<artifactId>demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 引入dubbo,去除其中的spring依赖,否则会报错,版本不对 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.1</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入zookeeper,去除其中的log4j,否则会因为日志原因导致堆栈溢出 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.11</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 缺少的jar -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</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>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建com.ahut.serviceImpl包,创建DemoServiceImpl实现DemoService接口,代码如下:
package com.ahut.serviceImpl;
import com.ahut.service.DemoService;
import com.alibaba.dubbo.config.annotation.Service;
/**
* @author cheng
* @className: DemoServiceImpl
* @description:
* @dateTime 2018/5/14 16:05
*/
// 注意这里的@Service注解使用的是dubbo的com.alibaba.dubbo.config.annotation.Service
// 相当于
// <bean id="demoService" class="com.ahut.serviceImpl.DemoServiceImpl"/>
// <dubbo:service interface="com.ahut.service.DemoService" ref="demoService"/>
@Service
public class DemoServiceImpl implements DemoService {
@Override
public void sayHello(String name) {
System.out.println("hello , " + name);
}
}
创建com.ahut.config包,创建DubboConfig配置dubbo:
package com.ahut.config;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author cheng
* @className: DubboConfig
* @description: dubbo配置
* @dateTime 2018/5/15 9:32
*/
@Configuration
public class DubboConfig {
// 相当于<dubbo:application name="demo-producer"/>
@Bean
public ApplicationConfig createApplicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("demo-producer");
return applicationConfig;
}
// 相当于<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
@Bean
public RegistryConfig createRegistryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181");
return registryConfig;
}
// 相当于<dubbo:protocol name="dubbo" port="20880"/>
@Bean
public ProtocolConfig createProtocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
}
配置application.properties
# 修改服务器端口
server.port=8100
修改程序启动类:
package com.ahut;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
// 扫描需要提供服务的基础包
@DubboComponentScan(basePackages = {"com.action.serviceImpl"})
public class DemoProducerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoProducerApplication.class, args);
System.out.println("dubbo服务者启动");
}
}
创建服务消费者
基本步骤:
- 创建一个springboot项目
- 在pom.xml中添加依赖
- 调用接口api
- 新增dubbo的配置
- 配置application.properties
- 修改程序主入口
创建一个spring boot项目
在pom.xml中新增以下依赖:
<?xml version="1.0" encoding="UTF-8"?>
<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.ahut</groupId>
<artifactId>demo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo-consumer</name>
<description>demo-consumer</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- 引入接口api -->
<dependency>
<groupId>com.ahut</groupId>
<artifactId>demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 引入dubbo,去除其中的spring依赖,否则会报错,版本不对 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.1</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入zookeeper,去除其中的log4j,否则会因为日志原因导致堆栈溢出 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.11</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 缺少的jar -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</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>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建com.ahut.action包,创建DemoAction
package com.ahut.action;
import com.ahut.service.DemoService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author cheng
* @className: DemoAction
* @description:
* @dateTime 2018/5/14 16:26
*/
@RestController
@RequestMapping(value = "/demo")
public class DemoAction {
// dubbo的注解
// 相当于<dubbo:reference interface="com.ahut.service.DemoService" id="demoService"/>
@Reference
private DemoService demoService;
@RequestMapping(value = "/say")
public String sayHello(String name) {
demoService.sayHello(name);
return "dubbo消费者调用服务者成功";
}
}
创建配置文件:
package com.ahut.config;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author cheng
* @className: DubboConfig
* @description: dubbo 配置
* @dateTime 2018/5/15 10:09
*/
@Configuration
public class DubboConfig {
// 相当于<dubbo:application name="demo-consumer"/>
@Bean
public ApplicationConfig createApplicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("demo-consumer");
return applicationConfig;
}
// 相当于<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
@Bean
public RegistryConfig createRegistryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181");
return registryConfig;
}
}
配置application.properties
# 修改程序端口
server.port=8110
修改程序主入口:
package com.ahut;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
// 扫描消费者所在包
@DubboComponentScan(basePackages = {"com.ahut.action"})
public class DemoConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoConsumerApplication.class, args);
System.out.println("dubbo消费者启动");
}
}
运行
打开zookeeper
启动服务提供者
启动服务消费者
通过idea的zookeeper插件可以看到如下结果:
在浏览器地址栏输入:http://localhost:8110/demo/say?name=demo
问题
如果出现服务提供者启动,服务无法注册到zookeeper时,在服务提供者上面添加@Component注解
package com.ahut.serviceImpl;
import com.ahut.service.DemoService;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
/**
* @author cheng
* @className: DemoServiceImpl
* @description:
* @dateTime 2018/5/14 16:05
*/
@Service(timeout = 5000)
@Component
public class DemoServiceImpl implements DemoService {
@Override
public void sayHello(String name) {
System.out.println("hello , " + name);
}
}