SpringCloud学习2(Spring Cloud Netflix)负载均衡Ribbon、Feign负载均衡、Hystix服务熔断
文章目录
- 负载均衡Ribbon
- Ribbon的作用
- 代码实现
- 生产者cloud1_provider实现
- 配置文件
- 在HiController中编写以下代码
- 启动集群
- 消费者cloud1_consumer实现
- 引入依赖
- 编写配置文件
- 编写启动类,并给RestTemplate配置@LoadBalanced注解
- 编写RestController来测试
- Feign负载均衡
- 简介Feign
- Feign集成了RIbbon
- 编码测试(基于cloud1_consumer项目修改)
- 引入依赖
- 启用FeignClient
- 编写FeignService接口
- 编写Controller测试使用
- Hystrix服务熔断
- 分布式系统面临问题——服务雪崩
- 什么是Hystrix断路器
- 作用:
- 服务熔断`@HystrixCommand`
- 服务熔断与服务降级
- 服务熔断代码案例
- 引入依赖
- 启用断路器
- 编写带有短路方法的测试Controller
- 服务降级代码案例(基于之前搭建的cloud1_consumer项目修改)
- 引入依赖
- 编写yml配置
- 编写Feign接口
- 编写降级回调工厂类 OrderServiceFallBackFactory
- 编写测试Controller
- Hystrix流监控Dashboard
- 代码案例
- 生产侧,被监测方依赖配置与代码
- 监控客户端依赖配置与代码cloud1_hystrix_dashboard
负载均衡Ribbon
SpringCloudRibbon是基于NetflixRibbon实现的一套客户端负载均衡工具。主要功能是提供客户端的负载均衡算法。Ribbon客户端提供系列完整的配置,如连接超市,重试机制。简单说就是在配置文件中列出LoadBalancer后面的所有机器。Ribbon会自动帮助基于某种规则(轮询、随机)去连接机器。
Ribbon的作用
- LB(Load Balance)负载均衡,在微服务或分布式集群中常用的一种应用
- 负载均衡简单来说就是平摊用户请求到多个赴俄乌,从而达到系统的HA(高可用)
- 常见负载均衡软件Nginx、LVS
- Dubbo、SpringCloud中均给我们提供了负载均衡。SpringCloud负载均衡算法可以自定义
- 负载均衡简单分类
- 集中式Load Balance
- 即在服务端消费方和提供方之间使用独立的LB设施,如Nginx,由该服务负责把访问请求通过负载策略转发到服务提供方
- 进程式Load Balance
- 将LB的逻辑集成到消费者,消费者从服务注册中心获取到有哪些地址可用,然后自己再根据这些地址选举出一个合适的服务器。
- Ribbon就属于进程式LB,他是一个类库。集成于消费者进程,消费者通过它来获取到服务提供者的地址。
- 集中式Load Balance
代码实现
基于前面的代码来改造服务提供者的代码,先搭建服务提供者的集群
生产者cloud1_provider实现
配置文件
spring:profiles:active: dev-9991---
server:port: 9991
spring:config:activate:on-profile: dev-9991application:name: cloud1-provider
logging:level:com.hx: debug
eureka:client:service-url:defaultZone: http://localhost:8881/eureka/,http://localhost:8882/eureka/instance:instance-id: cloud-prod-1# 配置主机地址hostname: localhost---
server:port: 9992
spring:config:activate:on-profile: dev-9992application:name: cloud1-provider
logging:level:com.hx: debug
eureka:client:service-url:defaultZone: http://localhost:8881/eureka/,http://localhost:8882/eureka/instance:instance-id: cloud-prod-2# 配置主机地址hostname: localhost
在HiController中编写以下代码
@Value("${server.port}")
private String port;@RequestMapping("/")
public String hi() {return "<h1>HI Spring Cloud 1 " + port + "</h1>";
}
启动集群

