最新要闻
- 世界微动态丨理想汽车:被4S店PUA、不如看看直营无套路零售中心
- 网红玩具有危险!2岁幼童误吞28颗磁力珠 医生提醒:必须及时取出
- 叫板特斯拉 保时捷:单踏板模式制动能量回收效率不高
- 座位被占 女子爬火车行李架睡觉:千万不要模仿
- 环球资讯:WiFi万能钥匙联合长安汽车,“一键连接”拓展至车机端
- 灵魂摆渡的作者真的杀了他的妻子吗?灵魂摆渡的经典台词有哪些?
- 董明珠回应直播带货争议:不是为了卖产品 是推广技术
- 当前关注:12万就能上太空!日企将用高空气球开启太空旅游
- 【天天播资讯】昔日国内共享单车巨头!ofo小黄车被曝无法登录:超1600万人押金没退
- “AI飞行员”成功驾驶战斗机 美国顶尖飞行员曾是手下败将
- 播报:暴雪公布《暗黑破坏神4》实机画面:有《暗黑2》那味了
- 六一儿童节的优美句子有哪些?关于六一儿童节的作文汇总
- 移动空调效果如何选择?移动空调哪个牌子好又实惠省电?
- 热文:李楠谈网暴 在线教网友“如何避免成为网暴的施暴者”
- 要闻速递:终于告别“板砖”适配器!联想拯救者Y9000P 2023将支持140W便携快充
- 499元 雷蛇炼狱蝰蛇V3专业版发布:59克超轻量化设计
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
SpringCloud+Dubbo3 = 王炸 !
前言
全链路异步化的大趋势来了
随着业务的发展,微服务应用的流量越来越大,使用到的资源也越来越多。
(资料图片)
在微服务架构下,大量的应用都是 SpringCloud 分布式架构,这种架构总体上是全链路同步模式。
全链路同步模式不仅造成了资源的极大浪费,并且在流量发生激增波动的时候,受制于系统资源而无法快速的扩容。
全球后疫情时代,降本增效是大背景。如何降本增效?
可以通过技术升级,全链路同步模式,升级为 全链路异步模式。
先回顾一下全链路同步模式架构图
全链路同步模式,如何升级为 全链路异步模式, 就是一个一个 环节的异步化。
40岁老架构师尼恩,持续深化自己的3高架构知识宇宙,当然首先要去完成一次牛逼的全链路异步模式 微服务实操,下面是尼恩的实操过程、效果、压测数据(性能足足提升10倍多)。
全链路异步模式改造 具体的内容,请参考尼恩的深度文章:全链路异步,让你的 SpringCloud 性能优化10倍+
并且,上面的文章,作为尼恩 全链路异步的架构知识,收录在《尼恩Java面试宝典》V51版的架构专题中
注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请从这里获取:码云
SpringCloud + Dubbo 完成 RPC 异步
高并发时代来了, 各大项目有越来越强烈的诉求,全链路异步, 是性能优化的一个杀手锏。
全链路异步核心环境,就是RPC的异步化。
使用Dubbo来替换Feign,足足可以提升10倍性能。
所以,SpringCloud + Dubbo RPC 的集成 是一个比较刚性的需求。
有小伙伴查招聘网站,发现很多需要有SpringCloud + Dubbo 的集成经验,刚好印证了这点。
接下来,尼恩一步一步带着大家,来做一下 SpringCloud + Dubbo RPC 的集成实验+性能测试。
见证一下奇迹: 使用Dubbo 提升10倍的性能。
Dubbo3应用的宏观架构
Dubbo3应用架构,如下图所示:
从上面的图中,整体的的Dubbo的Rpc框架中,核心的组件有:
- config-center 配置中心,接下来使用 nacos
- Consumer消费端, 业务服务,使用Dubbo SDK 完成服务发现
- Provider服务提供端,业务服务,使用Dubbo SDK 完成服务注册
- Registry注册中心 配置中心,接下来使用 nacos
Dubbo3 应用架构的核心组件
两大部分:
- 一个Dubbo SDK
- 三中心
Dubbo SDK
Dubbo SDK作为模块,被微服务所引入和依赖。跟随着微服务组件被部署在分布式集群各个位置,实现各个微服务组件间的协作,主要是服务的注册、服务的发现
三中心
Dubbo3包含一些中心化组件,主要有3个,这包括:
- 注册中心
- 协调Consumer消费者与Provider服务提供者之间的地址注册与发现。
- 配置中心
- 存储Dubbo启动阶段的全局配置,保证配置的跨环境共享与全局一致性
- 负责服务治理规则(路由规则、动态配置等)的存储与推送。
- 元数据中心
- 接收Provider服务端上报的服务接口元数据,为Admin等控制台提供运维能力(如服务测试、接口文档等)
- 作为服务发现机制的补充,提供额外的接口/方法级别配置信息的同步能力,相当于注册中心的额外扩展。
以上三个中心,由Nacos组件承担,
所以在下面的实操中,无论dubbo-Provider还是dubbo-consumer,配置文件中都是这么配置的:
dubbo: scan: base-packages: com.crazymaker.cloud.dubbo application: name: ${spring.application.name} protocol: name: dubbo port: -1 registry: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos parameters: namespace: dubbo group: DUBBO_GROUP config-center: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos group: DUBBO_GROUP metadata-report: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos group: DUBBO_GROUP
SpringBoot整合Dubbo3.0基础准备
阿里早已把dubbo捐赠给了Apache,现在dubbo由Apache在维护更新,dubbo也已经成了Apache下的顶级项目。
SpringCloud+Nacos+Dubbo3.0
版本说明
- SpringCloud:Hoxton.SR8
- SpringCloudAlibaba:2.2.3.RELEASE
- SpringBoot:2.3.4.RELEASE
- Nacos:2.0.3
- Dubbo:3.0.7
项目结构介绍
1、dubbo的依赖的坐标
Maven 依赖的坐标是Apache官方最新的3.0.4
坐标。
org.apache.dubbo dubbo-bom ${dubbo.version} pom import
如果使用的老版本的Dubbo,比如下面的这些依赖, 现在需要去掉啦
com.alibaba.spring.boot dubbo-spring-boot-starter 2.0.0 io.dubbo.springboot spring-boot-starter-dubbo 1.0.0
2、 注册中心的依赖的坐标
老的项目采用zookeeper为注册中心,当然,咱们的电脑里的虚拟机,其实都已经安装好zookeeper服务器,并已经启动。
所以,如果要使用ZK,对于咱们技术自由圈(疯狂创客圈的新名字)的小伙伴来说,也是非常方便的。
但是SpringCloud项目上一般使用的注册中,不是appolo,不是eureka,而是nacos。
现在Dubbo也支持nacos, 所以我们使用Nacos作为注册中心
org.apache.dubbo dubbo-registry-nacos ${dubbo.version} com.alibaba.nacos nacos-client pom
这里有个版本兼容性的bug,尼恩稍微花了一点点时间,才解决这个问题。
具体的话,视频中给大家详细说一下。
SpringBoot整合Dubbo3.0大致步骤
- SpringBoot 项目创建
- Dubbo 服务提供方实现
- Dubbo 服务消费方实现
- 自定义Filter拦截所有消费请求
- 自定义LoadBalance完成特殊场景负载均衡
模块结构
接下来演示下整合的模块结构,注意,是Springcloud 项目的老项目升级,
不是一个全新的项目,很多老的代码,要复用的
所以,就是在原来的crazy-SpringCloud 微服务项目上改造
但是这里仅仅演示 dubbo,所以,在原理的 脚手架里边,增加了两个子模块,
注意: 模块里边,并没有去掉原来的SpringCloud OpenFeign 的RPC调用, 而是两种RPC 调用共存。
方便后续在业务中快速运用,完整结构如下:
- consumer,服务消费方模块;
- provider,服务提供方模块;
- 统一定义服务接口和实体类,被其他工程模块引用;
consumer,服务消费方模块\ provider,服务提供方模块;如下图
统一定义服务接口和实体类,被其他工程模块引用; 所以,这个之前fegin 的RPC 接口,现在接着给Dubbo用。
Dubbo微服务注册发现的相关配置
- 命名空间隔离
- 微服务注册中心配置
命名空间隔离
在nacos 的命名空间, 用来做 dubbo 的命名空间隔离
首先创建nacos的命名空间
命名id 是要用到的, 这里需要填写,
主要,不要自动生产
微服务yml配置
微服务 yml 配置, yml配置 dubbo nacos 命名空间
dubbo: scan:base-packages: xxx protocol: name: dubbo port: -1 # 注册中心配置 registry: address: nacos://xxx parameters: namespace: dubbo group: DUBBO_GROUPdubbo: application: name: ${spring.application.name} protocol: name: dubbo port: -1 registry: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos parameters: namespace: dubbo group: DUBBO_GROUP config-center: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos group: DUBBO_GROUP metadata-report: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos group: DUBBO_GROUP
common-service 模块
服务接口 进行利旧复用
还是之前的 UserClient 老接口,open fegn注解都不去掉
package com.crazymaker.springcloud.user.info.remote.client;import com.crazymaker.springcloud.common.dto.UserDTO;import com.crazymaker.springcloud.common.result.RestOut;import com.crazymaker.springcloud.standard.config.FeignConfiguration;import com.crazymaker.springcloud.user.info.remote.fallback.UserClientFallbackFactory;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;/** * Feign 客户端接口 * @description: 用户信息 远程调用接口 * @date 2019年7月22日 */@FeignClient(value = "uaa-provider", configuration = FeignConfiguration.class,// fallback = UserClientFallback.class, fallbackFactory = UserClientFallbackFactory.class, path = "/uaa-provider/api/user")public interface UserClient{ /** * 远程调用 RPC 方法:获取用户详细信息 * @param userId 用户 Id * @return 用户详细信息 */ @RequestMapping(value = "/detail/v1", method = RequestMethod.GET) RestOut detail(@RequestParam(value = "userId") Long userId); @RequestMapping(value = "/hello/v1", method = RequestMethod.GET) public String hello(@RequestParam(value = "name") String name);}
服务提供者实操:dubbo-provider 服务
pom依赖
org.apache.dubbo dubbo org.apache.dubbo dubbo-registry-nacos nacos-client com.alibaba.nacos com.alibaba.nacos nacos-client ${nacos-client-verson}
服务实现类
package com.crazymaker.cloud.dubbo.demo.sevice;import com.crazymaker.springcloud.common.dto.UserDTO;import com.crazymaker.springcloud.common.result.RestOut;import com.crazymaker.springcloud.user.info.remote.client.UserClient;import org.apache.dubbo.config.annotation.DubboService;import org.springframework.stereotype.Component;@DubboService@Componentpublic class UserClientDubboService implements UserClient { @Override public RestOut detail(Long userId) { UserDTO dto=new UserDTO(); dto.setUserId(userId); dto.setNickname(" dubbo rpc test"); return RestOut.success(dto).setRespMsg("操作成功"); } @Override public String hello(String name) { return "from dubbo provider : 你好,"+name; }}
dubbo和Feign的一个不同
- dubbo的服务发布和暴露,直接在 service 层加上注解 ,就完成了
比如:上面的案例中,加上一个类级别的 注解,就可以 暴露这个服务接口 @DubboService
- 而 Feign 的服务接口发布,是在 @Controller 层完成的。
相对来说,比 使用 Dubbo 更为笨重
Provider的Dubbo+Nacos配置文件
spring: security: enabled: false application: name: dubbo-provider-demoserver: port: 28088 servlet: context-path: /dubbo-provider-demo#### 暴露端点management: endpoints: web: base-path: "/actuator" # 配置 Endpoint 的基础路径 exposure: include: "*" #在yaml 文件属于关键字,所以需要加引号 endpoint: logfile: # spring boot admin client不配置日志文件路径(同时配置logback-spring.xml对应的日志输出配置,否则无法输出日志), # 控制台上的Logging模块下的Logfile会报错:Fetching logfile failed.Request failed with status code 404 external-file: ${log_dubbo_provider_demo_path_full:C:/logs/dubbo-provider-demo/logs/output.log} enabled: true health: show-details: always # 未配置/注释 以下内容# boot:# admin:# context-path: consumer metrics: tags: application: ${spring.application.name} export: prometheus: enabled: true step: 1m descriptions: truedubbo: scan: base-packages: com.crazymaker.cloud.dubbo application: name: ${spring.application.name} protocol: name: dubbo port: -1 registry: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos parameters: namespace: dubbo group: DUBBO_GROUP config-center: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos group: DUBBO_GROUP metadata-report: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos group: DUBBO_GROUP
启动类 加上@EnableDubbo 注解
package com.crazymaker.cloud.dubbo.demo.starter;import com.crazymaker.springcloud.common.util.IpUtil;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.core.env.Environment;import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.net.Inet4Address;import java.util.Optional;@EnableSwagger2@EnableDiscoveryClient@Slf4j@EnableDubbo@SpringBootApplication(scanBasePackages = { "com.crazymaker.cloud.dubbo.demo", })public class DubboProviderApplication { public static void main(String[] args) { try { ConfigurableApplicationContext applicationContext = SpringApplication.run(DubboProviderApplication.class, args); Environment env = applicationContext.getEnvironment(); String port = env.getProperty("server.port"); String name = env.getProperty("spring.application.name"); String path = env.getProperty("server.servlet.context-path"); if (StringUtils.isBlank(path)) { path = ""; } Optional ip = IpUtil.getLocalIp4Address(); log.info("\n----------------------------------------------------------\n\t" + name.toUpperCase() + " is running! Access URLs:\n\t" + "Local: \t\thttp://" + ip.get() + ":" + port + path + "/\n\t" + "swagger-ui: \thttp://" + ip.get() + ":" + port + path + "/swagger-ui.html\n\t" + "actuator: \thttp://" + ip.get() + ":" + port + path + "/actuator/info\n\t" + "----------------------------------------------------------"); } catch (Exception e) { log.error("服务启动报错", e); } }}
启动、体验Provider
打包之后,在 咱们优雅的虚拟机centos8中,优雅的启动一下,
来一个优雅的启动命令
[root@centos1 work]# cd dubbo-provider-demo-1.0-SNAPSHOT/bin/[root@centos1 bin]# sh ./deploy.sh startPORT:28088JVM:-server -Xms512m -Xmx2048mnohup java -server -Xms512m -Xmx2048m -Dserver.port=28088 -jar /work/dubbo-provider-demo-1.0-SNAPSHOT/lib/dubbo-provider-demo-1.0-SNAPSHOT.jar com.crazymaker.cloud.dubbo.demo.starter.DubboProviderApplication & log file : /work/logs/dubbo-provider-demo-1.0-SNAPSHOT/output.log
太爽................. 有个vagrant+Centos 开发环境, 开发Java应用,爽到不要不要的
关键是: 在这个虚拟机 box 文件中,尼恩给大家预装了K8S 云原生环境,大家一键导入省了N多麻烦。基于这个环境, 下一步咱们就开始 “左手大数据、右手云原生” 的高端实操
继续看,屏幕的下面,下面还有swagger体验地址
使用这个地址,可以在浏览器开起Swagger -UI 的界面
http:///cdh1:28088/dubbo-provider-demo/swagger-ui.html
开启之后的效果,但是,这个和dubbo没有关系
因为dubbo的服务并没有在swagger ui 展示
在Nacos查看Dubbo服务的注册情况
通过nacos,可以看到 dubbo的服务啦
具体的细节,咱们后面讲dubbo视频的时候,再说
这里先把性能优化起来
服务消费者实操:dubbo-consumer 服务
consumer模块
消费者实现类
package com.crazymaker.cloud.dubbo.demo.consumer.controller;import com.crazymaker.springcloud.common.dto.UserDTO;import com.crazymaker.springcloud.common.result.RestOut;import com.crazymaker.springcloud.user.info.remote.client.UserClient;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.apache.dubbo.config.annotation.DubboReference;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/user")@Api(tags = "Dubbo-RPC 完成远程调用")public class UserConsumerController { //注入 @DubboReference 注解配置 所配置的 EchoClient 客户端Feign实例 @DubboReference(loadbalance = "groupLoadBalance") private UserClient userService; //用户详情 @ApiOperation(value = "用户详情接口") @RequestMapping(value = "/detail/v1", method = RequestMethod.GET) RestOut detail(@RequestParam(value = "userId", required = true)Long userId) { RestOut ret = userService.detail(userId); return ret; }}
消费者Dubbo+Nacos配置文件
spring: security: enabled: false application: name: dubbo-consumer-demo#http://cdh1:18081/dubbo-consumer-demo/swagger-ui.htmlserver: port: 18081 servlet: context-path: /dubbo-consumer-demo#### 暴露端点management: endpoints: web: base-path: "/actuator" # 配置 Endpoint 的基础路径 exposure: include: "*" #在yaml 文件属于关键字,所以需要加引号 endpoint: health: show-details: always metrics: tags: application: ${spring.application.name}# boot:# admin:# context-path: consumerdubbo: scan: base-packages: com.crazymaker.cloud.dubbo application: name: ${spring.application.name} protocol: name: dubbo port: -1 registry: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos parameters: namespace: dubbo group: DUBBO_GROUP config-center: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos group: DUBBO_GROUP metadata-report: address: nacos://${NACOS_SERVER:cdh1:8848} username: nacos password: nacos group: DUBBO_GROUP
启动类 加上@EnableDubbo 注解
package com.crazymaker.cloud.dubbo.demo.consumer.starter;import com.crazymaker.springcloud.common.util.IpUtil;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;import org.springframework.boot.SpringApplication;import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.openfeign.EnableFeignClients;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.core.env.Environment;import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.net.Inet4Address;import java.util.Optional;@EnableSwagger2@EnableDiscoveryClient@Slf4j@EnableDubbo@SpringBootApplication( scanBasePackages = { "com.crazymaker.cloud.dubbo.demo", "com.crazymaker.springcloud.standard" }, exclude = {SecurityAutoConfiguration.class, //排除db的自动配置 DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class, SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, //排除redis的自动配置 RedisAutoConfiguration.class, RedisRepositoriesAutoConfiguration.class})//启动Feign@EnableFeignClients(basePackages = {"com.crazymaker.cloud.dubbo.demo.consumer.client"})public class DubboConsumerApplication { public static void main(String[] args) { try { ConfigurableApplicationContext applicationContext = SpringApplication.run(DubboConsumerApplication.class, args); Environment env = applicationContext.getEnvironment(); String port = env.getProperty("server.port"); String name = env.getProperty("spring.application.name"); String path = env.getProperty("server.servlet.context-path"); if (StringUtils.isBlank(path)) { path = ""; } Optional ip = IpUtil.getLocalIp4Address(); log.info("\n----------------------------------------------------------\n\t" + name.toUpperCase() + " is running! Access URLs:\n\t" + "Local: \t\thttp://" + ip.get() + ":" + port + path + "/\n\t" + "swagger-ui: \thttp://" + ip.get() + ":" + port + path + "/swagger-ui.html\n\t" + "actuator: \thttp://" + ip.get() + ":" + port + path + "/actuator/info\n\t" + "----------------------------------------------------------"); } catch (Exception e) { log.error("服务启动报错", e); } }}
启动、体验 Consumer
打包之后,在 咱们优雅的虚拟机 centos8 中,优雅的启动一下,
来一个优雅的启动命令
[root@centos1 bin]# cd ../../dubbo-consumer-demo-1.0-SNAPSHOT/bin/[root@centos1 bin]# sh ./deploy.sh startPORT:18081JVM:-server -Xms512m -Xmx2048mnohup java -server -Xms512m -Xmx2048m -Dserver.port=18081 -jar /work/dubbo-consumer-demo-1.0-SNAPSHOT/lib/dubbo-consumer-demo-1.0-SNAPSHOT.jar com.crazymaker.cloud.dubbo.demo.consumer.starter.DubboConsumerApplication &nohup: appending output to "nohup.out"
太爽................. 有个vagrant+Centos 开发环境, 开发Java应用,爽到不要不要的
关键是: 在这个虚拟机 box 文件中,尼恩给大家预装了K8S 云原生环境,大家一键导入省了N多麻烦。
下一步,基于这个环境, 咱们就开始 “左手大数据、右手云原生” 的高端实操
继续看,屏幕的下面,下面还有swagger体验地址
使用这个地址,可以在浏览器开起Swagger -UI 的界面
http:///10.0.2.15:18081/dubbo-consumer-demo/swagger-ui.html
注意,要修改一下 host,修改之后为
http://cdh1:18081/dubbo-consumer-demo/swagger-ui.html
Feign 和Dubbo 两大RPC调用 并存的效果,如下:
在Nacos查看Dubbo服务的注册情况
通过nacos,可以看到 dubbo的服务的消费者啦
具体的细节,咱们后面讲dubbo视频的时候,再说
这里先把性能优化起来
性能的对比测试
然后进行了性能的对比验证
dubbo 的压测数据
wrk -t8 -c200 -d30s --latency http://cdh1:18081/dubbo-consumer-demo/user/detail/v1?userId=1[root@centos1 src]# wrk -t8 -c200 -d30s --latency http://cdh1:18081/dubbo-consumer-demo/user/detail/v1?userId=1Running 30s test @ http://cdh1:18081/dubbo-consumer-demo/user/detail/v1?userId=1 8 threads and 200 connections Thread Stats Avg Stdev Max +/- Stdev Latency 30.10ms 45.68ms 644.45ms 95.43% Req/Sec 1.12k 465.63 2.36k 66.87% Latency Distribution 50% 18.94ms 75% 28.43ms 90% 46.21ms 99% 283.56ms 264316 requests in 30.07s, 148.47MB readRequests/sec: 8788.96Transfer/sec: 4.94MB
feign 的压测数据
wrk -t8 -c200 -d30s --latency http://cdh1:18081/dubbo-consumer-demo/echo/variable/11[root@centos1 src]# wrk -t8 -c200 -d30s --latency http://cdh1:18081/dubbo-consumer-demo/echo/variable/11Running 30s test @ http://cdh1:18081/dubbo-consumer-demo/echo/variable/11 8 threads and 200 connections Thread Stats Avg Stdev Max +/- Stdev Latency 321.50ms 294.59ms 2.00s 61.77% Req/Sec 87.18 43.39 232.00 67.00% Latency Distribution 50% 309.06ms 75% 503.06ms 90% 687.99ms 99% 1.21s 20495 requests in 30.10s, 7.64MB read Socket errors: connect 0, read 0, write 0, timeout 49Requests/sec: 680.90Transfer/sec: 259.99KB
从数据来看, dubbo rpc 是feign rpc 性能10倍
Dubbo比Feign高10倍以上的本质
Dubbo比Feign高10倍以上的本质,不是在于应用层的协议,和传输格式
面试的时候,太多的小伙伴被问到: Dubbo比Feign性能高,说说原因。
小伙伴首先回答的是:
Dubbo 是TCP 层的传输协议,Feign是应用层 的HTTP传输协议,所以性能低。
这个答案不是本质原因,HTTP是有些冗余的头部报文,但是不至于差10倍。能差0.5倍,就已经顶天了。
差10倍的原因:是 同步链路 与异步链路 的 区别。
或者说:Dubbo比Feign高10倍以上的本质,是RPC 调用异步化
RPC 调用主要的框架有:
特点是:
- feign 是同步IO 、阻塞模式的同步 RPC框架
- dubbo 是基于Netty的非阻塞IO + Reactor 反应堆线程模型的 异步RPC框架
异步RPC 调用,等待upstream 上游 response 返回时,线程不处于block 状态
作为微服务架构中数据流量最大的一部分,RPC 调用异步化的收益巨大;
dubbo 的异步RPC,仅仅 SpringCloud 微服务全链路 异步的一个环节, SpringCloud 全链路 异步有5个以上的环节。
有关 微服务全链路 异步高性能改造,请参考尼恩的深度文章:
全链路异步,让你的 SpringCloud 性能优化10倍+
高并发、云原生、大数据时代,很多组件都是 全异步的、响应式的。
大家一定要掌握全链路异步的底层原理,掌握好 响应式编程的底层原理和实操,为 “左手大数据、右手云原生” 做好技术准备。
后面尼恩也会写一些列的博文,为大家“左手大数据、右手云原生” 做好技术储备。
具体请关注尼恩的疯狂创客圈社群(50+)。
Dubbo 与 SpringCloud 的通信 Openfeign的区别
1、协议支持方面
Feign更加优雅简单。
Feign是通过REST API实现的远程调用,基于Http传输协议,服务提供者需要对外暴露Http接口供消费者调用,服务粒度是http接口级的。
很多文章说:通过短连接的方式进行通信,不适合高并发的访问。
尼恩纠错: Feign 并不是短链接,而是长连接 ,具体请 阅读 尼恩 的《Java 高并发核心编程 卷1 加强版》
Dubbo方式更灵活。
Dubbo是通过RPC调用实现的远程调用,支持多传输协议(Dubbo、Rmi、http、redis等等),可以根据业务场景选择最佳的方式,非常灵活。
默认的Dubbo协议:利用Netty,TCP传输,单一、异步、长连接,适合数据量小、高并发和服务提供者远远少于消费者的场景。Dubbo通过TCP长连接的方式进行通信,服务粒度是方法级的。
2、通信性能方面
- Feign基于Http传输协议,底层实现是rest。在高并发场景下性能不够理想。
- Dubbo框架的通信协议采用RPC协议,属于传输层协议,提升了交互的性能,保持了长连接,高性能。
3、线程模型方面
Feign使用的是阻塞式的线程模型, 在请求和响应直之间, IO线程是阻塞的,死等到超时。
Dubbo使用的是异步非阻塞式的线程模型(Netty的Reactor反应器), 在请求和响应直之间, IO线程是非阻塞的,有限的线程,可以处理大量的请求。
这点是性能的核心。
SpringCloud + Dubbo RPC 的集成的价值
高并发时代来了, 各大项目有越来越强烈的诉求,全链路异步, 是性能优化的一个杀手锏。
使用Dubbo来替换Feign,足足可以提升10倍性能。
所以,SpringCloud + Dubbo RPC 的集成 是一个比较刚性的需求。
有小伙伴查招聘网站,发现很多需要有SpringCloud + Dubbo 的集成经验,刚好印证了这点。
尼恩强烈建议大家,做一下 SpringCloud + Dubbo RPC 的集成,在同一个微服务下,同时使用了Feign + Dubbo。
尼恩提示:很多小伙伴来找尼恩改简历,但是发现一点漂亮的技术亮点都没有,如果确实找不到亮点,可以把这个实操做一下,写入简历,作为亮点。如果确实不清楚怎么写入简历,可以来找尼恩进行简历指导。保证 脱胎换骨、金光闪闪、天衣无缝。
参考文献
全链路异步,让你的 SpringCloud 性能优化10倍+
https://blog.csdn.net/wpc2018/article/details/122634049
https://www.jianshu.com/p/7d80b94068b3
https://blog.csdn.net/yhj_911/article/details/119540000
http://bjqianye.cn/detail/6845.html
https://blog.csdn.net/hao134838/article/details/110824092
https://blog.csdn.net/hao134838/article/details/110824092
https://blog.csdn.net/weixin_34096182/article/details/91436704
https://blog.csdn.net/fly910905/article/details/121682625
https://gaocher.github.io/2020/01/05/mono-create/
推荐阅读:
《响应式圣经:10W字,实现Spring响应式编程自由》
《4次迭代,让我的 Client 优化 100倍!泄漏一个 人人可用的极品方案!》
《100亿级订单怎么调度,来一个大厂的极品方案》
《Linux命令大全:2W多字,一次实现Linux自由》
《阿里一面:谈一下你对DDD的理解?2W字,帮你实现DDD自由》
《阿里一面:你做过哪些代码优化?来一个人人可以用的极品案例》
《网易二面:CPU狂飙900%,该怎么处理?》
《阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了》
《峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?》
《场景题:假设10W人突访,你的系统如何做到不 雪崩?》
《2个大厂 100亿级 超大流量 红包 架构方案》
《Nginx面试题(史上最全 + 持续更新)》
《K8S面试题(史上最全 + 持续更新)》
《操作系统面试题(史上最全、持续更新)》
《Docker面试题(史上最全 + 持续更新)》
《Springcloud gateway 底层原理、核心实战 (史上最全)》
《Flux、Mono、Reactor 实战(史上最全)》
《sentinel (史上最全)》
《Nacos (史上最全)》
《分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)》
《clickhouse 超底层原理 + 高可用实操 (史上最全)》
《nacos高可用(图解+秒懂+史上最全)》
《队列之王: Disruptor 原理、架构、源码 一文穿透》
《环形队列、 条带环形队列 Striped-RingBuffer (史上最全)》
《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)》
《红黑树( 图解 + 秒懂 + 史上最全)》
《分布式事务 (秒懂)》
《缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)》
《缓存之王:Caffeine 的使用(史上最全)》
《Docker原理(图解+秒懂+史上最全)》
《Redis分布式锁(图解 - 秒懂 - 史上最全)》
《Zookeeper 分布式锁 - 图解 - 秒懂》
《Netty 粘包 拆包 | 史上最全解读》
《Netty 100万级高并发服务器配置》
SpringCloud+Dubbo3 = 王炸 !
世界微动态丨理想汽车:被4S店PUA、不如看看直营无套路零售中心
网红玩具有危险!2岁幼童误吞28颗磁力珠 医生提醒:必须及时取出
叫板特斯拉 保时捷:单踏板模式制动能量回收效率不高
座位被占 女子爬火车行李架睡觉:千万不要模仿
环球资讯:WiFi万能钥匙联合长安汽车,“一键连接”拓展至车机端
木鱼cms系统审计小结
世界资讯:单调栈
灵魂摆渡的作者真的杀了他的妻子吗?灵魂摆渡的经典台词有哪些?
董明珠回应直播带货争议:不是为了卖产品 是推广技术
当前关注:12万就能上太空!日企将用高空气球开启太空旅游
【天天播资讯】昔日国内共享单车巨头!ofo小黄车被曝无法登录:超1600万人押金没退
“AI飞行员”成功驾驶战斗机 美国顶尖飞行员曾是手下败将
播报:暴雪公布《暗黑破坏神4》实机画面:有《暗黑2》那味了
六一儿童节的优美句子有哪些?关于六一儿童节的作文汇总
移动空调效果如何选择?移动空调哪个牌子好又实惠省电?
迅雷崩溃是怎么回事?迅雷崩溃怎么解决?
家用数码相机怎么选?家用数码相机什么牌子最好?
三星S8000c什么时候上市的?三星s8000c功能介绍
直播预告 | 企业如何轻松完成数据治理?火山引擎 DataLeap 给你一份实战攻略!
分层测试(五):端到端测试
热文:李楠谈网暴 在线教网友“如何避免成为网暴的施暴者”
要闻速递:终于告别“板砖”适配器!联想拯救者Y9000P 2023将支持140W便携快充
499元 雷蛇炼狱蝰蛇V3专业版发布:59克超轻量化设计
融资客最看好个股一览
【码农教程】手把手教你学会Mockito使用
世界热门:用一个例子学会适配器设计模式
天天视点!量化工具篇
世界播报:2.概率论
视焦点讯!(数据库系统概论|王珊)第六章关系数据理论-第二节:规范化
别乱买!三大要素教你如何选对吸尘器
环球看点!一次看个够!《原子之心》双子舞伶所有场景合集
世界时讯:微软为Chrome官网注入大幅广告:只为将用户留在Edge
天天热资讯!微软收购动视暴雪获新盟友!NVIDIA态度转变签署10年游戏协议
热门:读Java实战(第二版)笔记17_反应式编程
每日播报!若若_关于若若的简介
焦点速读:长沙凌晨1点马路人流量惊人 像在倒时差:网友称想去打卡 当地人回应
全球最资讯丨8GB来了!iPhone 15内存大升级:苹果区别对待 想要花万元买Pro版
环球热头条丨荣耀Magic5 Lite获DXO电池性能第一名 续航可超三天
雷克萨斯、英菲尼迪、凯迪拉克等豪车中国市场暴跌:国人不当冤大头
今日聚焦!面试官:怎么去除 List 中的重复元素?我一行代码搞定,赶紧拿去用!
热文:OPPO打造!唯一配备潜望长焦的天玑旗舰来了
天天短讯!死磕RTX 40!AMD RX 7600/7700/7800齐曝光:据说苏妈定价有诚意
重现《放羊的星星》!林志颖特斯拉车祸后复出晒照 事故原因成谜 是踩错刹车?
Map数据结构详解
环球视讯!在PHP和JavaScript中设置Cookie、会话存储(SessionStorage)和本地存储(LocalStorage)
天天百事通!今日成都到康定怎么坐车_成都到康定
亮机卡也有春天 锐龙7000核显超频到3.1GHz 游戏性能猛增40%
当前要闻:困扰十几亿人!脚趾甲咋会向肉里长?
世界焦点!TCL发布超薄四开门冰箱T9:0cm无缝式嵌入 456L仅3399元
增程、换电、800V高压快充 谁才是未来新能源车最佳补能方式?
环球新动态:发3000元却收回2800元!“慈善主播”被行拘 账号被封
【焦点热闻】秘而不宣的读法
C#的string是一种糟糕的设计吗?
当前视讯!队列——queue的用法(及洛谷B3616)
vue-cli安装依赖 props属性三种方式 混入迷信 插件 elementUI vuex vue Routerd localStorage系列
openfoam文件读取
fusion app自定义事件源码介绍(上)
世界热门:RTX 4070 Laptop逆天能效比!七彩虹将星X15 AT 2023游戏本首发评测
全球快看:1月豪华车销量榜:蔚来碾压全系合资二线豪华品牌
被网友玩坏?微软Bing的ChatGPT被证实变愚蠢了
每日消息!“张伟”骗取数位宝马车主百万购车款 4S店疯狂推卸责任?
AMD锐龙7 7735HS迷你机也有“青春版”:只变了两个USB接口
环球今头条!攒台白色的MATX主机,在B760主板上也能玩好内存超频
全球焦点!RS485 MODBUS转PROFINET网关案例 | 超声波明渠流量计接入到PLC1200 PROFINE
焦点热门:前后端分离项目解决跨域的终极方法
环球今热点:[Java基础]自动装箱与自动拆箱--为什么整型比较必须用equals?
【天天新要闻】Detecting glass in Simulataneous Localisation and Mapping
天天热文:贝叶斯与卡尔曼滤波(2)--连续随机变量的贝叶斯公式
当前热门:用送的那块布擦镜片:小心眼镜被废!
观热点:60岁快递员意外猝死 快递公司回应:深感痛心 善后已达成一致
女子连刷10个差评商家找上门:不好吃你天天来干嘛 谁生活容易啊
【世界报资讯】果粉入手一加Ace 2:开20个应用不杀后台 苹果开3个应用就不行了
80后回忆的“均瑶牛奶”公司进军新能源车:首款纯电SUV云兔来了 莆田生产
信息:Qt调用摄像头一,基础版
k8s多节点二进制部署以及Dashboard UI
记住这12个要点,你也能打造出让HR和技术主管前一亮的前端简历
《原子之心》冰箱诺拉全九国语言配音:怎么没日语?
粉丝发现周深自用手机是iQOO 11 Pro传奇版:5米开外就能看到
电动两轮车总是骑半路就没电?这5种错误充电习惯赶快纠正
世界今头条!男子酷爱嚼槟榔:最终确诊舌癌
【报资讯】免费的ChatGPT意外断网 国内伪装自主的AI露馅了
守护安全|AIRIOT城市天然气综合管理解决方案
0x03_My-OS在实体机上面运行
每日播报!【算法训练营day53】LeetCode1143. 最长公共子序列 LeetCode1035. 不相交的线 LeetCode53. 最大子序和
快讯:两数之和、三数之和、四数之和(双指针)
世界焦点!今日山水一程三生有幸是形容爱情的吗_山水一程三生有幸
环球最资讯丨俞敏洪说想给董宇辉在北京买套房子 这话我听着耳熟
消息!魅族20未发先火!1元超前预订7小时订单破10万
世界热讯:研究称果糖或能导致老年痴呆:专家建议少食用
全球热议:旅日大熊猫香香坐顺丰飞机到家!1个月后与公众见面
环球视讯!成都一公司面试需填芝麻信用分 网友热议
每日信息:100亿级订单怎么调度,来一个大厂的极品方案
[学习笔记]Rocket.Chat业务数据备份
记录--uni-app实现京东canvas拍照识图功能
世界快资讯:Java+Jquer实现趋势图
全球最新:温州特斯拉事故20年驾龄司机仍昏迷:特斯拉回应称难过 重申全力配合调查
环球今热点:Xbox游戏将登陆任天堂主机 网友质疑:NS能带动吗?
世界微资讯!场面爆笑!外国人为开比亚迪开始学中文:难为“小迪”了
即时看!音悦台将回归登热搜!主体公司已成老赖:累计被执行1376万