# 从浅入深 学习 SpringCloud 微服务架构(六)Feign(3)

从浅入深 学习 SpringCloud 微服务架构(六)Feign(3)

一、组件的使用方式总结

1、注册中心

1) Eureka

搭建注册中心

引入依赖 spring-cloud-starter-netflix-eureka-server。
配置 EurekaServer。
通过 @EnableEurekaServer激活Eureka Server端配置。

服务注册

服务提供者引入 spring-cloud-starter-netflix-eureka-client 依赖。
通过 eureka.client.serviceur1.defaultZone 配置注册中心地址。

2)consul

搭建注册中心

下载安装 consul
命令形式启动 consul consul agent -dev

服务注册

服务提供者引入 spring-cloud-starter-consul-discovery 依赖。
通过 spring.c1oud.consul.host 和 spring.cloud.consul.port 指定 Consul Server 的请求地址。

2 服务调用

1)Ribbon

通过 Ribbon 结合 RestTemplate 方式进行服务调用只需要在声明 RestTemplate 的方法上添加注解	@LoadBalanced 即可。
可以通过{服务名称}.ribbon.NFLoadBalancerRuleClassName 配置负载均衡策略。

2)Feign

服务消费者引入 spring-cloud-starter-openfeign 依赖。
通过 @FeignClient 声明一个调用远程微服务接口。
启动类上通过 @EnableFeignclients 激活 Feign。

二、高并发问题:模拟环境

1、在 在消费都子工程(子模块) order_service 中,application.yml 配置文件中,

添加 tomcat 最大连接数量,用以模拟高并发环境问题。


##  spring_cloud_demo\order_service\src\main\resources\application.ymlserver:port: 9002 #端口
#  port: ${port:9002}  # 启动端口设置为动态传参,如果未传参数,默认端口为 9002tomcat:max-threads: 10  # 设置 tomcat 最大连接数量,用以模拟高并发环境问题。spring:datasource:driver-class-name: com.mysql.jdbc.Driver
#    url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghaiurl: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8username: 'root'password: '012311'application:name: service-order #服务名称jpa:database: MySQLshow-sql: trueopen-in-view: trueeureka:  # 配置 Eurekaclient:service-url:defaultZone: http://localhost:9000/eureka/instance:prefer-ip-address: true  # 使用 ip 地址注册instance-id: ${spring.cloud.client.ip-address}:${server.port}# 配置 feign 日志的输出:
# 日志配置:NONE:不输出日志,BASIC:适用于生产环境追踪问题,HEADERS:在BASIC基础上记录请求和响应头信息,FULL:记录所有。
feign:client:config:service-product:  # 需要调用的服务名称loggerLevel: FULL
logging:level:djh.it.order.feign.ProductFeignClient: debug

2、在 在消费都子工程(子模块) order_service 中,OrderController.java 文件中,

添加一个方法,用以模拟高并发环境问题。


