最新要闻
- 世界速看:挑战行业多项不可能 一加11即将发布:最强性能旗舰
- 令人气愤!女子曝无良汽修店为赚钱高速路上撒钉子专扎车胎
- 天天视讯!刘作虎:OPPO一加正式开启双品牌战略 100亿投资扶植一加
- 环球观速讯丨义乌开始生产阿根廷夺冠球衣 还是三颗星 阿根廷辟谣:假的 侵权
- 世界快播:“顶级大众” 宾利Batur公布工艺细节:210克黄金3D打印
- 老人手指被卡:消防员用开塞露救了差点被剪的蓝宝石戒指
- 每日快讯!元旦假期首日火车票今开抢!迎出行小高峰:五大热门目的地出炉
- 观天下!Find N2系列发布背后:OPPO再次展示对产品精益求精态度
- 天天要闻:全国冻哭预警地图来了:周末20余省份或被冻哭 冷到破纪录
- 热议:售价超300万!乔布斯亲手编号Apple-1电脑落锤成交:46年后 开机画面眼前一亮
- 世界最大独立圆柱体水族馆爆裂:1500多条鱼全军覆没
- 世界杯决战前夕 法国又有两大主力倒下!5人感染神秘流感
- 【环球热闻】被加价千元:AMD喊话正加大RX 7900系生产!NV 4080笑而不语
- 世界上最大的鱼缸今日突然破裂:100万升水泄露 1500条鱼死亡
- 放假3天不调休!2023年元旦假期首日火车票开售 除夕票这一天就能买
- 天天报道:学谁不好学特斯拉!几十万的宝马车 容不下一个收音机
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界今头条!SpringCloud-Ribbon学习笔记
Ribbon使用
1.当引入了nacos服务发现就可以不用再引入ribbon依赖,nacos中用到了ribbon做负载均衡。
(资料图片仅供参考)
编辑
2.RestTemplate 添加@LoadBalanced注解,让RestTemplate在请求时拥有客户端负载均衡的能力
1 @Configuration2 public class RestConfig {3 @Bean4 @LoadBalanced //开启负载均衡,加了@LoadBalanced注解,让RestTemplate在请求时拥有客户端负载均衡的能力,5 6 public RestTemplate restTemplate() {7 return new RestTemplate();8 }
3.使用微服务名发起调用
1 @Autowired 2 private RestTemplate restTemplate; 3 4 @RequestMapping(value = "/findOrderByUserId/{id}") 5 public R findOrderByUserId(@PathVariable("id") Integer id) { 6 //如果restTemplate不添加@LoadBalanced注解则就不能解析mall-order 7 String url = "http://mall-order/order/findOrderByUserId/"+id; 8 R result = restTemplate.getForObject(url,R.class); 9 return result;10 }
LoadBalanced原理解析
看源码的思路,很多框架代码时间都会遵循开闭原则,它会提供接口支持你对他的功能扩展,但不支持你修改,因此有时候看源码只需要记住核心接口自顶向下的看,对看源码有很大的帮助,尽量的避免打断电debug的方式,因为在响应式编程中很容易被一些回调函数扰乱思路,或者也有能在一些框架中会有一些定时任务不知道从哪就触发你的断点,例如nacos框架中就有很多定时任务检查心跳,健康状态。
1.@LoadBalanced会在restTemplate发起调用的时候,通过LoadBalancedInterceptor拦截器讲nacos获取到的实例列表中mall-order(spring.applicationa.name)替换成 对应的ip地址。在通过LoadBalanceCliet调用http接口
编辑
LoadBalanced.java
1 /** 2 * Annotation to mark a RestTemplate or WebClient bean to be configured to use a 3 * LoadBalancerClient. 4 * @author Spencer Gibb 5 */ 6 @Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD }) 7 @Retention(RetentionPolicy.RUNTIME) 8 @Documented 9 @Inherited10 @Qualifier11 public @interface LoadBalanced {12 13 }
@LoadBalanced使用了@Qualifier,@Qualifier用于筛选限定注入Bean。@LoadBalanced利用@Qualifier作为restTemplates注入的筛选条件,筛选出具有负载均衡标识的RestTemplate。
编辑
LoadBalancerAutoConfiguration.java
1 @Configuration(proxyBeanMethods = false) 2 @ConditionalOnClass(RestTemplate.class) 3 @ConditionalOnBean(LoadBalancerClient.class) 4 @EnableConfigurationProperties(LoadBalancerRetryProperties.class) 5 public class LoadBalancerAutoConfiguration { 6 7 @LoadBalanced //自动配置,要想注入到 restTemplates中,必须要有 @LoadBalanced属性才行 8 @Autowired(required = false) 9 private ListrestTemplates = Collections.emptyList();10 11 //只展示重点方法,其他方法忽略12 13 14 @Bean15 //SmartInitializingSingleton这个是spring的一个扩展点,是在所有的bean初始化完成之后调用的,所以使用restTemplates需要在bean初始化完成之后在进行调。假设在@PostCpnstruct中调用则restTemplate不会具有负载均衡功能16 //假设在@PostCpnstruct中调用则restTemplate不会具有负载均衡功能,例如提前的获取token,提前对数据预热或者缓存17 public SmartInitializingSingleton loadBalancedRestTemplateInitializerDeprecated(18 final ObjectProvider > restTemplateCustomizers) {19 return () -> restTemplateCustomizers.ifAvailable(customizers -> {20 for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {21 for (RestTemplateCustomizer customizer : customizers) {22 customizer.customize(restTemplate);23 }24 }25 });26 }27 28 @Configuration(proxyBeanMethods = false)29 @ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")30 static class LoadBalancerInterceptorConfig {31 32 @Bean33 public LoadBalancerInterceptor loadBalancerInterceptor(34 LoadBalancerClient loadBalancerClient,35 LoadBalancerRequestFactory requestFactory) {36 return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);37 }38 39 @Bean40 @ConditionalOnMissingBean41 public RestTemplateCustomizer restTemplateCustomizer(42 final LoadBalancerInterceptor loadBalancerInterceptor) {43 return restTemplate -> {44 List
list = new ArrayList<>(45 restTemplate.getInterceptors());46 list.add(loadBalancerInterceptor);47 restTemplate.setInterceptors(list);48 };49 }50 51 }
被@LoadBalanced注解的restTemplate会被定制,添加LoadBalancerInterceptor拦截器,SmartInitializingSingleton这个是spring的一个扩展点,是在所有的bean初始化完成之后调用的,所以使用restTemplates需要在bean初始化完成之后在进行调。假设在@PostCpnstruct中调用则restTemplate不会具有负载均衡功能。假设在@PostCpnstruct中调用则restTemplate不会具有负载均衡功能,例如提前的获取token,提前对数据预热
LoadBalancerCliet实现了ServiceInstanceChooser,ServiceInstanceChooser遵循了SpringCloud的规范,服务的选择器,对于负载均衡来说就是在服务的列表中选择出一个服务出来。
如果不使用@LoadBalanced注解,也可以通过添加LoadBalancerInterceptor拦截器让restTemplate起到负载均衡器的作用。
1 @Bean2 public RestTemplate restTemplate(LoadBalancerInterceptor loadBalancerInterceptor) {3 RestTemplate restTemplate = new RestTemplate();4 //注入loadBalancerInterceptor拦截器5 restTemplate.setInterceptors(Arrays.asList(loadBalancerInterceptor));6 return restTemplate;7 }
Ribbon扩展功能
1 @Configuration( 2 proxyBeanMethods = false 3 ) 4 @EnableConfigurationProperties 5 @Import({HttpClientConfiguration.class, OkHttpRibbonConfiguration.class, RestClientRibbonConfiguration.class, HttpClientRibbonConfiguration.class}) 6 public class RibbonClientConfiguration { 7 8 //只展示重点方法,其他方法忽略 9 @Bean10 @ConditionalOnMissingBean11 public IRule ribbonRule(IClientConfig config) {12 if (this.propertiesFactory.isSet(IRule.class, this.name)) {13 return (IRule)this.propertiesFactory.get(IRule.class, config, this.name);14 } else {15 ZoneAvoidanceRule rule = new ZoneAvoidanceRule();16 rule.initWithNiwsConfig(config);17 return rule;18 }19 }20 21 @Bean22 @ConditionalOnMissingBean23 public ILoadBalancer ribbonLoadBalancer(24 IClientConfig config, //IClientConfig:Ribbon的客户端配置,默认采用DefaultClientConfigImpl实现。25 ServerListserverList, //ServerList:服务实例清单的维护机制,默认采用ConfigurationBasedServerList实现。26 ServerListFilter serverListFilter, //ServerListFilter:服务实例清单过滤机制,默认采ZonePreferenceServerListFilter,该策略能够优先过滤出与请求方处于同区域的服务实例。 27 IRule rule, //IRule:Ribbon的负载均衡策略,默认采用ZoneAvoidanceRule实现,该策略能够在多区域环境下选出最佳区域的实例进行访问。28 IPing ping, //IPing:Ribbon的实例检查策略,默认采用DummyPing实现,该检查策略是一个特殊的实现,实际上它并不会检查实例是否可用,而是始终返回true,默认认为所有服务实例都是可用的。29 ServerListUpdater serverListUpdater) {30 //ILoadBalancer:负载均衡器,默认采用ZoneAwareLoadBalancer实现,它具备了区域感知的能力。31 return (ILoadBalancer)(this.propertiesFactory.isSet(ILoadBalancer.class, this.name) ? (ILoadBalancer)this.propertiesFactory.get(ILoadBalancer.class, config, this.name) : new ZoneAwareLoadBalancer(config, rule, ping, serverList, serverListFilter, serverListUpdater));32 }33 }34 点击并拖拽以移动
IClientConfig:Ribbon的客户端配置,默认采用DefaultClientConfigImpl实现。
IRule:Ribbon的负载均衡策略,默认采用ZoneAvoidanceRule实现,该策略能够在多区域环境下选出最佳区域的实例进行访问。
IPing:Ribbon的实例检查策略,默认采用DummyPing实现,该检查策略是一个特殊的实现,实际上它并不会检查实例是否可用,而是始终返回true,默认认为所有服务实例都是可用的。一般不会去使用,还是会影响性能的,因为请求之前还是要再调用一次。
ServerList:服务实例清单的维护机制,默认采用ConfigurationBasedServerList实现。
ServerListFilter:服务实例清单过滤机制,默认采ZonePreferenceServerListFilter,该策略能够优先过滤出与请求方处于同区域的服务实例。(这个功能在弱化,尽量使用IRule)
ILoadBalancer:负载均衡器,默认采用ZoneAwareLoadBalancer实现,它具备了区域感知的能力。
IRule详解
编辑
- RandomRule: 随机选择一个Server。
- RetryRule: 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server。
- RoundRobinRule: 轮询选择, 轮询index,选择index对应位置的Server。
- AvailabilityFilteringRule: 过滤掉一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就是检查status里记录的各个Server的运行状态。
- BestAvailableRule: 选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过。
- WeightedResponseTimeRule: 根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低。
- ZoneAvoidanceRule: 默认的负载均衡策略,即复合判断Server所在区域的性能和Server的可用性选择Server,在没有区域的环境下,类似于轮询(Zone---华北华中华南这样的区域,region---亚洲南美北美这样比较打的区域)
- NacosRule: 优先调用同一集群的实例,基于随机权重
全局配置:
调用的微服务,一律使用指定的负载均衡策略
1 @Configuration 2 public class RibbonConfig { 3 4 /** 5 * 全局配置 6 * 指定负载均衡策略 7 * @return 8 */ 9 @Bean10 public IRule ribbonRule() {11 // 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机权重)12 return new NacosRule();13 }
局部配置:
调用指定微服务时,使用对应的负载均衡策略
修改application.yml
# 被调用的微服务名mall-order: ribbon: # 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重) NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
自定义负载均衡策略
通过实现 IRule 接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。
实现基于Nacos权重的负载均衡策略
1 @Slf4j 2 public class NacosRandomWithWeightRule extends AbstractLoadBalancerRule { 3 4 @Autowired 5 private NacosDiscoveryProperties nacosDiscoveryProperties; 6 7 @Override 8 public Server choose(Object key) { 9 DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();10 String serviceName = loadBalancer.getName();11 NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();12 try {13 //nacos基于权重的算法14 Instance instance = namingService.selectOneHealthyInstance(serviceName);15 return new NacosServer(instance);16 } catch (NacosException e) {17 log.error("获取服务实例异常:{}", e.getMessage());18 e.printStackTrace();19 }20 return null;21 }22 @Override23 public void initWithNiwsConfig(IClientConfig clientConfig) {24 25 }26 点击并拖拽以移动
配置自定义的策略
1)全局配置
1 @Bean2 public IRule ribbonRule() {3 return new NacosRandomWithWeightRule();4 }
2)局部配置:
修改application.yml
1 # 被调用的微服务名2 mall-order:3 ribbon:4 # 自定义的负载均衡策略(基于随机&权重)5 NFLoadBalancerRuleClassName: com.tuling.mall.ribbondemo.rule.NacosRandomWithWeightRule
饥饿加载
在进行服务调用的时候,如果网络情况不好,第一次调用会超时。Ribbon默认懒加载,意味着只有在发起调用的时候才会创建客户端。
编辑
开启饥饿加载,解决第一次调用慢的问题
ribbon: eager-load: enabled: true clients: mall-order,mall-other
参数说明:
- ribbon.eager-load.enabled:开启ribbon的饥饿加载模式
- ribbon.eager-load.clients:指定需要饥饿加载的服务名,也就是你需要调用的服务,如果有多个服务,则用逗号隔开
LoadBalancer
Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器, 用来替代Ribbon。
Spring官方提供了两种客户端都可以使用loadbalancer:
RestTemplate
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。
WebClient
WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法,可以用来发起相应的请求。
3.1 RestTemplate整合LoadBalancer
1)引入依赖
1 23 6 7 8org.springframework.cloud 4spring-cloud-starter-loadbalancer 59 12 13 14org.springframework.boot 10spring-boot-starter-web 1115 com.alibaba.cloud 16spring-cloud-starter-alibaba-nacos-discovery 1718 2319 22org.springframework.cloud 20spring-cloud-starter-netflix-ribbon 21
注意: nacos-discovery中引入了ribbon,需要移除ribbon的包
如果不移除,也可以在yml中配置不使用ribbon。默认情况下,如果同时拥有RibbonLoadBalancerClient和BlockingLoadBalancerClient,为了保持向后兼容性,将使用RibbonLoadBalancerClient。要覆盖它,可以设置spring.cloud.loadbalancer.ribbon.enabled属性为false。
spring: application: name: mall-user-loadbalancer-demo cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # 不使用ribbon,使用loadbalancer loadbalancer: ribbon: enabled: false
编辑
2)使用@LoadBalanced注解修饰RestTemplate,开启客户端负载均衡功能
@Configuration public class RestConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
3) 使用
@RestController @RequestMapping("/user") public class UserController { @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/findOrderByUserId/{id}") public R findOrderByUserId(@PathVariable("id") Integer id) { String url = "http://mall-order/order/findOrderByUserId/"+id; R result = restTemplate.getForObject(url,R.class); return result; } }
3.2 WebClient整合LoadBalancer
1)引入依赖
1 23 6 7 8org.springframework.cloud 4spring-cloud-starter-loadbalancer 59 12 13 14org.springframework.boot 10spring-boot-starter-webflux 1115 com.alibaba.cloud 16spring-cloud-starter-alibaba-nacos-discovery 1718 2319 22org.springframework.cloud 20spring-cloud-starter-netflix-ribbon 21
2) 配置WebClient作为负载均衡器的client
1 @Configuration 2 public class WebClientConfig { 3 4 @LoadBalanced 5 @Bean 6 WebClient.Builder webClientBuilder() { 7 return WebClient.builder(); 8 } 9 10 @Bean11 WebClient webClient() {12 return webClientBuilder().build();13 }14 }
3) 使用
1 @Autowired 2 private WebClient webClient; 3 4 @RequestMapping(value = "/findOrderByUserId2/{id}") 5 public MonofindOrderByUserIdWithWebClient(@PathVariable("id") Integer id) { 6 7 String url = "http://mall-order/order/findOrderByUserId/"+id; 8 //基于WebClient 9 Mono result = webClient.get().uri(url)10 .retrieve().bodyToMono(R.class);11 return result;12 }
原理: 底层会使用ReactiveLoadBalancer
编辑
引入webFlux
1 @Autowired 2 private ReactorLoadBalancerExchangeFilterFunction lbFunction; 3 4 @RequestMapping(value = "/findOrderByUserId3/{id}") 5 public MonofindOrderByUserIdWithWebFlux(@PathVariable("id") Integer id) { 6 7 String url = "http://mall-order/order/findOrderByUserId/"+id; 8 //基于WebClient+webFlux 9 Mono result = WebClient.builder()10 .filter(lbFunction)11 .build()12 .get()13 .uri(url)14 .retrieve()15 .bodyToMono(R.class);16 return result;17 }
-
世界今头条!SpringCloud-Ribbon学习笔记
思维导图概念总结,地址:everythingwillbefine|ProcessOnRibbon使用1 当引入了nacos服务发现就可以...
来源: 世界今头条!SpringCloud-Ribbon学习笔记
世界速看:挑战行业多项不可能 一加11即将发布:最强性能旗舰
世界动态:python语法笔记
令人气愤!女子曝无良汽修店为赚钱高速路上撒钉子专扎车胎
天天视讯!刘作虎:OPPO一加正式开启双品牌战略 100亿投资扶植一加
环球观速讯丨义乌开始生产阿根廷夺冠球衣 还是三颗星 阿根廷辟谣:假的 侵权
世界快播:“顶级大众” 宾利Batur公布工艺细节:210克黄金3D打印
老人手指被卡:消防员用开塞露救了差点被剪的蓝宝石戒指
全球快资讯:一文了解 Dubbo 的代码架构
今日报丨关于整数二分的详解
滚动:预编译#error的使用
全球要闻:YoloV7 标签匹配机 loss 计算详解
安全多方计算(1):不经意传输协议
每日快讯!元旦假期首日火车票今开抢!迎出行小高峰:五大热门目的地出炉
观天下!Find N2系列发布背后:OPPO再次展示对产品精益求精态度
天天要闻:全国冻哭预警地图来了:周末20余省份或被冻哭 冷到破纪录
热议:售价超300万!乔布斯亲手编号Apple-1电脑落锤成交:46年后 开机画面眼前一亮
世界最大独立圆柱体水族馆爆裂:1500多条鱼全军覆没
世界杯决战前夕 法国又有两大主力倒下!5人感染神秘流感
【环球热闻】被加价千元:AMD喊话正加大RX 7900系生产!NV 4080笑而不语
世界简讯:VUE数据双向绑定
第一百一十四篇: JS数组Array(三)数组常用方法
世界上最大的鱼缸今日突然破裂:100万升水泄露 1500条鱼死亡
放假3天不调休!2023年元旦假期首日火车票开售 除夕票这一天就能买
天天报道:学谁不好学特斯拉!几十万的宝马车 容不下一个收音机
观天下!骗子诈骗1250万 买彩票中1450万:已退还给39名聋哑人
全球热讯:XSX性能比PS5强 但为何游戏性能总是输?
天天速看:Python函数/动态参数/关键字参数
天天热点!女子发烧敷20分钟面膜揭下变3D立体面具 医生提醒:影响退热 当心面瘫
方便面消费第一大国是我们:超6成人每周吃三次
世界速读:注解在Android中的使用场景
热推荐:锂金属电池爱长枝晶?韩国科学家找到破解之法
【当前独家】确认了!《阿凡达2:水之道》没有片尾彩蛋
天天观速讯丨1152分区+4K 144Hz 联合创新32寸miniLED显示器首发5399元
终于修好了!Win11新补丁解决22H2大文件复制缓慢Bug
首款第二代骁龙8游戏旗舰!红魔8 Pro来了
今日最新!王思聪投资百万成立新公司 经营范围包括动漫游戏开发
全球最资讯丨全自动门锁比半自动更人性化!但半自动更受青睐 真相终于揭开
世界简讯:Hessian2序列化支持这一点,让重构dubbo接口更容易了
【热闻】-真正的国产亲民MPV 新款传祺M6 PRO上市:11.98万起
看点-旗下新作首月收入超4.8亿!腾讯成为《妮姬》开发商Shift Up第二大股东
女子高烧39.8度喊妈 妈妈以为鸭子叫没搭理 网友:怎么又变异了
观察-《三体》动画明天开播第3集 官方公布史强、古筝行动档案
【天天聚看点】微信小程序报错“getLocation:fail the api need to be declared in the requiredPriva
【全球快播报】记录--三分钟打造自己专属的uni-app工具箱
视点!小米万兆路由器用上企业级处理器!卢伟冰:降维打击
【天天报资讯】LCD面板价格连连下跌!LG P7 LCD工厂停产
环球关注:中国高速看山东!山东高速施工用上北斗卫星:精度达到毫米级
世界要闻:三大板卡品牌之一的微星缺席RX 7900首发 原因揭晓:直接非公版
世界快消息!女生手捏温度计度数直线飙到38度!腋下一测39.5度
天天日报丨项目经理的核心价值:以目标为导向做正确的事
环球热点评!Vue3项目-生成Cron表达式组件
世界今亮点!MIUI 14终于再次成为最好用的操作系统
ChatGPT已经牛到取代谷歌了?测试结果来了
男子每天点赞上万次被处罚 当庭演示一分钟才点赞91个
【当前独家】“智轨列车”亮相咸阳:可识别虚拟轨道 载客达300人
全球新动态:研究揭示马桶不盖盖后果多严重:致病菌满屋乱飞
全球滚动:Java 反射概念的引入
天天热议:小米13太火爆了 博主准点抢购结果秒没:最后等了20分钟捡漏 成功上车
【天天速看料】“火流星”掉落 专家判断陨石来自46亿年前:比地球上所有石头都古老
当前速看:《阿凡达2》成2022进口片首日票房冠军!时隔69天单日再破亿 豆瓣8.4分
价格能顶半套正版Win11 老牌压缩软件WinZip 27发布 你会买吗?
快播:44岁的泰国长公主因心脏问题失去知觉:紧急送医
渗透实录-01
要闻:Nacos 2.2 正式发布,这次更新太炸了!
世界关注:Kerberos身份验证在ChunJun中的落地实践
IM通讯协议专题学习(五):Protobuf到底比JSON快几倍?全方位实测!
【聚看点】多数据源事务处理-涉及分布式事务
怎么硬盘安装ubuntu?硬盘ubuntu安装教程
佳能5d系列哪个最好?佳能5DX相机参数
诺基亚6200上市价格是多少?诺基亚6200手机参数
烤箱如何预热?烤箱预热的方法有哪些?
短讯!IDEA没有新建jsp文件按钮
VS2022生成控制台引用程序,.net应用导出成exe文件,发部成独立文件的详细图解
MySQL学习笔记2
网页字体变大是怎么回事?网页字体变大了怎么还原?
洞庭连天是什么意思?洞庭连天九疑高是什么生肖?
国庆一词最早出现在什么时候?国庆一词最早出现在什么地方?
蝴蝶发现花蜜靠的是什么?蝴蝶发现花蜜的句子有哪些?
造梦西游3金角大王怎么打?造梦西游3金角大王掉什么?
传闻中的陈芊芊韩烁失忆是第几集?传闻中的陈芊芊韩烁失忆是真的吗?
爱情公寓决战紫禁之巅是第几集?爱情公寓决战紫禁之巅花了多少经费?
曾小莲是什么梗?爱情公寓曾小莲是哪一集?
睢宁县属于哪个市?睢宁县旅游景点有哪些?
类似于惊天魔盗团的电影有哪些?惊天魔盗团剧情解析
独家首发是什么意思?独家首发和普通授权有什么区别?
环球短讯!认证管理(锐捷网关篇)
世界即时看!C语言字符串拆分的两种方式strtok和正则表达式
全球通讯!低代码靠不靠谱?看看低代码在智能物联系统搭建中的应用
美国一战机垂直降落失控 飞行员弹射7秒落地:现场机头先撞地
世界时讯:可拆卸手柄神似Switch!OnexPlayer 2掌机海外发布:起售价超6200元
全球要闻:混动车鼻祖上新 全新丰田普锐斯售价公布:约19.10万元起
一加10T漫威限定版上架:用4年仍然很流畅 4700元
天天观焦点:三连降稳了!新一轮油价三天后开调:预计下跌0.41元/升
世界资讯:因MacBook Pro蝶式键盘翻车:苹果赔了3个多亿
速递!贾跃亭造车梦要成了?FF91交付计划公布 还差10几亿资金
全球热议:爱奇艺VIP会员今起涨价:连续包月黄金25元/月
今日热讯:浙江“火流星”现场被砸大坑!专家:捡到陨石碎片别用水清洗
焦点精选!机械硬盘真没人买!西数股价大跌 公司业绩要暴雷:或将大清库存
每日精选:V2Board机场项目泄露400余万条数据