消费者cloud1_consumer实现
引入依赖
注意:这里不需要重复引入ribbon的依赖,否则无法ribbon将获取不到实例
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud1_parent</artifactId><groupId>com.hx</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud1_consumer</artifactId><name>cloud1_consumer</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.hx</groupId><artifactId>cloud1_api</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>
</project>
编写配置文件
server:port: 7771
spring:application:name: cloud1-consumer
logging:level:com.hx: debug
eureka:client:service-url:defaultZone: http://localhost:8881/eureka/,http://localhost:8882/eureka/register-with-eureka: false # 消费者不需要注册自己instance:instance-id: cloud-prod-1# 配置主机地址hostname: localhost
编写启动类,并给RestTemplate配置@LoadBalanced注解
@SpringBootApplication
@EnableEurekaClient
public class Cloud1ConsumerApp {public static void main(String[] args) {SpringApplication.run(Cloud1ConsumerApp.class,args);}// 配置负载均衡的restTemplate@Bean@LoadBalanced // ribbonpublic RestTemplate restTemplate(){return new RestTemplate();}
}
编写RestController来测试
@RestController
public class RestOrderController {@Autowiredprivate RestTemplate restTemplate;private static final String ORDER_APP_URI = "http://CLOUD1-PROVIDER";@RequestMapping("/")public String index() {return restTemplate.getForObject(ORDER_APP_URI.concat("/"), String.class);}@RequestMapping("/restOrder")public Order getOrder() {return restTemplate.getForObject(ORDER_APP_URI.concat("/getOrder"), Order.class);}
}
Feign负载均衡
简介Feign
Feign是声明式的web service客户端。让微服务之间的调用更简单,类似controller调用service。SpringCloud继承了Ribbon和Eureka,可以在使用Feign时提供负载均衡的http客户端。Feign旨在使得编写JavaHttp客户端简单容易。
只需要给一个接口,然后添加注解就可以。
Feign集成了RIbbon
利用Ribbon维护了微服务列表信息,通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口,且以声明式的方法,优雅简单的实现服务调用。
编码测试(基于cloud1_consumer项目修改)
引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId><version>1.4.7.RELEASE</version>
</dependency>
启用FeignClient
@SpringBootApplication
@EnableEurekaClient
//@EnableFeignClients
@EnableFeignClients(basePackages = "com.hx.service")
public class Cloud1ConsumerApp {public static void main(String[] args) {SpringApplication.run(Cloud1ConsumerApp.class, args);}// 配置负载均衡的restTemplate@Bean@LoadBalanced // ribbonpublic RestTemplate restTemplate() {return new RestTemplate();}
}
编写FeignService接口
@Service
@FeignClient(value = "CLOUD1-PROVIDER")
public interface RestOrderService {@GetMapping("/")String index();@PostMapping("/getOrder")Order restGetOrder();
}
编写Controller测试使用
@RestController
@RequestMapping("/fg")
public class RestOrderFeignController {@Autowiredprivate RestOrderService restOrderService;@RequestMapping("/")public String index() {return restOrderService.index();}@RequestMapping("/restOrder")public Order getOrder() {return restOrderService.restGetOrder();}
}
Hystrix服务熔断
分布式系统面临问题——服务雪崩
复杂分布式体系结构中应用程序有数十个依赖关系,每个依赖关系在某些时刻不可避免的失败。
多个微服务之间调用的时候,假设A服务调用B、C服务,微服务B和C又调用其他微服务,这就是所谓的"扇出"。如果扇出的链路上某个微服务的调用响应超市或时间过长无响应,对微服务A的调用就会占用越来越多的系统资源,进而引发系统崩溃,即服务雪崩。
对于高流量应用,单一的后端依赖可能导致所有服务上的所有资源都在几十秒内饱和。更糟糕的是这些应用还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联腹胀。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不取消整个应用程序系统。
什么是Hystrix断路器
Hystrix是一个应用于处理分布式系统的延迟和容错开源库,在分布式系统中,许多依赖不可避免的调用失败,eg:超时、异常等。Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,提高分布式系统的弹性。
断路器本身是一种开关,当某个服务单元发生故障后,通过断路器的故障监控,向服务调用方返回一个服务预期的、可处理的备选响应,而不是长时间的等待或者抛出无法处理的异常,这样保证了服务调用方的线程不会被长时间占用。从而避免故障在分布式系统中的蔓延乃至雪崩。
作用:
服务降级、服务熔断、服务限流、接近实时监控
服务熔断@HystrixCommand
熔断机制是应对雪崩问题的一种微服务链路保护机制。
当扇出的某个微服务不可用或者响应时间太长,会进行服务降级,进而熔断该节点微服务调用,快速返回错误的相应细腻些。当检测到该服务响应正常后,恢复链路调用。在SpringCloud熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到达一定阈值,缺省5s内20次失败就会启动熔断机制。
服务熔断与服务降级
服务熔断(服务端编写):某个服务超时或者异常,引起熔断
服务降级(客户端编写):从整体的网站请求负载考虑,当某个服务熔断或者关闭后服务将不再被调用。此时在客户端可以准备一个失败回调FallbackFactory。返回一个默认的缺省值,整体服务水平下降。
服务熔断代码案例
引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.1.0.RELEASE</version>
</dependency>
启用断路器
@SpringBootApplication
@EnableDiscoveryClient // 服务发现,不只是eureka
//@EnableCircuitBreaker // 启用断路器Hystrix
@EnableHystrix
public class Cloud1ProdApp {public static void main(String[] args) {SpringApplication.run(Cloud1ProdApp.class);}
}
编写带有短路方法的测试Controller
@RestController
@RequestMapping("hystrix")
public class Hi_HystrixController {@Autowiredprivate OrderService orderService;@HystrixCommand(fallbackMethod = "getOrderHystrix")@RequestMapping("/order")public Order getOrder(String id) {if(StringUtils.isBlank(id)){throw new RuntimeException("参数ID不可以为空!");}return orderService.getOrder(id);}/*** 注意:这个熔断的方法,里的参数列表要和上面的方法参数列表相同* 否则报错:com.netflix.hystrix.contrib.javanica.exception.FallbackDefinitionException: fallback method wasn't found*/public Order getOrderHystrix(String id) {id = UUID.randomUUID().toString();return orderService.getOrder(id).setId("请传入正确的ID");}
}
服务降级代码案例(基于之前搭建的cloud1_consumer项目修改)
引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
编写yml配置
feign:hystrix:enable: true
编写Feign接口
@Service
@FeignClient(value = "CLOUD1-PROVIDER",fallbackFactory = OrderServiceFallBackFactory.class)
public interface RestOrderService {@GetMapping("/")String index();@PostMapping("/getOrder")Order restGetOrder();// 我们这次测试的接口 @PostMapping("/hystrix/order")Order restGetOrderFall();
}
编写降级回调工厂类 OrderServiceFallBackFactory
@Component
public class OrderServiceFallBackFactory implements FallbackFactory<RestOrderService> {@Overridepublic RestOrderService create(Throwable cause) {return new RestOrderService() {@Overridepublic String index() {return "降级";}@Overridepublic Order restGetOrder() {return null;}@Overridepublic Order restGetOrderFall() {return new Order().setId("没有找到,可能是未传入ID").setCreateTime(SimpleDateFormat.getDateTimeInstance().format(new Date()));}};}
}
编写测试Controller
@RestController
@RequestMapping("/fgfall")
public class RestOrderFeignController2 {@Autowiredprivate RestOrderService restOrderService;@RequestMapping("/order2")public Order getOrder() {return restOrderService.restGetOrderFall();}
}
注意:这里高版本的springcloud2021版本不清楚为什么无法实现
Hystrix流监控Dashboard