/***   spring_cloud_demo\order_service\src\main\java\djh\it\order\controller\OrderController.java**  2024-4-24 订单的 controller 类 OrderController.java*/
package djh.it.order.controller;import djh.it.order.command.OrderCommand;
import djh.it.order.domain.Product;
import djh.it.order.feign.ProductFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
@RequestMapping("/order")
public class OrderController {// 注入 restTemplate 对象@Autowiredprivate RestTemplate restTemplate;@Autowired   //注入 feign 组件的接口类private ProductFeignClient productFeignClient;/***  注入 DiscoveryClient : springcloud 提供的获取元数据的工具类。*      调用方法获取服务的元数据信息。*/@Autowiredprivate DiscoveryClient discoveryClient;/***  使用 基于 ribbon 的形式调用远程微服务:*  1、使用 @LoadBalanced 注解 声明 RestTemplate*  2、使用服务名称 service-product 替换 IP 地址 。** @param id* @return*/@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)public Product findById(@PathVariable Long id){Product product = null;
//        //product = restTemplate.getForObject("http://127.0.0.1:9001/product/1", Product.class);
//        product = restTemplate.getForObject("http://service-product/product/1", Product.class);//通过 Feign 自动的接口调用远程微服务product = productFeignClient.findById(id);return product;}@RequestMapping(value = "/{id}", method = RequestMethod.GET)public String findOrder(@PathVariable Long id){System.out.println(Thread.currentThread().getName());return "添加一个方法,用以模拟高并发环境问题。--- 根据id查询订单";}//    @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
//    public Product findById(@PathVariable Long id){
//
//        //调用 discoveryClient 方法,已调用服务名称获取所有的元数据。
//        List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
//        for (ServiceInstance instance : instances) {
//            System.out.println(instance);
//        }
//
//        //获取唯一的一个元数据
//        ServiceInstance instance = instances.get(0);
//
//        Product product = null;
//
//        //根据元数据中的主机地址和端口号拼接请求微服务的 URL
//        product = restTemplate.getForObject("http://" + instance.getHost() + ":" + instance.getPort() + "/product/1", Product.class);
//
//
//        /**
//         *  调用商品服务(将微服务的请求路径硬编码到 java 代码中)
//         *  存在问题:对微服务调用的负载均衡,加入API网关,配置的统一管理,链路追踪。
//         */
//        //product = restTemplate.getForObject("http://127.0.0.1:9001/product/1", Product.class);
//        return product;
//    }
}

3、浏览器地址栏输入:http://127.0.0.1:9002/order/buy/1

就会有打开较慢的问题。
http://127.0.0.1:9002/order/1

三、高并发问题:使用 jmetter 模拟高负载存在的问题

1、性能小工具 Jmeter 介绍:

Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。
用于对软件做压力测试,它最初被设计用于 Web 应用测试,但后来扩展到其他测试领域。

它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP服务器,等等。

JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。

另外 JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。

为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。

2、下载安装 apache jmeter 工具。

1)apache-jmeter-3.1.zip 下载地址:

https://www.jb51.net/softs/350339.html

2)下载完成,解压到没有中文的任意路径即可。

3、用 apache jmetter 工具 进行测试

1)打开 apache-jmetter 小工具

…\apachejmeter(jb51.net)\bin\jmeter.bat

2)依次点击:

右上角【新建】,【测试计划】。

右键【测试计划】,点击【添加】,【Threads Users】,【线程组】。
线程数:(20)
循环次数:(50)

右键【线程组】,依次点击【添加】,【Sampler】,【HTTP请求】。
服务器名称或IP:(127.0.0.1),端口号:(9002)
协议:(http)方法:(GET)
路径:(/order/buy/1)

右键【HTTP请求】,依次点击:【添加】,【监听器】,【察看结果树】。

设置好后,点击绿色【运行】图标。

在这里插入图片描述

在这里插入图片描述

4、浏览器地址栏输入:http://127.0.0.1:9002/order/buy/1

浏览器地址栏输入:http://127.0.0.1:9002/order/buy/1

会发现访问两个方法打开都较慢。

四、高并发问题:问题分析

1、tomcat 会以线程池的方式对所有的请求进行统一管理,

这样就会对于某个方法可能存在耗时问题。

2、tomcat 有最大并发设置,我们模拟环境设置了10上限。

3、随着外面请求越来越多,积压的请求数量势必会造成系统的崩溃。

4、高并发问题,解决方案:

为了不影响其他接口(方法)的正常访问,对多个服务之间进行隔离,

隔离方法有:1)线程池隔离,2)信号量隔离(即采用计数器隔离)。

五、高并发问题:线程池隔离的方式处理请求积压问题

1、在 order_service 子工程(子模块)中,修改 pom.xml 配置文件,

引入 hystrix 依赖坐标。


