文章目录

    • 1、sentinel网关限流组件
      • 1.1、route维度
      • 1.2、自定义api维度
    • 2、链路追踪技术
      • 2.1、Sleuth相关知识
      • 2.2、Sleuth入门案例
      • 2.3、Sleuth继承zipkin
      • 2.4、zipkin数据持久化
        • 2.4.1、用mysql做数据持久化
        • 2.4.2、用elasticsearch做数据持久化
    • 3、RocketMQ 消息驱动
      • 3.1、MQ简介
        • 3.1.1、MQ第一种应用场景
        • 3.1.2、MQ第二种应用场景
        • 3.1.3、MQ常见产品
      • 3.2、RocketMQ
        • 3.2.1、RocketMQ 的启动
        • 3.2.2、RocketMQ 的测试
      • 3.3、RocketMQ控制台
      • 3.4、spring微服务 + RocketMQ
        • 3.4.1、测试在微服务中 发送消息
        • 3.4.2、测试在微服务中 接收消息
        • 3.4.3、下单案例
          • shop-order 发送消息
          • shop-user 接收消息
        • 3.4.4、消息的类型
          • 普通消息
          • 顺序消息
          • 事务消息
        • 3.4.5、消息消费要注意的细节

1、sentinel网关限流组件

在这里插入图片描述
Sentinel 网关流控

  • 支持针对不同的路由和自定义的 API 分组进行流控,
  • 支持针对请求属性(如 URL 参数,Client IP,Header 等)进行流控。

Sentinel 1.6.3 引入了网关Gateway 的流控控制台的支持,

  • route维度 :用户可以直接在 Sentinel 控制台上查看 API Gateway 实时的 route

    也就是对单个路由进行限流在这里插入图片描述

  • 自定义api维度:用户自定义 API 分组监控,管理网关规则和 API 分组配置。

    对路由进行分组限流

1.1、route维度

第一步,在api-gateway微服务中加入依赖

        <!-- 限流插件 --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-spring-cloud-gateway-adapter</artifactId></dependency>

第二步,编写配置类GatewayConfiguration.java

import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.reactive.result.view.ViewResolver;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;
import java.util.*;@Configuration
public class GatewayConfiguration {private final List<ViewResolver> viewResolvers;private final ServerCodecConfigurer serverCodecConfigurer;public GatewayConfiguration(ObjectProvider<List<ViewResolver>> olv, ServerCodecConfigurer serverCodecConfigurer) {this.viewResolvers = olv.getIfAvailable(Collections::emptyList);this.serverCodecConfigurer = serverCodecConfigurer;}// 初始化一个限流的过滤器@Bean@Order(Ordered.HIGHEST_PRECEDENCE)public GlobalFilter sentinelGatewayFilter(){return new SentinelGatewayFilter();}// 配置初始化限流参数@PostConstructpublic void initGatewayRules(){Set<GatewayFlowRule> rules = new HashSet<>();rules.add(new GatewayFlowRule("product_route")   // 路由ID.setCount(1)         // 限流阈值.setIntervalSec(1)   // 统计时间窗口,单位秒);GatewayRuleManager.loadRules(rules);}// 限流异常处理器@Bean@Order(Ordered.HIGHEST_PRECEDENCE)public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler(){return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);}// 自定义异常页面@PostConstructpublic void initBlockHandlers(){BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {Map map = new HashMap<>();map.put("code",0);map.put("message","接口被限流了");return ServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON_UTF8).body(BodyInserters.fromObject(map));}};GatewayCallbackManager.setBlockHandler(blockRequestHandler);}
}

重启OrderApplication 、ProductApplication、ApiGatewayApplication
访问时一秒内快速刷新多次页面,就会出现限流
在这里插入图片描述
我们在yaml配置文件配置一个order的路由
在这里插入图片描述

        - id: order_routeuri: lb://service-orderorder: 1predicates:- Path=/order-serv/**filters:- StripPrefix=1

再访问order试试,发现它没被限流
在这里插入图片描述
网关流控实现原理
在这里插入图片描述

1.2、自定义api维度

自定义api分组其实是一种更细腻度的限流规则

在GatewayConfiguration.java下面继续添加方法initCustomizedApis(){}

    // 自定义API分组public void initCustomizedApis(){Set<ApiDefinition> definitions = new HashSet<>();ApiDefinition api1 = new ApiDefinition("product_api1").setPredicateItems(new HashSet<ApiPredicateItem>(){{// 以/product_serv/product/api1add(new ApiPathPredicateItem().setPattern("/product-serv/product/api1/**").setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));}});ApiDefinition api2 = new ApiDefinition("product_api2").setPredicateItems(new HashSet<ApiPredicateItem>(){{// 以/product_serv/product/api1add(new ApiPathPredicateItem().setPattern("/product-serv/product/api2/demo1"));}});definitions.add(api1);definitions.add(api2);GatewayApiDefinitionManager.loadApiDefinitions(definitions);}

再往public void initGatewayRules()里面添加限流规则

        Set<GatewayFlowRule> rules = new HashSet<>();rules.add(new GatewayFlowRule("product_api1").setCount(1).setIntervalSec(1));rules.add(new GatewayFlowRule("product_api2").setCount(1).setIntervalSec(1));GatewayRuleManager.loadRules(rules);

GatewayConfiguration.java完整代码

import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.reactive.result.view.ViewResolver;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;
import java.util.*;@Configuration
public class GatewayConfiguration {private final List<ViewResolver> viewResolvers;private final ServerCodecConfigurer serverCodecConfigurer;public GatewayConfiguration(List<ViewResolver> viewResolvers, ServerCodecConfigurer serverCodecConfigurer) {this.viewResolvers = viewResolvers;this.serverCodecConfigurer = serverCodecConfigurer;}// 初始化一个限流的过滤器@Bean@Order(Ordered.HIGHEST_PRECEDENCE)public GlobalFilter sentinelGatewayFilter() {return new SentinelGatewayFilter();}// 配置初始化限流参数@PostConstructpublic void initGatewayRules() {
//        Set<GatewayFlowRule> rules = new HashSet<>();
//        rules.add(
//                new GatewayFlowRule("product_route")   // 路由ID
//                        .setCount(1)         // 限流阈值
//                        .setIntervalSec(1)   // 统计时间窗口,单位秒
//        );
//        GatewayRuleManager.loadRules(rules);Set<GatewayFlowRule> rules = new HashSet<>();// 限制访问数量 1,时间1秒rules.add(newGatewayFlowRule("product_api1").setCount(1).setIntervalSec(1));// 限制访问数量 1,时间1秒rules.add(newGatewayFlowRule("product_api2").setCount(1).setIntervalSec(1));GatewayRuleManager.loadRules(rules);}// 限流异常处理器@Bean@Order(Ordered.HIGHEST_PRECEDENCE)public SentinelGatewayBlockExceptionHandlersentinelGatewayBlockExceptionHandler() {return new SentinelGatewayBlockExceptionHandler(viewResolvers,serverCodecConfigurer);}// 自定义异常页面@PostConstructpublic void initBlockHandlers() {BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {public Mono<ServerResponse> handleRequest(ServerWebExchangeserverWebExchange, Throwable throwable) {System.out.println("限流提醒");Map map = new HashMap<>();map.put("code", 0);map.put("message", "接口被限流了");return ServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON_UTF8).body(BodyInserters.fromObject(map));}};GatewayCallbackManager.setBlockHandler(blockRequestHandler);}// 自定义API分组@PostConstructprivate void initCustomizedApis() {System.out.println("自定义API分组,这个方法");Set<ApiDefinition> definitions = new HashSet<>();ApiDefinition api1 = new ApiDefinition("product_api1").setPredicateItems(new HashSet<ApiPredicateItem>() {{// 以/product-serv/product/api1/ 开头的请求add(new ApiPathPredicateItem().setPattern("/product-serv/product/api1/**").setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));}});ApiDefinition api2 = new ApiDefinition("product_api2").setPredicateItems(new HashSet<ApiPredicateItem>() {{// 以/product-serv/product/api2/demo1 完整的url路径匹配add(new ApiPathPredicateItem().setPattern("/product-serv/product/api2/demo1/"));}});definitions.add(api1);definitions.add(api2);GatewayApiDefinitionManager.loadApiDefinitions(definitions);}
}

这里可能会报如下错误,不用管,编译不会出错
在这里插入图片描述

