一、简介
Apache Dubbo™ 是一款高性能Java RPC框架
Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现,目前流行的SpringBoot微服务亦可以快速整合Dubbo,让我开始快速的搭建起来吧。
二、前提扼要
Dubbo需要一个服务发现的注册中心,你需要自行安装部署以下任何一种即可:
- Multicast:Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。
- zookeeper(本文使用):Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用
- Nacos:Nacos 是 Dubbo 生态系统中重要的注册中心实现,其中 dubbo-registry-nacos 则是 Dubbo 融合 Nacos 注册中心的实现。
- Redis:基于Redis 实现的注册中心
- Simple:Simple 注册中心本身就是一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。
三、创建项目工程
这里使用IDEA工具进行搭建,我们需要创建三个项目(module):
- dubbo-api(java项目即可):定义面向接口的Dubbo服务接口
- dubbo-provider(SpringBoot项目):作为生产者服务提供接口的实现完成业务
- dubbo-consumer(SpringBoot项目):作为消费者服务调用生产者提供的接口
完整工程模块,注意项目模块之间的路径结构,根目录为dubbo-root
1). 新建Empty工程 dubbo-root
2). 在dubbo-root下创建dubbo-api模块(Java项目)
3). 在dubbo-root下创建dubbo-provider模块(SprintBoot项目)<groupId>com.zookeeper.dubbo.api</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version>
4). 在dubbo-root下创建dubbo-consumer模块(SprintBoot项目)<groupId>com.zookeeper.dubbo.provider</groupId> <artifactId>dubbo-provider</artifactId> <version>0.0.1-SNAPSHOT</version>
注意:dubbo-provider模块、dubbo-consumer模块均需要依赖dubbo-api模块<groupId>com.zookeeper.dubbo.consumer</groupId> <artifactId>dubbo-consumer</artifactId> <version>0.0.1-SNAPSHOT</version>
四、项目依赖包
dubbo-provider模块、dubbo-consumer模块均需要依赖包如下(除Springboot基本包外):
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.1</version>
</dependency>
<!--为本工程依赖项目:dubbo-api-->
<dependency>
<groupId>com.zookeeper.dubbo.api</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
五、分别写dubbo-api模块、dubbo-provider模块、dubbo-consumer模块的代码
1). dubbo-api模块
-
增加DubboService 接口
package com.zookeeper.dubbo.api; /** * dubbo provider service interface * @author xzpdskll * @date 2019/6/26 */ public interface DubboService { /** * say hello * @author xzpdskll * @date 2019/6/26 * @param name * @return */ String sayHello(String name); }
2). dubbo-provider模块
-
增加application.properties配置
#server.port server.port=99 #dubbo-provider.properties dubbo.application.name=annotation-provider #zookeeper address dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.protocol.name=dubbo dubbo.protocol.port=20880
-
主入口增加@EnableDubbo(scanBasePackages = “你的dubbo接口实现类的包路径”)
package com.zookeeper.dubbo.provider; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * dubbo-provider服务提供方SpringBoot主入口 * @author xzpdskll * @date 2019/6/26 */ @EnableDubbo(scanBasePackages = "com.zookeeper.dubbo.provider") @SpringBootApplication public class DubboProviderApplication { public static void main(String[] args) { SpringApplication.run(DubboProviderApplication.class, args); } }
-
增加DubboService接口实现
package com.zookeeper.dubbo.provider.service.impl; import com.zookeeper.dubbo.api.DubboService; import org.apache.dubbo.config.annotation.Service; /** * dubbo provider service implement * @author xzpdskll * @date 2019/6/26 */ @Service public class ProviderServiceImpl implements DubboService { @Override public String sayHello(String name) { return "annotation: hello, " + name; } }
注意:@Service为Dubbo包下的(org.apache.dubbo.config.annotation.Service)
3). dubbo-consumer模块
-
增加application.properties配置
#server.port server.port=88 #dubbo-consumer.properties dubbo.application.name=annotation-consumer dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.consumer.timeout=3000
-
主入口增加@EnableDubbo(scanBasePackages = “你的dubbo接口实现类的包路径”)
package com.zookeeper.dubbo.consumer; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; /** * dubbo consumer * @author xzpdskll * @date 2019/6/26 */ @EnableDubbo(scanBasePackages = "com.zookeeper.dubbo.consumer") @SpringBootApplication public class DubboConsumerApplication { public static void main(String[] args) { SpringApplication.run(DubboConsumerApplication.class, args); } }
-
增加DubboConsumerController
package com.zookeeper.dubbo.consumer.web; import com.zookeeper.dubbo.consumer.service.ConsumerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * consumer controller * @author xzpdskll * @date 2019/6/26 */ @RestController public class DubboConsumerController { @Autowired private ConsumerService consumerService; @GetMapping("/consumer") public String dubbo(){ return consumerService.invoke("dubbo-consumer"); } }
-
增加ConsumerService接口
package com.zookeeper.dubbo.consumer.service; /** * ConsumerService interface * @author xzpdskll * @date 2019/6/26 */ public interface ConsumerService { /** * invoke provider service * @param name * @return */ String invoke(String name); }
-
增加ConsumerService接口实现ConsumerServiceImpl
package com.zookeeper.dubbo.consumer.service.impl; import com.zookeeper.dubbo.api.DubboService; import com.zookeeper.dubbo.consumer.service.ConsumerService; import org.apache.dubbo.config.annotation.Reference; import org.springframework.stereotype.Service; /** * consumer service * @author xzpdskll * @date 2019/6/26 */ @Service public class ConsumerServiceImpl implements ConsumerService { @Reference private DubboService dubboService; /** * invoke provider * @author xzpdskll * @date 2019/6/26 * @param name * @return */ @Override public String invoke(String name) { return dubboService.sayHello(name); } }
六、启动项目访问
- 启动Zookeeper服务,地址:127.0.0.1:2181
- 启动dubbo-provider模块SpringBoot服务,地址:127.0.0.1:99
- 查看zookeeper的znode情况,发现存在ZNode:/dubbo/com.zookeeper.dubbo.api.DubboService,代表已经成功写入
- 启动dubbo-consumer模块SpringBoot服务,地址:127.0.0.1:88
- 访问:127.0.0.1:88/consumer,返回信息:annotation: hello, dubbo-consumer
- 也可以在dubbo-provider模块实现接口打上断点,查看是否被调用。
- 有疑问欢迎咨询。
- 打个小广告:博主自己开发的资源整合网站欢迎来访