<?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>spring_cloud_demo</artifactId><groupId>djh.it</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>order_service</artifactId><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version><!--            <version>8.0.23</version>--></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- 引入 EurekaClient 依赖坐标 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- springcloud 整合的openFeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- hystrix --><dependency><groupId>com.netflix.hystrix</groupId><artifactId>hystrix-metrics-event-stream</artifactId><version>1.5.12</version></dependency><dependency><groupId>com.netflix.hystrix</groupId><artifactId>hystrix-javanica</artifactId><version>1.5.12</version></dependency></dependencies></project>
<!-- spring_cloud_demo\order_service\pom.xml -->

2、在 order_service 子工程(子模块)中,创建 数据服务隔离类 OrderCommand.java

/***   spring_cloud_demo\order_service\src\main\java\djh\it\order\command\OrderCommand.java**   2024-4-25 数据服务隔离类 OrderCommand.java*/
package djh.it.order.command;import com.netflix.hystrix.*;
import com.netflix.hystrix.HystrixThreadPoolProperties;
import djh.it.order.domain.Product;
import org.springframework.web.client.RestTemplate;public class OrderCommand extends HystrixCommand<Product> {private RestTemplate restTemplate;private Long id;public OrderCommand(RestTemplate restTemplate, Long id) {super(setter());this.restTemplate = restTemplate;this.id = id;}private static Setter setter() {// 服务分组HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("order_product");// 服务标识HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey("product");// 线程池名称HystrixThreadPoolKey threadPoolKey = HystrixThreadPoolKey.Factory.asKey("order_product_pool");/***线程池配置withCoreSize :线程池大小为10*withKeepAliveTimeMinutes:线程存活时间15秒withQueueSizeRejectionThreshold:队列等待的阈值为100,超过100执行拒绝策略*/HystrixThreadPoo1Properties.Setter threadPoolProperties = HystrixThreadPoolProperties.Setter().withCoreSize(50).withKeepAliveTimeMinutes(15).withQueueSizeRejectionThreshold(100);// 命令属性配置Hystrix开启超时HystrixCommandProperties.Setter commandProperties = HystrixCommandProperties.Setter()//采用线程池方式实现服务隔离.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)//禁止.withExecutionTimeoutEnabled(false);return Setter.withGroupKey(groupKey).andCommandKey(commandKey).andThreadPoolKey(threadPoolKey).andThreadPoolPropertiesDefaults(threadPoolProperties).andCommandPropertiesDefaults(commandProperties);}@Overrideprotected Product run() throws Exception{System.out.println(Thread.currentThread().getName());return restTemplate.getForObject("http://127.0.0.1/product/" + id, Product.class);}//降级方法@Overrideprotected Product getFallback(){Product product = new Product();product.setProductName("不好意思,出错了");return product;}
}

3、在 order_service 子工程(子模块)中,修改 Controller 类

/***   spring_cloud_demo\order_service\src\main\java\djh\it\order\controller\OrderController.java**  2024-4-24 订单的 controller 类 OrderController.java*/
package djh.it.order.controller;import djh.it.order.command.OrderCommand;
import djh.it.order.domain.Product;
import djh.it.order.feign.ProductFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
@RequestMapping("/order")
public class OrderController {// 注入 restTemplate 对象@Autowiredprivate RestTemplate restTemplate;@Autowired   //注入 feign 组件的接口类private ProductFeignClient productFeignClient;/***  注入 DiscoveryClient : springcloud 提供的获取元数据的工具类。*      调用方法获取服务的元数据信息。*/@Autowiredprivate DiscoveryClient discoveryClient;/***  使用 基于 ribbon 的形式调用远程微服务:*  1、使用 @LoadBalanced 注解 声明 RestTemplate*  2、使用服务名称 service-product 替换 IP 地址 。** @param id* @return*/@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)public Product findById(@PathVariable Long id){return new OrderCommand(restTemplate,id).execute();
//        Product product = null;
//        //product = restTemplate.getForObject("http://127.0.0.1:9001/product/1", Product.class);
//        product = restTemplate.getForObject("http://service-product/product/1", Product.class);//         //通过 Feign 自动的接口调用远程微服务
//        product = productFeignClient.findById(id);//        return product;}@RequestMapping(value = "/{id}", method = RequestMethod.GET)public String findOrder(@PathVariable Long id){System.out.println(Thread.currentThread().getName());return "添加一个方法,用以模拟高并发环境问题。--- 根据id查询订单";}//    @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
//    public Product findById(@PathVariable Long id){
//
//        //调用 discoveryClient 方法,已调用服务名称获取所有的元数据。
//        List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
//        for (ServiceInstance instance : instances) {
//            System.out.println(instance);
//        }
//
//        //获取唯一的一个元数据
//        ServiceInstance instance = instances.get(0);
//
//        Product product = null;
//
//        //根据元数据中的主机地址和端口号拼接请求微服务的 URL
//        product = restTemplate.getForObject("http://" + instance.getHost() + ":" + instance.getPort() + "/product/1", Product.class);
//
//
//        /**
//         *  调用商品服务(将微服务的请求路径硬编码到 java 代码中)
//         *  存在问题:对微服务调用的负载均衡,加入API网关,配置的统一管理,链路追踪。
//         */
//        //product = restTemplate.getForObject("http://127.0.0.1:9001/product/1", Product.class);
//        return product;
//    }
}

4、再次用 apache-jmetter 小工具进行压力测试,

浏览器地址栏输入:http://127.0.0.1:9002/order/buy/1

浏览器地址栏输入:http://127.0.0.1:9002/order/1

会发现访问第二个方法已经很快了。

六、高并发问题:服务容错的核心知识

1、雪崩效应

1)在微服务架构中,一个请求需要调用多个服务是非常常见的。

如客户端访问A服务,而A服务需要调用B服务,B服务需要调用C服务,

由于网络原因或者自身的原因,如果B服务或者C服务不能及时响应,A服务将处于阻塞状态,直到B服务C服务响应。

此时若有大量的请求涌入,容器的线程资源会被消耗完毕,导致服务瘫痪。

服务与服务之间的依赖性,故障会传播,造成连锁反应,
会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。

2)雪崩:是系统中的蝴蝶效应导致其发生的原因多种多样,
有不合理的容量设计,或者是高并发下某一个方法响应变慢,亦或是某台机器的资源耗尽。

从源头上我们无法完全杜绝雪崩源头的发生,但是雪崩的根本原因来源于服务之间的强依赖,
所以我们可以提前评估,做好熔断,隔离,限流。

2、服务隔离

顾名思义,它是指将系统按照一定的原则划分为若干个服务模块,
各个模块之间相对独立,无强依赖。

当有故障发生时,能将问题和影响隔离在某个模块内部,
而不扩散风险,不波及其它模块,不影响整体的系统服务。

3、熔断降级

1)熔断:这一概念来源于电子工程中的断路器(Circuit Breaker)。
在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,
上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。
这种牺牲局部,保全整体的措施就叫做熔断。

2)所谓降级:就是当某个服务熔断之后,服务器将不再被调用,
此时客户端可以自己准备一个本地的 fallback 回调,
返回一个缺省值。也可以理解为兜底。

4、服务限流

限流:可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。

一般来说系统的吞吐量是可以被测算的,为了保证系统的稳固运行,
一旦达到的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。
比方:推迟解决,拒绝解决,或者者部分拒绝解决等等。

上一节链接:
# 从浅入深 学习 SpringCloud 微服务架构(六)Feign(2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端路由的实现原理

当谈到前端路由时&#xff0c;指的是在前端应用中管理页面导航和URL的机制。前端路由使得单页应用&#xff08;Single-Page Application&#xff0c;SPA&#xff09;能够在用户与应用交互时动态地加载不同的视图&#xff0c;而无需每次都重新加载整个页面。 在前端开发中&…

