淮南建设公司网站,做新闻封面的网站,成都企业网站seo,郑州seo优化大师Dubbo 简介Dubbo的快速入门Dubbo的基本架构安装DubboAdmin入门案例Dubbo的最佳实践 Dubbo的高级特性启动检查多版本超时与重试负载均衡SpringCloud整合Dubbo案例 简介
Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。 致力于提高性能和透明化的RPC远程服务调用方… Dubbo 简介Dubbo的快速入门Dubbo的基本架构安装DubboAdmin入门案例Dubbo的最佳实践 Dubbo的高级特性启动检查多版本超时与重试负载均衡SpringCloud整合Dubbo案例 简介
Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。 致力于提高性能和透明化的RPC远程服务调用方案以及SOA服务治理方案 官网 目前Dubbo在企业中有两种开发思路
基于SOA思想 将传统单一应用拆分为Web消费者模块和Service提供者模块基于Dubbo通信 辅助SpringCloud架构提升效率 Dubbo基于TCP传输层协议效率更高。可以替换Feign提升高并发压力
Dubbo的快速入门
Dubbo的基本架构 服务提供者在启动时向注册中心注册自己提供的服务消费者在启动时向注册中心订阅自己所需的服务注册中心返回服务提供者地址列表给消费者如果有变更注册中心将基于长连接推送变更数据给消费者服务消费者从提供者地址列表中基于负载均衡算法选择提供者进行调用。服务消费者和提供者在内存中累积调用次数和调用时间定时每分钟发送一次统计数据到监控中心
安装DubboAdmin
DubboAdmin是阿里巴巴管理提供的管理控制台可以实现服务查询详细展示服务测试等功能。皆有DubboAdmin可以更好的帮助开发人员对服务进行管理和监控 DubboAdmin的源代码托管在GitHub上可以通过命令拉取修改配置并运行
# 下载代码git clone https://gitcode.net/mirrors/apache/dubbo-admin.git
# 在dubbo-admin-server/src/main/resources/application.properties中指定注册中心
# 构建mvn clean package -D maven.test.skiptrue
#启动mvn --projects dubbo-admin-server spring-boot:run
或者cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.1.jar
# 访问http://localhost:8080
# 默认用户名与密码为root入门案例 创建数据库 CREATE DATABASE dubbo-demo ;USE dubbo-demo;DROP TABLE IF EXISTS tb_order;CREATE TABLE tb_order (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 订单id,userId bigint(20) NOT NULL COMMENT 用户id,name varchar(100) DEFAULT NULL COMMENT 商品名称,price bigint(20) NOT NULL COMMENT 商品价格,num int(10) DEFAULT 0 COMMENT 商品数量,PRIMARY KEY (id) USING BTREE,UNIQUE KEY username (name) USING BTREE
) ENGINEInnoDB AUTO_INCREMENT109 DEFAULT CHARSETutf8 ROW_FORMATCOMPACT;insert into tb_order(id,userId,name,price,num) values (101,1,Apple 苹果 iPhone 12 ,699900,1),(102,2,雅迪 yadea 新国标电动车,209900,1),(103,3,骆驼CAMEL休闲运动鞋女,43900,1),(104,4,小米10 双模5G 骁龙865,359900,1),(105,5,OPPO Reno3 Pro 双模5G 视频双防抖,299900,1),(106,6,美的Midea) 新能效 冷静星II ,544900,1),(107,2,西昊/SIHOO 人体工学电脑椅子,79900,1),(108,3,梵班FAMDBANN休闲男鞋,31900,1);DROP TABLE IF EXISTS tb_user;CREATE TABLE tb_user (id bigint(20) NOT NULL AUTO_INCREMENT,username varchar(100) DEFAULT NULL COMMENT 收件人,address varchar(255) DEFAULT NULL COMMENT 地址,PRIMARY KEY (id) USING BTREE,UNIQUE KEY username (username) USING BTREE
) ENGINEInnoDB AUTO_INCREMENT7 DEFAULT CHARSETutf8 ROW_FORMATCOMPACT;insert into tb_user(id,username,address) values (1,柳岩,湖南省衡阳市),(2,文二狗,陕西省西安市),(3,华沉鱼,湖北省十堰市),(4,张必沉,天津市),(5,郑爽爽,辽宁省沈阳市大东区),(6,范兵兵,山东省青岛市); 导入工程 需求使用Dubbo构建分布构架完成根据用户id查询用户 搭建服务提供者user-provider 创建提供者模块并引入依赖 dependenciesdependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!--mybatis--dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactId/dependency!--dubbo的起步依赖--dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactIdversion2.7.8/version/dependencydependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-registry-nacos/artifactIdversion2.7.8/version/dependency
/dependencies编写引导类 package com.xiaowu.user;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;MapperScan(com.xiaowu.user.mapper)
SpringBootApplication
public class UserProviderApplication {public static void main( String[] args ) {SpringApplication.run(UserProviderApplication.class,args);}
}将serviceMapperdomain导入到提供者模块中 将UserService暴露为Dubbo服务 //暴露Dubbo服务
DubboService
public class UserServiceImpl implements UserService {Autowiredprivate UserMapper userMapper;public User queryById(Long id) {return userMapper.findById(id);}
}application.yml配置 server:port: 18081
spring:datasource:url: jdbc:mysql://localhost:3306/dubbo-demo?useSSLfalseusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverapplication:name: user-provider
logging:level:com.xiaowu: debugpattern:dateformat: HH:mm:ss:SSS# 配置Dubbo提供者
dubbo:protocol:name: dubbo # 协议port: 20881 # dubbo端口registry:address: nacos://127.0.0.1:8848 #注册中心地址scan:base-packages: com.xiaowu.user.service # dubbo注解的包扫描搭建服务消费者user-consumer 创建user-consumer模块导入依赖 dependenciesdependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--dubbo的起步依赖--dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactIdversion2.7.8/version/dependencydependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-registry-nacos/artifactIdversion2.7.8/version/dependency
/dependencies将Controllerservice接口导入到消费者模块中 配置引导类 package com.xiaowu.user;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class UserConsumerApplication {public static void main( String[] args ) {SpringApplication.run(UserConsumerApplication.class,args);}
}在Controller中引入dubbo服务 Slf4j
RestController
RequestMapping(/user)
public class UserController {DubboReference //引入dubbo服务private UserService userService;/*** 路径 /user/110* param id 用户id* return 用户*/GetMapping(/{id})public String queryById( PathVariable(id) Long id) {return userService.queryById(id);}
}application.yml配置 server:port: 18080
spring:application:name: user-consumer# 配置dubbo服务消费者
dubbo:registry:address: nacos://127.0.0.1:8848Dubbo的最佳实践
将API接口抽取为独立模块并且把接口有关的domain都放到这个模块中
然后引入这个模块的依赖
Dubbo的高级特性
启动检查
为了保障服务的正常可用Dubbo缺省会启动时检查依赖的服务是否可用不可用时会抛出异常
在正式环境这是很有必要的一项配置可以保证整个调用链路的平稳运行在开发时往往会存在没有提供者的情况。由于启动检查的原因可能导致开发测试出现问题可以通过checkfalse关闭
多版本
在正式系统中为了保证系统可用性和更好的并发性往往通过集群部署 Dubbo提供了提供者多版本的支持平滑处理项目功能升级部署 具体实现 编写新的UserServer实现类作为新版本代码 //暴露Dubbo服务
DubboService(version 1.0)
public class UserServiceImpl implements UserService {Autowiredprivate UserMapper userMapper;public User queryById( Long id) {return userMapper.findById(id);}
}在暴露服务时指定服务版本 //暴露Dubbo服务
DubboService(version 1.0)消费者引用服务时指定引用的服务版本 public class UserController {DubboReference(version 1.0) //引入dubbo服务private UserService userService;}超时与重试
服务消费者在调用服务提供者的时候发生了阻塞、等待的情形这个时候服务消费者会一直等待下去。在某个峰值时刻大量的请求都在同时请求服务消费者会造成线程的大量堆积势必会造成雪崩。
Dubbo利用超时机制来解决这个问题使用timeout属性配置超时时间默认值1000单位毫秒若超时时间较短当网络波动时请求就会失败Dubbo通过重试机制避免此类问题的发生 设置重试机制的方法 在消费者引用Dubbo服务时加retries参数设置重试机制 Slf4j
RestController
RequestMapping(/user)
public class UserController {DubboReference(version 1.0,retries 0) //引入dubbo服务private UserService userService;/*** 路径 /user/110* param id 用户id* return 用户*/GetMapping(/{id})public User queryById( PathVariable(id) Long id) {return userService.queryById(id);}
}在application.yml配置重试机制 # 配置dubbo服务消费者
dubbo:registry:address: nacos://127.0.0.1:8848consumer:check: falseretries: 0 # 重试机制0次负载均衡
在集群部署时Dubbo提供了4中负载均衡策略帮助消费者找到最优提供者并调用
Random按权重随机默认。按权重设置随机概率RoundRobin按权重轮询LeastActive最少活跃调用数相同活跃数的随机ConsistentHash一致性Hash相同参数的请求总是发到同一提供者 更改负载均衡策略在消费者引用Dubbo时加入 loadbalance 参数
DubboReference(version 1.0,retries 0,loadbalance Random) //引入dubbo服务SpringCloud整合Dubbo
Feign基于Http协议应用层在高并发场景下性能不够理想容易成为性能瓶颈Dubbo框架的通信协议采用TCP协议数据传输层Dubbo框架的通信协议采用RPC协议属于传输层协议Dubbo默认通过Netty构造TCP长连接的方式进行通信性能较高使用SpringCloud整合Dubbo即为强强联合
案例
根据订单id查询订单功能 需求根据订单id查询订单的同时把订单所属的用户信息一起返回 模块分析
使用Dubbo进行服务调用一般将公共接口独立抽取为模块消费者引入依赖引用Dubbo服务提供者引入依赖编写接口实现类暴露服务 抽取接口模块 创建dubbo-api模块引入依赖 dependenciesdependencygroupIdcom.xiaowu/groupIdartifactIddubbo-domain/artifactIdversion1.0-SNAPSHOT/version/dependency
/dependencies抽取公共接口
改造提供者 引入依赖 !--nacos注册中心的依赖--
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency
!--springcloud alibaba dubbo依赖 --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-dubbo/artifactId
/dependency
!--dubbo-api--
dependencygroupIdcom.xiaowu/groupIdartifactIddubbo-api/artifactIdversion1.0-SNAPSHOT/version
/dependency编写实现类暴露Dubbo服务 DubboService
public class UserServiceImpl implements UserService {Autowiredprivate UserMapper userMapper;public User queryById(Long id) {return userMapper.findById(id);}
}application.yml配置 server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/dubbo-demo?useSSLfalseusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverapplication:name: user-servicecloud:nacos:discovery:server-addr: localhost:8848
#配置dubbo注册中心暴露的端口和协议dubbo注解的包扫描
dubbo:protocol:name: dubboport: 20881registry:address: spring-cloud://localhost #使用SpringCloud中的注册中心scan:base-packages: com.xiaowu.user.service #dubbo中包扫描
logging:level:com.xiaowu: debugpattern:dateformat: HH-mm ss:SSS改造服务消费者 引入依赖 !--nacos注册中心的依赖--
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency
!--springcloud alibaba dubbo依赖 --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-dubbo/artifactId
/dependency
!--dubbo-api--
dependencygroupIdcom.xiaowu/groupIdartifactIddubbo-api/artifactIdversion1.0-SNAPSHOT/version
/dependency使用DubboReference引入Dubbo服务远程调用服务 DubboReference
private UserService userService;
Autowired
private OrderMapper orderMapper;
public Order queryOrderById(Long orderId) {// 1.根据id查询订单Order order orderMapper.findById(orderId);// 2.获取订单中的用户IDLong userId order.getUserId();// 3.根据用户id调用Dubbo服务查询用户User user userService.queryById(userId);order.setUser(user);// 4.返回return order;
}application.yml进行配置 server:port: 8082
spring:datasource:url: jdbc:mysql://localhost:3306/dubbo-demo?useSSLfalseusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Drivercloud:nacos:discovery:server-addr: localhost:8848application:name: order-service# dubbo消费者
dubbo:registry:address: spring-cloud://localhostlogging:level:com.xiaowu: debugpattern:dateformat: HH:mm:ss:SSS启动测试
查询用户 查询订单