我这里使用zookeeper作为服务注册中心,版本3.4.9,下载地址: https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/
下载后,解压
要先配置一下,否则没法启动,启动会报错,找不到 zoo.cfg
文件,其实这个配置文件是有的,在 conf
文件夹里,只不过名字是 zoo_sample.cfg
把名字改一下即可
windows是启动还有些问题,直接运行 zkServer.cmd
还不行,我电脑上还装了 git-bash ,所以直接打开 git-bash 进入 bin 目录,运行命令 ./zkServer.sh start
即可启动
停止命令是 ./zkServer.sh stop
既然是服务,肯定会有接口与一些共用的实体类,如果写在provider里,那么consumer消费的时候,也要再写一遍,所以先把这块提取出来,开发好后,打成jar包,让provider与consumer都引用即可实现共用
新建一个maven项目就可以了
定义一个接口,我这里模拟一下短信服务
public interface SmsService { /** * 定义一个发短信的接口 * @param mobile 手机号 * @param content 内容 * @param platform 平台,分别对应 LIANTONG, YIDONG, DIANXIN * @return 正常返回发送成功,失败即可,这里为了展示发送的手机号与内容平台,直接把内容再返回去 */ String sendSms(String mobile, String content, String platform); }
写好之后,运行 mvn compile install
安装到本地
新建Springboot项目,引入依赖,我这Springboot使用的版本是2.x,所以这里的 starter 用的是 0.2.x 如果springboot版本是1.5.x 那么这个starter版本要使用0.1.x
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency>
另外还要引入上面开发好的接口jar包
<dependency> <groupId>com.example</groupId> <artifactId>interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
添加配置
找到 application.properties
将其修改成 application.yml
我比较喜欢yml配置文件,简洁,而且可以少写很多 : )
添加下面配置
dubbo: application: name: demo-provider # 服务名 registry: address: zookeeper://127.0.0.1:2181 # 注册中心地址 protocol: name: dubbo # 指定通信协议 port: 20880 # 通信端口 这里指的是与消费者间的通信协议与端口 provider: timeout: 10000 # 配置全局调用服务超时时间,dubbo默认是1s,肯定不够用呀 retries: 3 # 重试3次 delay: -1
这里我碰到一个坑,就是这个超时时间问题,默认是1s,但我实现服务为了模拟效果,故意延时2s,这导致后面消费者端调用服务的时候一直报错
在服务提供者里实现服务
@Service @Component public class SmsServiceImpl implements SmsService { @Override public String sendSms(String mobile, String content, String platform) { try { Thread.sleep(2000);// 模拟调用短信接口费时2s return String.format("发送结果: %s, 手机号: %s, 内容: %s, 平台: %s", "SUCCESS", mobile, content, platform); } catch (InterruptedException e) { e.printStackTrace(); } return null; } }
这个实现上有个注解 @Service
这个不是Spring包里的那个注解,而是dubbo里提供的注解,包名是 com.alibaba.dubbo.config.annotation.Service
这个注解的用处是暴露服务给消费端使用的,所以一定要加上
暴露了服务还不够,还要开启dubbo服务,在启动类上加上注解 @EnableDubbo
到这服务提供端就开发好了,启动服务即可
有了服务提供者了,还要有消费者,下面来开发消费者
首先创建一个springboot项目,这里就调用一下服务,不需要引入其它依赖,就默认什么都不选的一个springboot项目即可
然后跟提供者一样,引入依赖,跟服务端一样的依赖
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
添加配置
dubbo: application: name: demo-consumer # 消息者名字 registry: address: zookeeper://127.0.0.1:2181 # 注册中心地址
调用服务,我这就直接写在test方法里了
@RunWith(SpringRunner.class) @SpringBootTest public class ConsumerApplicationTests { @Reference private SmsService smsService; @Test public void contextLoads() { String s = smsService.sendSms("13111111111", "hello world", "LIANTONG"); System.out.println(s); } }
运行test方法,结束可以看到打印出调用的结果
发送结果: SUCCESS, 手机号: 13111111111, 内容: hello world, 平台: LIANTONG
至此,springboot集成dubbo简单demo就开发完了
原文链接: