Java-Dubbo学习及整合SpringBoot
Dubbo架构
Dubbo是Java的RPC框架,具有三大核心功能:面向接口的远程方法调用,智能容错和负载均衡,以及服务的自动注册和发现
Dubbo架构图:
节点角色说明:
节点 | 说明 |
---|---|
Provider | 需要暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务次数和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明:
0. Container负责启动、加载、运行Provider
1. Provider在启动时,向Registry注册自己提供的服务
2. Consumer在启动时,向Registry订阅自己所需的服务
3. Registry返回Provider地址列表给Consumer,若地址有变更,将基于长连接推送变更数据给Consumer
4. Consumer从Provider地址列表中,基于软负载均衡算法,选一台Provider进行调用
5. Consumer和Provider在内存中累计调用次数和调用时间,定时每分钟发一次统计数据到Monitor
模块目录说明:
1. API:存放service接口以及实体类、数据传输对象等
2. Consumer:消费者目录,远程调用Provider提供的接口实现,即交互层
3. Provider:生产者目录,提供给Consumer的接口实现类
Dubbo整合
写个SpringBoot整合Dubbo的demo,清晰明了地了解这几层分层的含义,以及Dubbo的相关配置
1)API层
UserInfo实体类
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Data
public class userInfo implements Serializable {
/**
* Serializable 序列化
* 实体类必须实现序列化接口
**/
private Long id;
private String userName;
private Integer userId;
private String userEmail;
private String userAddress;
private String userGender;
}
UserInfoService接口
public interface UserInfoService {
public List<userInfo> getUserInfo();
}
2)Provider层
pom.xml添加相关依赖
<dependencies>
<!-- 添加api依赖 -->
<dependency>
<groupId>com.tttori</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!-- dubbo依赖 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!-- zookeeper cli端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.13.0</version>
</dependency>
</dependencies>
dubbo-config.xml配置dubbo
ServiceImpl类使用@Service("x")注解,其中x与配置中ref一致
<?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-provider -->
<dubbo:application name="dubbo-provider"/>
<!-- 声明zookeeper注册中心,暴露服务地址127.0.0.1:2181 -->
<dubbo:registry id="tttori" protocol="zookeeper" address="127.0.0.1:2181"/>
<!-- 使用dubbo协议,暴露服务端口随机 -->
<dubbo:protocol name="dubbo" port="-1"/>
<!-- 暴露服务接口,ref指向实现对象 -->
<dubbo:service interface="com.tttori.api.service.UserInfoService" ref="userInfoService" registry="tttori" timeout="5000"/>
<dubbo:consumer check="false" timeout="5000"/>
</beans>
UserInfoServiceImpl提供服务的接口实现类
@Service("userInfoService") //dubbo包下的Service 暴露服务
@Component //POJO实例化入容器中
public class UserInfoServiceImpl implements UserInfoService{
@Override
public List<userInfo> getUserInfo(){
userInfo userinfo1 = new userInfo(1001L,"Jack",1413112,"01414112@qq.com","China","M");
userInfo userinfo2 = new userInfo(1002L,"Dell",1414116,"01414116@qq.com","China","M");
return Arrays.asList(userinfo1,userinfo2);
}
}
ProviderApplication主启动类
@SpringBootApplication
@ComponentScan(basePackages = {
"com.tttori.provider.serviceImpl"
})
@MapperScan(basePackages = {"com.tttori.provider.mapper"})
@ImportResource(locations = {"classpath:dubbo-config.xml"})
@EnableScheduling
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3)Consumer层
pom.xml添加API的依赖
<dependencies>
<!-- api依赖 -->
<dependency>
<groupId>com.maziyao</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
...
</dependencies>
dubbo-config.xml配置dubbo
<?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-consumer"/>
<!-- 指定注册中心地址 -->
<dubbo:registry id="tttori" address="zookeeper://127.0.0.1:2181"/>
<!-- 订阅接口,生成远程服务代理 -->
<dubbo:reference id="userInfoService" interface="com.tttori.api.service.UserInfoService" registry="tttori"/>
</beans>
UserController交互层
@RestController //控制层
public class UserController {
@Autowired
UserService UserService;
@ResponseBody //返回Json数据
@RequestMapping("/info")
public List<userInfo> getInfo(){
/**
* Consumer接口实现类调用远程服务Provider接口
**/
return userService.getUserInfo();
}
}
ConsumerApplication启动类
@SpringBootApplication
@ImportResource(locations = {"classpath:dubbo-config.xml"})
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
总结
SpringBoot整合Dubbo步骤
1)pom.xml
0. Provider和Consumer配置Dubbo相关的Starter(ZK)
2)dubbo-config.xml
0. dubbo.application.name 声明当前服务名
1. dubbo.protocol.name 指定通信规则,dubbo协议
2. dubbo.registry.protocol.address 声明注册中心,暴露服务地址
3. dubbo.service.interface.ref.registry 暴露服务接口(Provider)
4. dubbo.registry.interface.ref.registry 订阅服务接口(Consumer)
3)暴露服务
服务实现类使用@Service和@Component注释
4)消费服务
@Reference/@Autowired实现自动注入