接下来模拟api1的路径,shop-product里面
ProductController.java

    @RequestMapping("/product/api1/demo1/")public String demo1(){return "api1/demo1";}@RequestMapping("/product/api1/demo2/")public String demo2(){return "api1/demo2";}@RequestMapping("/product/api2/demo1/")public String demo3(){return "api2/demo1";}@RequestMapping("/product/api2/demo2/")public String demo4(){return "api2/demo2";}

在这里插入图片描述
接下来就可以重启api-gateway了
重启之前先改一下配置文件
在这里插入图片描述
关闭全局过滤器AuthGlobalFilter.java
在这里插入图片描述

重启ApiGatewayApplication、ProductApplication
在这里插入图片描述
访问http://localhost:7000/product-serv/product/api1/demo1/

在这里插入图片描述
连续刷新
在这里插入图片描述
访问
在这里插入图片描述
连续刷新

在这里插入图片描述
http://localhost:7000/product-serv/product/api2/demo2/ 不会被限流,不管刷新多少次。

2、链路追踪技术

如下图,目前我们访问如下网址,它是从网关到订单再到商品这么一个流程。
在这里插入图片描述
它链路如下图
在这里插入图片描述
现在我们要之际追踪这个链路,看看整个链路上哪儿最耗时。

链路追踪技术可以解决的问题:

  • 快速发现链路中的问题
  • 判断故障影响范围
  • 梳理服务依赖,及依赖合理性
  • 分析链路性能问题及实时容量规划

常见的链路追踪技术:

  • cat:由大众点评基于java开发,通过埋点方式监控、对代码侵入很大。
  • zipkin:开源的分布式的跟踪系统,结合spring-cloud-sleuth使用,功能简单。
  • pinpoint:基于字节码注入,接入端无代码侵入。
  • skyWalking:本土开源的基于字节码注入的调用链分析,接入端无代码侵入,ui功能强。
  • Sleuth:springCloud提供的分布式系统中的链路追踪解决方案。

注意:springcloud alibaba技术栈中并没有提供自己的网关,我们可以采用Sleuth来做链路追踪解决方案。

所以我们使用Sleuth的时候:是先使用Sleuth做链路追踪,然后把信息输出给zipkin,zipkin进行数据的存储、收集、展示、查找。

2.1、Sleuth相关知识

相关术语:

  • Trace:一条链路,Trace id 链路的唯一标识。
  • Span:链路上的一个单元,Span id单元的唯一标识。
  • Annotation:记录一段时间内的事件,内部使用的重要注释
    • cs :客户端发出请求时
    • sr :服务端接收到请求时,sr-cs = 网络延迟(服务调用时间)
    • ss : 服务端处理完毕准备发送到客户端时,ss-sr = 服务器处理的时间
    • cr :客户端接收到服务端的响应时,cr-sr = 请求的总时间

在这里插入图片描述

2.2、Sleuth入门案例

第一步加入依赖

因为我们每个一个微服务都应该拥有Sleuth,所以我们将依赖加入到父工程的pom.xml中

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency></dependencies>

在这里插入图片描述

这里顺便展示一下父工程的pom.xml到目前的所有内容

<?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"><modelVersion>4.0.0</modelVersion><groupId>com.haha</groupId><artifactId>mycloud</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>shop-common</module><module>shop-user</module><module>shop-product</module><module>shop-order</module><module>api-gateway</module></modules><!-- 父工程 --><parent><groupId>org.springframework.boot</groupId><version>2.1.13.RELEASE</version><artifactId>spring-boot-starter-parent</artifactId></parent><!-- 版本依赖的锁定 --><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-cloud.version>Greenwich.RELEASE</spring-cloud.version><spring-cloud-alibaba.version>2.1.3.RELEASE</spring-cloud-alibaba.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency></dependencies>
</project>

然后把所有微服务都停掉,再重开如下三个微服务
在这里插入图片描述
接下来我们访问一下http://localhost:7000/order-serv/order/prod/1
然后再查看后台,sleuth相关的日志就被打印出来了
在这里插入图片描述
在这里插入图片描述
现在我们使用zipkin输出链路结果

2.3、Sleuth继承zipkin

zipkin提供一个管理、展示的ui界面。
zipkin分为两个端:服务端(jar包)、客户端(注入依赖)。
在这里插入图片描述
第一步,下载服务端jar包

