一、Dubbo
1、 Dubbo定义
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方
式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦
合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要
么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象
出服务提供方(Provider)和服务消费方(Consumer)两个角色。
Dubbo就是资源调度和治理中心的管理工具。
2、Dubbo架构
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
二、注册中心
1. Zookeeper介绍
官方推荐使用zookeeper注册中心。
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。使用dubbo-2.3.3以上版本,建议使用zookeeper注册中心。
Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用
Zookeeper:
1、可以作为集群的管理工具使用。
2、可以集中管理配置文件。
三、SpringBoot整合Dubbo
1、新建provider模块 springboot-dubbo-server
引入依赖
<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--dubbo依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--zkclient依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
application.properties
#应用名称 dubbo.application.name=provider #注册中心地址 dubbo.registry.address=zookeeper://localhost:2181
#服务类包目录 dubbo.scan.base-packages=com.yehui.service ##协议名称 #dubbo.protocol.name=dubbo ##协议端口 #dubbo.protocol.port=20880 server.port=8087 spring.datasource.password=root spring.datasource.username=root spring.datasource.url=jdbc:mysql://localhost:3306/study
spring.datasource.driver-class-name=com.mysql.jdbc.Driver mybatis.mapper-locations=classpath:mapper/*.xml #spring.dubbo.application.name 应用名称 #spring.dubbo.registry.address 注册中心地址 #spring.dubbo.protocol.name 协议名称 #spring.dubbo.protocol.port 协议端口 #spring.dubbo.scan dubbo 服务类包目录 #spring.dubbo.scan 扫描包
创建接口
public interface DubboService { public List<TbUser> selectList(); }
实现类
@Component @Service public class DubboServiceImpl implements DubboService { @Autowired private DubboMapper dubboMapper; @Override public List<TbUser> selectList() { return dubboMapper.selectList(); } }
mapper接口
@Mapper public interface DubboMapper { public List<TbUser> selectList(); }
实体类
public class TbUser implements Serializable { private Integer id; private String username; private String age;
mapper.xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yehui.mapper.DubboMapper">
<select id="selectList" resultType="com.yehui.entity.TbUser"> select * from tb_user </select>
</mapper>
启动类
@SpringBootApplication @EnableDubboConfiguration//注解必须有否则否则会报错
public class DubboApplication { public static void main(String[] args) { SpringApplication.run(DubboApplication.class,args); } }
启动zookeeper之后在启动主启动类
2、消费者模块springboot-dubbo-client
引入依赖
<!-- Spring Boot 启动父依赖 这个依赖也不少 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.yehui</groupId>
<artifactId>springboot-dubbo-server</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
application.properties文件
## Dubbo 服务提供者配置 dubbo.application.name=cutomer dubbo.registry.address=zookeeper://192.168.1.8:2181
server.port=8088 spring.datasource.password=root spring.datasource.username=root spring.datasource.url=jdbc:mysql://localhost:3306/study
spring.datasource.driver-class-name=com.mysql.jdbc.Driver mybatis.mapper-locations=classpath:mapper/*.xml
controller类
@RestController public class DubboController { @Reference private DubboService dubboService; @RequestMapping("/findAll") public List<TbUser> findAll(){ return dubboService.selectList(); } }
主启动类
@SpringBootApplication @EnableDubboConfiguration //这个注解不能少
public class StartAppClient { public static void main(String[] args) { SpringApplication.run(StartAppClient.class); } }
启动主启动类测试