代码案例
生产侧,被监测方依赖配置与代码
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
#暴露全部的监控信息
management:endpoints:web:exposure:include: "*"
@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet(){ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());registrationBean.setLoadOnStartup(1);registrationBean.addUrlMappings("/actuator/hystrix.stream");registrationBean.setName("HystrixMetricsStreamServlet");return registrationBean;
}
监控客户端依赖配置与代码cloud1_hystrix_dashboard
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud1_parent</artifactId><groupId>com.hx</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud1_hystrix_dashboard</artifactId><name>cloud1_hystrix_dashboard</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId></dependency></dependencies>
</project>
package com.hx;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;@SpringBootApplication
// 启用hystrix监控
@EnableHystrixDashboard
@EnableHystrix
public class DashboardApp {public static void main(String[] args) {SpringApplication.run(DashboardApp.class,args);}
}

相关文章:
SpringCloud学习2(Spring Cloud Netflix)负载均衡Ribbon、Feign负载均衡、Hystix服务熔断
文章目录负载均衡RibbonRibbon的作用代码实现生产者cloud1_provider实现配置文件在HiController中编写以下代码启动集群消费者cloud1_consumer实现引入依赖编写配置文件编写启动类,并给RestTemplate配置LoadBalanced注解编写RestController来测试Feign负载均衡简介F…...
Spring 源码解析 - @Async 注解下的循环依赖问题原理
一、Async 注解下的循环依赖问题 我们都知道 Spring IOC 单例模式下可以帮助我们解决循环依赖问题,比如下面自己依赖自己循环依赖的场景: Component public class TestAsync {ResourceTestAsync async;public void test() {System.out.println("t…...
8个全球性编程比赛,天才程序员的梦想舞台
很多编程爱好者在学习之初,都渴望与全球的程序员一较高下,以证明自己的实力。 一些全球性的编程竞赛为他们提供了这样的机会,不仅可以与全世界的顶尖程序员们交流,还有机会获得丰厚的奖金和进入顶级公司的机会,更重要…...
2023年中国海洋大学计算机及电子信息考研分析
考研时间跨度: 初试时间: 2022年8月23 海大推免及创新人才计划接收通知。 2022年9月13 海大专业目录及人数,包含推免。 2022年10月18 2022年硕士研究生计划 ,不含推免。 海大2022年硕士研究生计划 网上第一次时间为2022年9月24日…...
【C++笔试强训】第六天
选择题 1. 解析:十进制转换为八进制就是不断的除8,取余数。十进制转换成其他进制的数就是除以进制,取余。 解析:注意printf的转换,%%只会打印一个%,所以选A。 解析:由于()的原因p先和*结合&…...
Redission 中的 RedLock 原理实现, springboot 你造吗?
分布锁之RedLock 锁住你的心我的爱 🚂为什么需要使用 RedLock锁被误释放时钟不一致问题锁的“延迟释放”而不是死锁Redlock是啥redlock 存在什么问题惊群效应时钟漂移Redisson 实现 RedLock在 Redisson 中, RedLock的实现类是哪一个类?这一招叫抛砖引玉springboot …...
【沐风老师】3dMax一键房屋创建者插件使用方法详解
3dmax一键房屋创建者,一键生成墙体、窗洞和门洞的插件!这个脚本主要用于创建或捕获一些架构项目所代表的平面,这是通过导入它们并在每个所需的层添加值来实现的。传统方法,但是省事儿多了! 【版本要求】 3dMax 2015及…...
C/C++ 变量详解
文章目录前言一、静态变量与动态变量1. 概念2. 区别3. 使用方法和注意事项3.1 静态变量3.2 动态变量4. 结论二、全局变量与局部变量1. 区别2. 全局变量的使用方法和注意事项3. 局部变量的使用方法和注意事项4. 总结前言 对C学习感兴趣的可以看看这篇文章哦:C/C教程…...
新SSD盘安装操作系统启动不了
今天打算给电脑升级下装备,加装一块固态硬盘。 电脑原本自带两块硬盘(SSD128GSATA1T),SSD清理了许久还是没空间,于是就买了块1TSSD,打算扩容下。 打开电脑后盖傻眼了,没有备用插槽,…...
基于Spring、SpringMVC、MyBatis的病历管理系统
文章目录 项目介绍主要功能截图:登录首页医院公告管理用户管理科室信息管理医生管理出诊信息管理预约时间段管理预约挂号管理门诊病历管理就诊评价管理轮播图管理功能架构图部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历…...
QT编程从入门到精通之三十四:“第五章:Qt GUI应用程序设计”之“5.5 Qt Creator使用技巧”
目录 第五章:Qt GUI应用程序设计 5.5 Qt Creator使用技巧 第五章:Qt GUI应用程序设计 在“Qt 程序创建基础”上,本章将继续深入地介绍Qt Creator设计GUI应用程序的方法,包括Qt创建的应用程序项目的基本组织结构,可视化设计的UI界面文件的原理和运行机制,信号与槽的使用…...
网络工程方向有哪些SCI期刊推荐? - 易智编译EaseEditing
以下是网络工程领域的一些SCI期刊推荐: IEEE Transactions on Network and Service Management: 这是一个IEEE旗下的期刊,涵盖了网络与服务管理方面的研究。主要关注网络管理、服务管理和其它相关领域的创新和最新研究。 Computer Networks: 这是一本著…...
netty入门(二十六)任务加入异步线程池源码剖析
1.handler中加入线程池和Context添加线程池 1.1 源码剖析目的 (1)在 Netty 中做耗时的,不可预料的操作,比如:数据库、网络请求、会严重影响 Netty 对 Socket 的处理速度。 (2)而解决方法就是…...
神经网络算法入门和代码
文章内容 感知机(Perceptron)反向传播算法(Back Propagation algorithm)RBF(Radial Basis Function,径向基函数) 网络:单一层前馈网络,它使用径向基作为隐层神经元激活函数ART(Adaptive Resona…...
如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?
作者:华钟明 本文我们将介绍 Apache Dubbo 灵活的多协议设计原则,基于这一设计,在 Dubbo 框架底层可灵活的选用 HTTP/2、HTTP/REST、TCP、gRPC、JsonRPC、Hessian2 等任一 RPC 通信协议,同时享用统一的 API 与对等的服务治理能力。…...
ToBeWritten之杂项2
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...
Linux三剑客之awk命令详解
1、概述 Linux三剑客:grep、sed、awk。grep主打查找功能,sed主要是编辑行,awk主要是分割列处理。本篇文章我们详细介绍awk命令。 awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。awk是一种编…...
C++异常处理:掌握高效、健壮代码的秘密武器
C异常处理全面解析:底层原理、编译器技巧与实用场景C异常机制:让我们迈向更安全、更可靠的代码C异常处理:掌握基本概念什么是异常?异常处理的重要性C异常处理的组成部分:try、catch、throw探索C异常处理的核心…...
Jetpack Compose基础组件之按钮组件
概述 按钮组件Button是用户和系统交互的重要组件之一,它按照Material Design风格实现,我们先看下Button的参数列表,通过参数列表了解下Button的整体功能 Composable fun Button(onClick: () -> Unit, // 点击按钮时的回调modifier: Modi…...
利用json-server快速在本地搭建一个JSON服务
1,json-server介绍 一个在前端本地运行,可以存储json数据的server。 通俗来说,就是模拟服务端接口数据,一般用在前后端分离后,前端人员可以不依赖API开发,而在本地搭建一个JSON服务,自己产生测…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
