一个分布式场景存在两种角色,提供服务的我们通常称为生产者,调用服务的我们称为消费者,生产者发布服务,消费者调用生产者的服务;我们的系统中不可或缺的是一些基础服务比如:短信、支付、文件上传、邮件,我们今天就用dubbo模拟发布一个短信服务,其他任意客户端都可以通过dubbo调用短信服务。
生产者
1、创建服务
项目名:dubbo-sms
模块:sms-api(对外统一调用接口规范)
模块:sms-provide(服务具体发布和实现)
2、定义发送短信API、和实现
(1)在sms-api 中定义短信发送的接口和dto对象
public interface SmsService {
/**
* 发送短信
*/
public void sendSms(SmsDto smsDto);
}
public class SmsDto implements Serializable{
private String mobile;
private String msg;
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "SmsDto{" +
"mobile='" + mobile + ''' +
", msg='" + msg + ''' +
'}';
}
}
(2)sms-provide 模块 pom文件增加sms-api依赖
<dependency>
<artifactId>sms-api</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
(3)在sms-provide 中实现短信发送功能
public class SmsServiceImpl implements SmsService {
public void sendSms(SmsDto smsDto) {
System.out.println("短信发送成功"+smsDto.toString());
}
}
3、增加dubbo依赖
sms-provide模块 pom文件增加dubbo依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
4、增加dubbo配置文件,配置对外发布服务信息
在sms-provede 的resource/META-INF/spring(没有目录则新建) 目录下新建配置文件sms-provice.xml(名称可随意取)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--对外发布的应用服务名、维护人-->
<dubbo:application name="dubbo-sms" owner="dp"/>
<!--使用的注册中心,N/A为不使用注册中心-->
<dubbo:registry address="N/A"/>
<!--发布服务使用的协议、端口-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--配置需要对外发布的接口-->
<dubbo:service interface="com.dubbo.sms.api.SmsService" class="com.dubbo.sms.service.SmsServiceImpl"/>
</beans>
5、增加dubbo启动类
package com.dubbo.sms;
import com.alibaba.dubbo.container.Main;
public class DubboStart {
public static void main(String[] args) {
Main.main(args);
}
}
启动dubbo显示如下信息则发布成功
dubbo-sms项目整体结构
消费者
1、创建项目
创建项目:dubbo-sms-consumer
2、增加依赖
在增加依赖前首先把sms-api 打包到maven仓库。
在消费端项目dubbo-sms-consumer引入dubbo和api依赖
<dependencies>
<dependency>
<artifactId>sms-api</artifactId>
<groupId>com.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
</dependencies>
3、增加dubbo配置文件
在dubbo-sms-consumer 项目resource目录下增加dubbo-sms-consumer.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--对外发布的应用服务名、维护人-->
<dubbo:application name="dubbo-sms-consumer" owner="dp"/>
<!--发布服务使用的协议、端口-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--配置需要引入的dubbo接口 这里的url对应服务发布出来的url-->
<dubbo:reference id="smsService" interface="com.dubbo.sms.api.SmsService" url="dubbo://192.168.30.1:20880/com.dubbo.sms.api.SmsService"/>
</beans>
注意: <dubbo:reference > 中的URL 对应生产者启动时打印的服务url
4、调用服务
import com.dubbo.sms.api.SmsService;
import com.dubbo.sms.dto.SmsDto;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by Administrator on 2019/5/20.
*/
public class DubboConsumer {
public static void main(String[] args) {
//根据xml实例化bean
ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("sms-consumer.xml");
SmsService smsService=(SmsService) context.getBean("smsService");
SmsDto smsDto=new SmsDto();
smsDto.setMobile("18684758953");
smsDto.setMsg("恭喜你、调用服务成功!");
smsService.sendSms(smsDto);
}
}
运行后掉会用服务端生产者成功