前言
这段时间在接触分布式的内容,由于本身比较熟悉rpc的原理,所以我顺其自然地选择了 dubbo 作为我学习的框架。
看了任务清单,这篇文章应该是在6天前出来的,但是因为实习等等的一些事情耽误了,今天立下决心动笔了。
准备
必需
JAVA 环境
注册中心(我选用的是 nacos )非必需
maven / gradle(本文使用gradle构建)
docker
idea(这个应该是必需吧?当然也可以用记事本(滑稽.jpg))
正文
- 新建普通的 gradle 项目(不勾选任何选项)
- 新建三个module,分别命名为 Common,DubboProducer,DubboConsumer
- 模块作用
Common -- 普通 gradle 项目,用于定义 proucer 以及 consumer 交互的接口以及规范
DubboProducer -- Spring Boot 本地项目,用于为 Common 中定义的服务接口创建实体类
DubboConsumer -- Spring Boot web 项目,接收用户请求,调用 producer 处理请求并返回结果
-
模块 gradle 定义
- 根项目 setting.gradle 新增
include 'Common' include 'DubboConsumer' include 'DubboProducer'
-
consumer 新增
- build.gradle 新增
// https://mvnrepository.com/artifact/org.apache.dubbo/dubbo compile group: 'org.apache.dubbo', name: 'dubbo', version: '2.7.8' // https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-nacos compile group: 'org.apache.dubbo', name: 'dubbo-registry-nacos', version: '2.7.8' // https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client compile group: 'com.alibaba.nacos', name: 'nacos-client', version: '1.3.3'
setting.gradle 新增
includeFlat 'Common'
-
producer 新增
- build.gradle 新增
// https://mvnrepository.com/artifact/org.apache.dubbo/dubbo compile group: 'org.apache.dubbo', name: 'dubbo', version: '2.7.8' // https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-nacos compile group: 'org.apache.dubbo', name: 'dubbo-registry-nacos', version: '2.7.8' // https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client compile group: 'com.alibaba.nacos', name: 'nacos-client', version: '1.3.3'
- setting.gradle 新增
```
includeFlat 'Common'
```
-
模块配置文件
- consumer 配置文件
spring: application: name: dubbo-consumer cloud: nacos: discovery: server-addr: cartoon-ali.com dubbo: protocol: port: -1 name: dubbo registry: address: nacos://cartoon-ali.com:8848 cloud: subscribed-services: dubbo-spring-cloud-provider application: name: consumer
- producer 配置文件
dubbo:
registry:
address: nacos://cartoon-ali.com:8848
application:
name: dubbo-producer
protocol:
port: -1
name: dubbo
-
启动类需同时使用 @EnableDubbo 修饰
- producer
@SpringBootApplication @EnableDubbo public class DubboProducerApplication { public static void main(String[] args) { SpringApplication.run(DubboProducerApplication.class, args); } }
- consumer
@SpringBootApplication
@EnableDubbo
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
- 示例搭建(Hello World)
- 接口 DubboService构建
public interface DubboService {
String say();
}
- 服务提供类实现
@org.apache.dubbo.config.annotation.DubboService
@Service
public class DubboServiceImpl implements DubboService {
@Override
public String say() {
return "dubbo producer";
}
}
注意:@Service 注解是 Srping 的注解,@org.apache.dubbo.config.annotation.Service 已在版本 2.7.7 被 @org.apache.dubbo.config.annotation.DubboService取代
- 消费者实现
@RestController
public class TestController {
@DubboReference
private DubboService dubboService;
@RequestMapping("/test")
public String test(){
return dubboService.say();
}
}
dubbo 的服务消费应该在消费者中的 Service 层做整合消费后返回处理结果,这里仅为演示。
- 运行
先运行 provider 再运行 consumer,否则 dubbo 会因无法找到服务提供者自行关闭消费者。
- nacos 的结果
- 模拟调用
后记
虽然在网上已经有很多这方面的教程,但是大多是用 zookeeper 作为注册中心。
而个人喜欢接触新技术,nacos 在今年1月才由阿里开源出来。而且我比较喜欢 nacos 的界面风格,虽然 nacos 在功能上不如 zookeeper+dubboAdmin 强大,但是作为入门应该是足够的。
源码地址
本文所涉及代码都已上传到github
修改历史
- 2019 年 11 月 09 日
- 文章初始版本编写
- 2020 年 10 月 11 日
- 删减错误的描述
- 服务的消费方与生产方启动类都应添加 @EnableDubbo 注解,修改前为生产方启动类应添加 @EnableDubbo 注解
- 优化部分描述
- 第四点运行中的模拟调用不再使用 RestServices 进行调用,使用更为普遍的 postman 调用
- 优化 demo 的代码结构
- 使用 gradle 构建,修改前为 maven
- 使用多组件方式进行项目的构建,使 demo 不再局限于 demo,可成为更加常用的工具
- 删减错误的描述
本文首发于cartoon的博客
转载请注明出处:https://cartoonyu.github.io/cartoon-blog/post/dubbo/dubbo与springboot的结合/