dubbo学习:2小时入手RPC框架Dubbo分布式服务调度(一)
- 前置知识了解
权威的bubbo官网:http://dubbo.apache.org/zh-cn/
Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
RPC是远程过程调用协议,采用客户机/服务器模式,请求程序就是一个客户机,而服务提供程序就是一个服务器。
dubbo官网中给我们提供了dubbo内部架构图,展示了内部各大组件,以及组件与组件之间的通信。刚开始看可能不太明白,我们使用RPC的客户机/服务器模式类比于生产者/消费者去理解dubbo,就很容易看懂官网给出的dubbo架构。
0.start:启动容器,运行提供者(Container,Provider)
1.register:提供者发布服务,向注册中心发布注册自己的服务(Registry)
2.subscribe:消费者向注册中心订阅服务(Consumer)
3.notify:注册中心通知消费者,提供者已发布服务到注册中心
4.invoke:消费者调用服务
5.count:累计调用次数和调用时间,统计数据到监控中心(Monitor)
- Zookeeper单机配置
因为Zookeeper是集中式存储和管理分布式系统的配置中心和分布式锁的最佳候选者。所以我们选择Zookeeper作为注册中心。
Zookeeper的安装方式可以上网上自行寻找,我这里提供Mac单机安装和配置流程:
官网下载地址
镜像下载地址
我是在镜像下载地址里下载的zookeeper-3.4.14文件,解压后在bin目录中创建名为zoo.cfg的文件,内容为:
# 服务器与客户端之间交互的基本时间单元(ms) tickTime=2000 # zookeeper所能接受的客户端数量 initLimit=10 # 服务器和客户端之间请求和应答之间的时间间隔 syncLimit=5 # zookeeper中使用的基本时间单位, 毫秒值. tickTime=2000 # 数据目录. 可以是任意目录. dataDir=/tmp/zookeeper/data # log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和#dataDir相同的设置. dataLogDir=/tmp/zookeeper/log # t监听client连接的端口号. clientPort=2181
进入到zookeeper-3.4.14,执行./bin/zkServer.sh start,出现如下提示说明启动成功。
wenyunxin@localhost zookeeper-3.4.14 % ./bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /Users/wenyunxin/Downloads/work/tool/zookeeper-3.4.14/bin/../conf/zoo.cfg Starting zookeeper ... STARTED wenyunxin@localhost zookeeper-3.4.14 %
- 搭建微服务Spring Boot多模块Maven项目(生产者)
开发工具:Intellij idea,Postman
数据库管理工具:Navicate Premium
安装软件:JDK,tomcat 7/8,Mysql 5.6,Maven
模块设计:
父模块dubboOne
子模块api:
1.面向其他服务配置-比如发布成Dubbo服务的接口配置等
2.将整个项目中所有子模块的依赖放在这里配置-被传递依赖
子模块model:
面向ORM-数据访问控制层次
子模块server:
1.打包成可执行的jar,war等配置
2.SpringBoot应用的启动类
3.用来编写整个项目/服务的核心开发逻辑
项目建好之后需要在pom.xml中引入dubbo,zookeeper等相关的依赖,在server模块resources下进行配置如下文件:
在application.properties中配置项目路径和端口,数据源,mybaties映射文件,zookeeper地址
#项目端口,路径 server.port=8093 server.servlet.context-path=/dubboOne #zookeeper dubbo.registry.address=zookeeper://127.0.0.1:2181 #数据源 datasource.url=jdbc:mysql://127.0.0.1:3306/dubbo_one?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull datasource.username=root datasource.password=123456 #mybaties相关配置 mybatis.config-location=classpath:mybatis-config.xml mybatis.checkConfigLocation = true mybatis.mapper-locations=classpath:mappers/*.xml
DubboOne还需引入两个核心配置文件:dubbo.prpperties和spring-dubbo.xml。
在dubbo.properties中配置两大协议对应的端口等信息:
#dubbo支持的dubbo协议配置 dubbo.protocol.name=dubbo dubbo.protocol.dubbo.port=20903 #dubbo支持的http rest api的配置 #dubbo.protocol.name=rest #dubbo.protocol.rest.port=9013 #dubbo.protocol.rest.server=tomcat
在spring-dubbo.xml中配置dubbo具体信息:
1.注解发布服务的dubbo服务所在包
2.配置支持的两种调用方式对应的协议
3.当前应用服务的配置
<!--发布出去的dubbo服务类所在包的注解--> <dubbo:annotation package="com.wenxin.dubbo.one.server.service.dubbo" /> <!--注册中心zookeeper配置信息--> <dubbo:registry address="${dubbo.registry.address}" /> <!--支持两种协议的调用:rpc-dubbo协议;http协议-rest api-url调用--> <dubbo:protocol name="rest" threads="500" contextpath="v1" server="tomcat" accepts="500"/> <dubbo:protocol name="dubbo" /> <!--发布方信息配置--> <dubbo:application name="dubboOne-provider" owner="debug" organization="dubbox"/>
在spring-jdbc.xml中配置连接数据源(仅展示了基本属性):
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" primary="true" > <property name="url" value="${datasource.url}" /> <property name="username" value="${datasource.username}" /> <property name="password" value="${datasource.password}" /> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
最后在配置好的数据库下创建order_info表及保存数据:
#创建商品信息表 DROP TABLE IF EXISTS `item_info`; CREATE TABLE `item_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `code` varchar(20) DEFAULT NULL COMMENT '商品编码', `name` varchar(255) DEFAULT NULL COMMENT '商品名称', `price` decimal(15,2) DEFAULT NULL COMMENT '销售价', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `record_state` varchar(2) DEFAULT 'Y' COMMENT '是否有效:Y-有效;N-无效;', PRIMARY KEY (`id`), UNIQUE KEY `idx_code` (`code`) USING BTREE COMMENT '商品编码唯一' ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='商品信息表' # 保存几条数据 INSERT INTO `order_info` VALUES ('1', '80H05400', '长形亮钻发箍', '48.90', '2020-05-01 14:07:58', '2020-05-01 14:07:58', 'Y'), ('2', '80H05401', '粉格小脚裤', '299.00', '2020-05-01 14:07:58', '2020-05-01 14:07:58', 'Y'), ('3', '80H05402', '自行车图案T恤', '99.00', '2020-05-01 14:07:58', '2020-05-01 14:07:58', 'Y'), ('4', '80H05403', '圆点隐形袜', '19.90', '2020-05-01 14:07:58', '2020-05-01 14:07:58', 'Y'), ('5', '80H05404', '系带休闲鞋', '69.00', '2020-05-01 14:07:58', '2020-05-01 14:07:58', 'Y'), ('6', '80H05405', '简约T形小包', '169.00', '2020-05-01 14:07:58', '2020-05-01 14:07:58', 'Y'), ('7', '80H05406', '基本沙滩裤', '179.00', '2020-05-01 14:07:58', '2020-05-01 14:07:58', 'Y');
配置到此全部完成,最后我们在启动类BootMoreApplication中关联以上的配置:
@SpringBootApplication @ImportResource(value = {"classpath:spring/spring-jdbc.xml","classpath:spring/spring-dubbo.xml"}) @MapperScan(basePackages = "com.wenxin.dubbo.one.model.mapper")
然后我们在server模块下的controller中写一个hello world测试一下项目搭建是否正常(这里我写了用来规范返回响应数据的BaseReponse类和返回状态码的StatusCode枚举类):
package com.wenxin.dubbo.one.server.controller; import com.wenxin.dubbo.one.api.enums.StatusCode; import com.wenxin.dubbo.one.api.response.BaseResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/base") public class BaseController { private static final Logger logger = LoggerFactory.getLogger(BaseController.class); @GetMapping("/one") public BaseResponse one(@RequestParam String param) { BaseResponse response = new BaseResponse(StatusCode.SUCCESS); try { response.setData(param); } catch (Exception e) { e.printStackTrace(); response = new BaseResponse(StatusCode.FAIL); } return response; } }
请求连接:http://localhost:8093/dubboOne/base/one?param=helloDubbo!后成功返回如下数据:
这样我们的DubboOne(生产者)项目就搭建好了。
下一篇我们继续搭建DubboTwo和实现分布式调度。
- dubbo 源码学习笔记 (三) —— dubbo引用服务的过程
- dubbo学习-1-服务提供者&服务消费者&依赖
- 学习淘淘商城第十二课(发布dubbo服务)
- 学习淘淘商城第十二课(发布dubbo服务)
- Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度
- Linux学习之路——进程调度和服务管理
- Dubbo学习总结(5)——Dubbo服务架构及服务治理过程演进
- Dubbo学习之路(三):服务提供者注册和暴露服务源码解读
- 跟我学习dubbo-使用Maven构建Dubbo服务的可执行jar包(4)
- 学习淘淘商城第十三课(引用dubbo服务)
- 分布式架构学习之:005--构建Dubbo服务的可执行jar包
- 初步了解学习将传统单机应用改造成Dubbo服务的过程
- Dubbo学习:服务降级
- 跟我学习dubbo-使用Maven构建Dubbo服务的可执行jar包(4)
- Dubbo学习系列之十七(微服务Soul网关)
- dubbo 框架学习-将dubbo 服务做成可执行的java 应用
- Dubbo学习(三)服务调用
- dubbo学习笔记3 SpringMvc框架web形式 dubbo服务搭建 消费者
- 跟我学习dubbo-构建Dubbo服务消费者Web应用的war包并在Tomcat中部署(6)
- 学习dubbo(六):部署dubbo服务