https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec

启动指令

java -jar zipkin-server-2.12.9-exec.jar

web界面

http://localhost:9411/zipkin/

第二步,客户端加入依赖
我们也直接放在客户端的主项目pom.xml中

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId></dependency>

然后在api-gateway添加配置

spring:zipkin:base-url: http://127.0.0.1:9411/   #zipkin server的请求地址discovery-client-enabled: false    #让nacos把他当成一个URL,而不要当做服务名sleuth:sampler:probability: 1.0   #采样的百分比

在这里插入图片描述
在shop-order、shop-pruduct里面也加上如上配置
配置完成把三个微服务重启
然后访问http://localhost:7000/order-serv/order/prod/2

首先我们看到的后台打印的链路第三方输出已经开启了
在这里插入图片描述
然后在zipkin的后台界面可以看到结果
在这里插入图片描述
点击其中一次请求的数据可以看到具体信息
在这里插入图片描述

2.4、zipkin数据持久化

zipkin服务端停止后所有的数据都会丢掉,下面我们将其存在mysql中

2.4.1、用mysql做数据持久化

第一步,创建mysql的数据环境
首先创建一个叫zipkin的库,然后执行以下代码建表

CREATE TABLE IF NOT EXISTS zipkin_spans (`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` BIGINT NOT NULL,`id` BIGINT NOT NULL,`name` VARCHAR(255) NOT NULL,`parent_id` BIGINT,`debug` BIT(1),`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';CREATE TABLE IF NOT EXISTS zipkin_annotations (`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';CREATE TABLE IF NOT EXISTS zipkin_dependencies (`day` DATE NOT NULL,`parent` VARCHAR(255) NOT NULL,`child` VARCHAR(255) NOT NULL,`call_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

第二步,重启zipkin服务端,

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=root --MYSQL_DB=zipkin

注意如上代码包含了mysql的账号密码

这样数据就能持久化了

2.4.2、用elasticsearch做数据持久化

elasticsearch下载地址:

https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-8-4

下载完启动,双击elasticsearch.bat就可以启动
在这里插入图片描述
然后重启zipkin客户端
在这里插入图片描述

3、RocketMQ 消息驱动

3.1、MQ简介

MQ : 跨进程的通信机制,用于传递消息。是一种先进先出的数据结构。

在这里插入图片描述

3.1.1、MQ第一种应用场景

先来看看MQ对传统的用户注册的优化
在这里插入图片描述
在这里插入图片描述

3.1.2、MQ第二种应用场景

在针对一些大流量、暴增流量进入系统后,可以利用MQ进行流量削峰。
在这里插入图片描述

3.1.3、MQ常见产品

  • ZeroMQ:号称最快的消息队列系统,c语言开发,适应它需要开发大量代码,且它仅提供非持久性队列。
  • RabbitMQ:使用erlang开发,性能好,但不利于二次开发和维护
  • ActiveMQ:实现了JMS1.1规范,可以和spring-jms轻松融合,可以持久化,对队列数较多支持情况不好。
  • RocketMQ:阿里巴巴的MQ中间间,Java开发,性能好,能够撑住双十一的大流量。
  • Kafka:apache下的一个子项目,高性能分布式消息队列系统,相对于ActiveMQ是一个轻量级的。

3.2、RocketMQ

在这里插入图片描述
名词解释:

  • Broker:核心,负责消息的接收、存储、投递等。相当于邮递员
  • NameServer:Broker向它注册路由信息,同时Producker和Consumer向其获取路由信息。相当于邮局
  • Producer:消息生产者。相当于发件人
  • Consumer:消息消费者。相当于收件人
  • Topic: 用来区分不同类型的消息,发送和接收消息前都需要创建Topic。相当于地区
  • Message Queue: 一个Topic里面有多个Message Queue,消息可以并行往各个Message Queue发消息,消费者可以并行从多个Message Queue读消息。相当于邮件
  • message:消息的载体。相当于邮件里的内容。
  • Producer Group:生产组
  • Consumer Group:消费组

3.2.1、RocketMQ 的启动

下载RocketMQ

RocketMQ官网:http://rocketmq.apache.org/

在这里插入图片描述
下载二进制包
在这里插入图片描述
环境要求

  • Linux 64位操作系统
  • jdk 1.8+

1、上传文件到linux系统,解压并移动到安装目录

在这里插入图片描述

2、切换到安装目录rocketmq,启动NameServer
在这里插入图片描述

查看是否启动成功:netstat -an | grep 9876
9876是监听的端口

3、启动Broker
在这里插入图片描述
在这里插入图片描述

然后就可以测试RocketMQ了

3.2.2、RocketMQ 的测试

1、测试消息发送
在这里插入图片描述
在这里插入图片描述
2、测试消息接收
在这里插入图片描述
在这里插入图片描述

3.3、RocketMQ控制台

安装RocketMQ控制台
1、下载
在这里插入图片描述
在这里插入图片描述
下载完解压,我们发现它是一个maven工程,接下来我们只需要用maven命令进行打包,然后运行

2、修改配置文件
在这里插入图片描述
在这里插入图片描述

3、打包成jar,并启动
在这里插入图片描述

打包过程可能会联网下载很多依赖,需要耐心等待

4、访问localhost:7777
在这里插入图片描述

3.4、spring微服务 + RocketMQ

3.4.1、测试在微服务中 发送消息

在这里插入图片描述
首先往生成者中加入依赖
在这里插入图片描述
接下来在shop-order的test中建一个测试发送消息的类
在这里插入图片描述

如上代码中,注意ip地址

然后启动这个测试类
在这里插入图片描述
在web界面就可以看到
在这里插入图片描述

3.4.2、测试在微服务中 接收消息

在这里插入图片描述
还是在shop-order的test中建一个测试接收消息的类
在这里插入图片描述
启动这个测试类
在这里插入图片描述
再点击一下消息生产者
在这里插入图片描述
在这里插入图片描述

3.4.3、下单案例

案例:用户下单,下单成功后向用户发送短信
在这里插入图片描述

shop-order 发送消息

1、在shop-order中添加rocketmq的依赖
在这里插入图片描述
2、添加配置
在这里插入图片描述
3、在OrderController中找到下单成功地方,向mq中投递下单成功的消息
先注入一个RocketMQTemplate
在这里插入图片描述
再投递消息
在这里插入图片描述
然后重启order微服务,并访问
在这里插入图片描述
再看一下后台有没有收到消息:localhost:7777
在这里插入图片描述
点击消息详情,就能看到消息已经过来了
在这里插入图片描述

shop-user 接收消息

1、在shop-user中加入依赖
在这里插入图片描述
2、在UserApplication.java中加入注解

在这里插入图片描述
3、修改配置
在这里插入图片描述

4、写一个实现类,消费消息
在这里插入图片描述
然后启动UserApplication.java
再重新下一个订单
在这里插入图片描述
再查看后台,就发现已经接收了一个消息
在这里插入图片描述

3.4.4、消息的类型

普通消息

RocketMQ提供三种方式来发送普通消息:可靠同步发送、可靠异步发送、单向发送

  • 可靠同步发送:一个消息结束后才发下一个消息
    在这里插入图片描述
  • 可靠异步发送:一个消息发送,不管结没结束,下一个接着发
    在这里插入图片描述
  • 单向发送:发送了不管服务器接到与否
    在这里插入图片描述
    可靠同步发送例:
    1、添加依赖到shop-order中
    在这里插入图片描述
    写一个测试类:
    在这里插入图片描述
    启动这个测试类:同步消息成功发送
    在这里插入图片描述
    我们可以在web中看到这个消息的主题“test-topic-1”
    在这里插入图片描述
    添加一个标签:直接在主题后面 ” :标签 “

在这里插入图片描述
然后再重发一条消息(重新启动这个test方法)
在这里插入图片描述
可靠异步发送例:

还是在刚刚那个测试类里面,新建一个测试方法testAsyncSend()

如上Thread.sleep(300000),是为了让回调方法onSuccess成功回调,否则程序执行完就直接结束了。
启动该测试方法
在这里插入图片描述
在Rocketmq页面查看
在这里插入图片描述
单向发送例:
还是在刚刚那个测试类里面,新建一个测试方法testOneWay(){}
在这里插入图片描述
启动该测试方法
在这里插入图片描述

顺序消息

Rocketmq本身是不保证消息的顺序的
Rocketmq会把消息随机放到一个Message Queue里面,消费者也是随机取。
那顺序消息是怎么实现的呢?
顺序消息是把需要排序的消息放在同一个Message Queue里面,就有了顺序了。
在这里插入图片描述
我们先来看看MQ的各个主体的状态
在这里插入图片描述
然后,我们以单向消息为例,发送10个消息,观察每个消息都落在了哪个Message Queue里面
在这里插入图片描述
启动这个测试方法,再查看主题test-topic-1的状态
在这里插入图片描述
我们发现每个Message Queue里面都有新加入的消息
接下来我们发送顺序消息(只需要使用sendOneWayOrderly方法就可以了)
在这里插入图片描述
上面的sendOneWayOrderly的第三个参数hashKey的作用是用来决定这些消息发送到哪个队列上的
启动该测试方法
查看结果
在这里插入图片描述
我们发现都落在了第一个队列上了
同样的,除了单向消息有Orderly,其他的同步、异步消息也都有

事务消息

在这里插入图片描述
在这里插入图片描述
第一步:发送半事务消息
在shop-order里面新建一个OrderServiceImpl4.java
在这里插入图片描述
第二步是服务端接收半事务消息(不需要我们写什么代码),发送成功后,消息方接收到成功的消息,进行第三步执行本地事务。
先在OrderServiceImpl4.java中写一个本地事务
在这里插入图片描述
再单独新建一个OrderServiceImpl4Listener.java(第三步执行本地事务)
在这里插入图片描述
在这里插入图片描述

接下来第四步,提交一个Commit或Rollback
在这里插入图片描述
第五步消息回查
在这里插入图片描述
为了记录消息回查的成功失败,我们需要建立一张表
在shop-common这个微服务里面新增实体类TxLog.java
在这里插入图片描述
在shop-order里添加TxLogDao.java
在这里插入图片描述
消息的成功与失败实际上是本地事务控制的,所以我们在OrderServiceImpl4.java的createOrder方法里面插入TxLog
首先自动注入TxLogDao
在这里插入图片描述
插入一条TxLog前,需要为TxLog设置一个TxId,我们用uuid取一个值
在这里插入图片描述
在OrderServiceImpl4Listener.java中拿到这个TxId,并通过orderServiceImpl4.createOrder传过去
在这里插入图片描述
在这里插入图片描述
最后在消息回查函数里,就可以查到数据库里记录的成功与否
在这里插入图片描述
在这里插入图片描述
最后需要注意OrderServiceImpl4Listener.java上需要加这个注解
在这里插入图片描述
接下来写一个调用的代码
在shop-order微服务里面新建一个OrderController4.java
在这里插入图片描述
然后重启product、order
接下来访问一个连接
在这里插入图片描述

3.4.5、消息消费要注意的细节

在这里插入图片描述
在这里插入图片描述
我们新建一个SmsService.java举例
在这里插入图片描述

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

相关文章

  1. 阿里云技术团队原创力作震撼上市,强力解析云上Kubernetes!

    5G、AI等新技术的突破&#xff0c;使云计算的应用进入了一个全新阶段。 作为一名IT小编&#xff0c;博文菌给大家推荐过很多优秀的“云”相关图书。但今天这一套&#xff0c;还是让小编忍不住疯狂给它眼神&#xff01; 这就是博文视点联合阿里云技术团队&#xff0c;为广大IT技…...

    2024/4/23 16:31:56
  2. Seata1.4.0分布式事务解决方案研究分享

    微服务流行的时代&#xff0c;解决了很多企业的业务问题&#xff0c;也带来的一些技术问题&#xff0c;例如最常见的分布式事务问题。当Seata的出现&#xff0c;分布式事务迎刃而解。Seata设计思想官网(http://seata.io/zh-cn/index.html)有详细的介绍&#xff0c;此处不再赘述…...

    2024/4/7 22:12:30
  3. clickhouse配置项system.settings详解

    调研学习clickhouse&#xff0c;上一章介绍了clickhouse的配置项users.xml&#xff0c;这一章介绍另一大项config.xml 从clickhouse的官网看&#xff0c;clickhouse的配置参数主要分了两大方面&#xff0c;一个是config.xml中的服务器配置参数&#xff08;Server Settings&…...

    2024/4/7 12:20:17
  4. 学习JavaScript高级第三天(数据类型转换、变量提升)

    学习JavaScript 高级第三天&#xff08;数据类型转换、变量提升&#xff09; // --------数据类型转换的4大核心标准-------- /* * 把其他数据类型转为 Number 类型1、需要特定转化为 Number 的 Number(val) parseInt/parseFloat(val)2、隐式转换&#xff08;浏览器内部默认要…...

    2024/4/7 4:23:59
  5. 公众号的外部链接

    后端需要前端提供外部链接进行测试&#xff0c;外部链接就是在mounted里写 var url window.location.href; 再加上域名前缀。...

    2024/4/23 11:43:29
  6. 后端开发面试题(二)Hibernate篇

    文章目录1、Hibernate 中对象的三种状态及如何切换1.1 三种状态介绍1.2 三种状态的切换2、Hibernate 的缓存机制2.1 Hibernate缓存原理2.2 Hibernate的一、二级缓存策略2.3 二级缓存的使用2.4 常用的二级缓存插件3、Hibernate 的查询方式有哪些3.1 HQL3.2 QBC3.3 原生SQL4、Hib…...

    2024/4/7 14:03:39
  7. 装备作战需求论证质量效能评估系统软件设计解决方案

    装备作战需求论证质量效能评估系统软件设计解决方案 装备作战效能评估系统是为解决武器装备效能评估问题新研发的一款软件&#xff0c;武器效能评估系统用于武器装备论证、研制、试验、使用等不同阶段的效能评估&#xff0c;武器效能评估系统为作战体系、装备体系评价和优化提…...

    2024/4/7 12:55:17
  8. React 事件处理笔记

    需要注意的两点&#xff1a;1.需要在事件绑定的函数中获取事件对象 2.事件绑定函数中的this指向问题 疑惑点&#xff1a;什么是public class fields语法 一、事件对象作为参数传递 事件绑定的函数没有传参 function ActionLink() {function handleClick(e) { // 默认…...

    2024/4/7 15:28:32
  9. 如何快速搭建知识付费平台

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201125101621524.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NTWTk1NDkxNzkxOQ,size_16,color_FFFFFF,t_70#pic_center)现如今在互联网知识付费的高速催…...

    2024/4/7 9:42:39
  10. Android -- 让我一个外行来告诉你Android的多Activity切换中保持Socket长连接的一个实现方法

    内容预览零、感 叹 啊一、说 明二、实现功能与效果图2.1、实现功能描述2.2、效果图显示三、主要实现功能的代码3.1、Project 的文件列表3.2、ApplicationUtil.java类3.3、MainActivity.java类与activity_main.xml3.4、FirstActivity.java类与activity_first.xml3.5、AndroidMan…...

    2024/4/17 6:41:12
  11. 【疑难排查】RTMP推流协议视频智能分析平台EasyDSS直播点播系统开启录像后无法录制

    TSINGSEE青犀视频云边端架构视频智能分析平台EasyDSS提供直播版和点播版的授权&#xff0c;近期研发人员测试EasyDSS最新版本时&#xff0c;开启了录像计划之后&#xff0c;直播视频可以正常播放&#xff0c;但是查看录像的时候没有录像。 我们检查了录像的存储&#xff0c;发现…...

    2024/4/9 5:53:45
  12. 正则表达式学习

    1-8位数字截取匹配和整体匹配 Regex re new Regex("^[0-9]{1,8}"); //截取匹配 Regex regex new Regex("^[0-9]{1,8}$"); //整体匹配//匹配字符串:m1.large(vcpu 2,ram 4G)|c95f5529-47e8-46d4-85da-319eb9905a9b. //目标字符串:vcpu&#xff1a; “2”…...

    2024/4/9 14:12:04
  13. Armadillo(六):rand,randn,randnu的对应关系

    matlab的rand:产生【0,1】的均匀分布伪随机数 Armadillo的randu&#xff1a;在[0,1]间隔中使用均匀分布 matlab的randn:生成标准正态分布的伪随机数&#xff08;均值为0&#xff0c;方差为1&#xff09; Armadillo的randn:使用正态/高斯分布&#xff0c;均值和单位方差为零...

    2024/4/9 20:33:35
  14. 计算机网络 数据传输(二)

    1、数据传输类型 电路交换&#xff0c;报文交换&#xff0c;分组交换 互联网采用的是分组交换 电路传输 代表&#xff1a;电话网 电路交换的三个阶段 1、建立连接&#xff08;电路建立&#xff09; 2、通信 3、释放连接 特点&#xff1a;独占资源 中继线是可以共用的 …...

    2024/4/9 18:25:12
  15. spring boot 1.5.3 源代码片段 - @Validated - EnableAutoConfiguration

    机制&#xff1a;依赖 BeanPostProcessor advisor // org.springframework.boot.autoconfigure.EnableAutoConfiguration\ org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration /*注册 org.springframework.validation.beanvalidation.MethodVal…...

    2024/4/9 8:20:45
  16. 用Session和Cookie区分不同用户

    用Session和Cookie区分不同用户...

    2024/4/9 11:34:54
  17. 判断数组、对象为空

    1、判断数组为空 if(arr.length0){console.log(空)// 数组arr为空}2、判断对象为空 var obj {};if(JSON.stringify(obj) "{}"){console.log(空)}或用es6间接证明 利用对象在中所有的键&#xff0c;组成数组并判断数组是否为空&#xff0c;如&#xff1a; const ob…...

    2024/4/9 9:06:33
  18. JAVA(基础) 面向对象一

    JAVA(基础) 面向对象一 前面我们学习的是面向过程&#xff0c;现在我们来学习面向对象。面向过程就好比一件事自己一步步去完成&#xff0c;而面向对象则是找人去完成这件事&#xff0c;具体这件事是怎样做的&#xff0c;我们不在乎&#xff0c;我们只在乎结果。面向对象依托于…...

    2024/4/9 21:09:02
  19. 中国风冬日节日必备梅花PNG免扣素材

    随着中国国际地位日益提高&#xff0c;新生代在国家日益强健的环境下成长起来&#xff0c;整体国民素质大大提 高&#xff0c;民族自信和民族自豪感根深于大家的心里。冬日传统中国节日接踵而来&#xff0c;特具中国特色的 水墨风梅花PNG素材&#xff0c;设计师请提前收藏好&…...

    2024/4/9 20:05:04
  20. 数据安全不仅仅局限于技术

    数字商业环境带来了巨大的机遇&#xff0c;同时也带来了针对重要商业数据资产的数据泄露风险。这些数据是决策、持续经营、市场竞争力和法规遵从性的重要组成部分。 由于业务数据中包含如此多的价值&#xff0c;针对企业“皇冠上的宝石”的威胁和攻击变得更加复杂和有针对性。…...

    2024/4/9 7:30:44

最新文章

  1. 服务器基础知识(1)

    &#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;服务器❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 1、什么是服务器 服务器是计算机的一种&#xff0c;它比普通计算机运行更快、负载更高、价格更贵。服务…...

    2024/4/23 17:04:23
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 《前端防坑》- JS基础 - 你觉得typeof nullValue === null 么?

    问题 JS原始类型有6种Undefined, Null, Number, String, Boolean, Symbol共6种。 在对原始类型使用typeof进行判断时, typeof stringValue string typeof numberValue number 如果一个变量(nullValue)的值为null&#xff0c;那么typeof nullValue "?" const u …...

    2024/4/22 15:54:28
  4. 利用Spark将Kafka数据流写入HDFS

    利用Spark将Kafka数据流写入HDFS 在当今的大数据时代&#xff0c;实时数据处理和分析变得越来越重要。Apache Kafka作为一个分布式流处理平台&#xff0c;已经成为处理实时数据的事实标准。而Apache Spark则是一个强大的大数据处理框架&#xff0c;它提供了对数据进行复杂处理…...

    2024/4/22 7:35:23
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/22 23:19:42
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/23 0:57:45
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/23 9:32:47
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/23 9:32:46
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/23 9:23:51
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/23 9:32:46
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/23 9:32:45
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/23 9:32:45
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/23 6:07:03
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/23 9:32:44
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/23 9:32:44
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/23 9:32:44
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/23 0:54:52
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/23 0:54:31
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/23 9:32:42
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/23 9:32:42
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/23 9:32:41
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/23 9:32:41
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/22 18:18:53
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/23 0:52:04
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57