如何在阿里云快速配置自动定时重启ECS云服务器?

背景 无论是电子商务、在线教育、游戏&#xff0c;还是流媒体等业务&#xff0c;服务器的稳定运行都是至关重要的。然而&#xff0c;在实际运行中&#xff0c;我们可能会遇到这样一些场景&#xff1a; 系统更新&#xff1a;一些操作系统或者软件的更新可能需要重启服务器才能…

bit、进制、位、时钟(窗口)、OSI七层网络模型、协议、各种码

1.bit与进制 &#xff08;个人理解&#xff0c;具体电路是非常复杂的&#xff09; 物理层数据流&#xff0c;bit表示物理层数据传输单位&#xff0c; 一个电路当中&#xff0c;通过通断来表示数字1和0 两个电路要通讯&#xff0c;至少要两根线&#xff0c;一根作为电势参照…

Java中使用Graphics2D绘制字符串文本自动换行 算法

效果&#xff1a; 代码&#xff1a; /*** return void* Author xia* Description //TODO 写字换行算法* Date 18:08 2021/4/1* Param []**/private static void drawWordAndLineFeed(Graphics2D g2d, Font font, String words, int wordsX, int wordsY, int wordsWidth) {FontD…

东北大学工程训练CNC加工中心(坤图)

东北大学加工中心&#xff08;CNC&#xff09;采用的系统为FANUC系统。 要求学生自主设计图样&#xff0c;编写GCODE文件&#xff0c;操作电脑使机床按设计路径铣出图案。 本人设计的图样为坤坤图 图为用CAD设计绘制的图样。 计算坐标&#xff0c;设计铣刀轨迹&#xff0c;得…

Linux--基础IO(上)

目录 1. 文件的边角知识 1.1 文件是什么&#xff1f; 1.2 文件是怎么打开的&#xff1f; 1.3 进程与文件 进程与文件的关系 2. 重温c语言文件接口 2.1 打开文件的方式 2.2 读写文件接口的重温 2.2.1 写文件 2.2.2 读文件 3. 系统文件I/O 3.1 系统接口 3.2 系…

【深度学习-第5篇】使用Python快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例(使用pytorch框架)

在之前的文章中介绍了CNN的图解入门&#xff0c;CNN的MATLAB分类实现&#xff0c;CNN的MATLAB回归实现。 卷积神经网络(Convolutional Neural Networ&#xff0c;简称CNN)是一种广泛应用于图像识别领域的深度学习算法。它通过模拟人类视觉系统的层次结构&#xff0c;可以自动提…

nginx-1.24.0 安装教程

下载nginx安装包 mkdir -p /home/app cd /home/app wget http://nginx.org/download/nginx-1.24.0.tar.gz 解压缩 tar -zxf nginx-1.24.0.tar.gz 下载nginx二进制包编译所需的工具和依赖 yum install gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -y 编译…

Arduino平衡小车

一&#xff0c;TB6612FNG电机驱动芯片 TB6612FNG是东芝半导体公司生产的一款直流电机驱动器件&#xff0c;它具有大电流MOSFET-H桥结构&#xff0c;双通道电路输出&#xff0c;可同时驱动2个电机. 参数名称参数值电压范围2.7-5.5V最大输入电压15V输出电流1.2A(平均)/3.2A&…

Vitis HLS 学习笔记--HLS入门示例集合-目录

目录 1. 示例集合概述 2. Interface 接口 2.1 Aggregation_Disaggregation 聚合与解聚 2.1.1 aggregation_of_m_axi_ports 2.1.2 aggregation_of_nested_structs 2.1.3 aggregation_of_struct 2.1.4 auto_disaggregation_of_struct 2.1.5 disaggregation_of_axis_port …

模块化 手写实现webpack

模块化 common.js 的导入导出方法&#xff1a; require \ export 和 module.exports export 和 module.export nodejs 内存1.4G -> 2.8G cjs ESModule 主要区别&#xff1a; require属于动态类型&#xff1a;加载执行 同步 esmodul是静态类型&#xff1a;引入时并不会真的去…

Autosar AP的基本构成

1. 引言 Autosar AP的体系结构是怎样的呢&#xff1f;从整体的宏观的方向上划分&#xff0c;分为 1&#xff09;应用层&#xff0c;其中放置各种应用组件SWCs。2&#xff09;运行时基本功能软件族群&#xff0c;提供基本AutoSar基本软件中间件&#xff0c;比如经典的通信服务…

【漏洞复现】云时空社会化商业ERP系统slogin SQL注入漏洞

漏洞描述&#xff1a; 云时空社会化商业ERP系统slogin存在SQL注入漏洞&#xff0c;攻击者可以通过此漏洞获取数据库敏感信息。 搜索语法: Fofa-Query: app"云时空社会化商业ERP系统" 漏洞详情&#xff1a; 1.云时空社会化商业ERP系统。 2.漏洞POC&#xff1a; …

智慧园区引领未来产业趋势:科技创新驱动园区发展,构建智慧化产业新体系

目录 一、引言 二、智慧园区引领未来产业趋势 1、产业集聚与协同发展 2、智能化生产与服务 3、绿色可持续发展 三、科技创新驱动园区发展 1、创新资源的集聚与整合 2、创新成果的转化与应用 3、创新文化的培育与弘扬 四、构建智慧化产业新体系 1、优化产业布局与结构…

JavaScript:将input标签中的内容打印到控制台

使用浏览器进行开发时&#xff0c;按F12可以查看网页信息。 目标&#xff1a;实现将input标签中的内容&#xff0c;打印到控制台&#xff08;console&#xff09; HTML页面的关键代码实现&#xff1a; 登录功能&#xff1a; HTML代码&#xff1a; <div class"form-…

Node.js 22 发布,原生支持 WebSocket 客户端

昨日&#xff0c;Node.js 官方博客正式宣布 Node.js 22 的发布&#xff01;新版本亮点包括 require() ES 模块、WebSocket 客户端、V8 JavaScript 引擎的更新等&#xff01; Node.js 22 将在 10 月进入长期支持 (LTS)&#xff0c;但在此之前&#xff0c;它将是接下来六个月的 …

【AI相关】数学和统计学知识

数学和统计学的知识可以分为两部分&#xff1a; 一部分是线性代数中的基础概念&#xff0c;比如标量、向量和张量。 另一部分是概率统计中常见的分布类型&#xff0c;比如正态分布和伯努利分布。 线性代数 什么是标量&#xff1f; 标量是一个单独的数&#xff0c;可以是整…

2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统(二)

09 电路设计 前面介绍了系统的硬件框图如下&#xff1a; 硬件基本分为三块&#xff0c;两个摄像节点&#xff0c;一个终端节点。 1. 摄像节点硬件 摄像节点由一个DE10-Nano开发板和一个D8M摄像头实现&#xff0c;DE10-Nano开发板的HDMI接口外接HDMI显示器来显示拍摄到的视频。…

vue3的getCurrentInstance获取当前组件实例

vue3的setup中没有this时需要使用getCurrentInstance()来获取。 在 Vue 3 中&#xff0c;getCurrentInstance 方法可以在组合式 API&#xff08;Composition API&#xff09;中获取当前组件实例。这个方法返回一个包含了组件实例的对象&#xff0c;你可以用它来访问组件的 pro…

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写)

文章目录 1、C API 官方文档2、初始化 MYSQL3、连接 MySQL设置连接字符集&#xff08;使得客户端编码方式匹配&#xff09; 4、下发 mysql 指令5、获取 mysql 查询结果(保存起来)获取行与列遍历存储结果 6、释放 MYSQL\_RES 对象7、关闭 MySQL 连接8、总结 1、C API 官方文档 …