1、工程结构
dubbo:是一个父工程
consumer:是服务消费方
provider:是服务提供方
interface:存放接口,因为dubbo是根据接口进行服务注册发现的,因此我们要把接口单独拿出来,provider提供方实现该接口并注册服务, consumer要根据接口进行注入
dependency:方便依赖管理
2、引入依赖
dubbo父工程
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
dependency子工程
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
provider子工程
<dependency>
<groupId>com.study</groupId>
<artifactId>dependency</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.study</groupId>
<artifactId>interface</artifactId>
<version>1.0</version>
</dependency>
consumer子工程
<dependency>
<groupId>com.study</groupId>
<artifactId>dependency</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.study</groupId>
<artifactId>interface</artifactId>
<version>1.0</version>
</dependency>
interface子工程
不需要依赖
3、安装zookeeper
4、配置文件
provider提供者配置
#web服务端口
server.port=8000
#web服务名称
spring.application.name=provider
#dubbo服务提供者名称
dubbo.application.name=provider
#注册地址 使用zookeeper
dubbo.registry.address=zookeeper://192.168.111.201:2181
#包扫描路径
dubbo.scan.base-packages=com.study.dubbo
#使用dubbo协议
dubbo.protocol.name=dubbo
#协议端口为20880
dubbo.protocol.port=20880
由于配置文件中,配置了dubbo包扫描 dubbo.scan.base-packages,启动类上 @EnableDubbo 注解可加可不加。
@EnableDubbo //服务提供者需要添加这个注解
@SpringBootApplication
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class, args);
}
}
consumer消费者配置
#web服务端口
server.port=9000
#web服务名称
spring.application.name=consumer
#dubbo服务消费者名称
dubbo.application.name=consumer
#注册地址 使用zookeeper
dubbo.registry.address=zookeeper://192.168.111.201:2181
#使用dubbo协议
dubbo.protocol.name=dubbo
#协议端口为20880
dubbo.protocol.port=20880
消费者如果不提供服务,也就是不把接口注册到注册中心时,可以不添加@EnableDubbo注解 和dubbo包扫描。
5、示例代码
interface子工程编写接口
package com.study.dubbo.service;
public interface GoodsService {
public String getData(String data);
public String getGoods();
}
provider工程,接口实现
@Service 这里的service注解不能使用spring的注解,要使用dubbo中的注解
package com.study.dubbo.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.study.dubbo.service.GoodsService;
@Service // 这里的service注解不能使用spring的注解,要使用dubbo中的注解
public class GoodsServiceImpl implements GoodsService {
@Override
public String getData(String data) {
System.out.println("getData 方法被访问了!data: " + data);
return null;
}
@Override
public String getGoods() {
System.out.println("getGoods 方法被访问了!");
return null;
}
}
consumer子工程,并引用GoodsService,消费
@Reference 使用dubbo中的注解
package com.study.dubbo.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.study.dubbo.service.GoodsService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/goods")
public class GoodsController {
@Reference
private GoodsService goodsService;
//http://localhost:9000/goods/get
@RequestMapping("/get")
public Object getGoods() {
return goodsService.getGoods();
}
}
完整示例代码:dubbo: dubbo示例
6、启动provider和consumer
浏览器访问测试:http://localhost:9000/goods/get
可以看到访问已经成功了,并且provider的控制台也有输出信息
参考: