黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day4 重置版 全网最全最快

news2024/9/23 3:29:19

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客

这是我的 github https://github.com/Qiuner ⭐️

gitee https://gitee.com/Qiuner 🌹

如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^)

想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎

  • 这篇有不少bug记录与方便您复制的代码,相信一定能节省学习时间同时达到更好的效果
  • 本博客要与原文档搭配使用 day04-微服务02 - 飞书云文档 (feishu.cn)
  • 这个是重置版,因为我发现有很多东西都没有讲明白,于是我又写了重置版。原版也不会删除,因为重制版不是全部照搬
  • 我这一版写的可以说是付出很多心血了,里面网关、项目差错思路,保证您一看就会😎

2024最新SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等)Day 4 重制版

项目查错思路分析

一:发现/复现问题

image-20240722084614045

  • 点击加入购物车,显示添加购物车失败,多点几个不同的,发现都失败
  • 打开控制台,发现这个500服务器内部报错
  • 项目的api是这个添加的前缀,访问什么都会有

二:查看报错

image-20240722085505069

  • 这个问题话比较简答,看报错就出来了,但很多时候开发中很多问题是没有报错的,其实我刚开始写这个项目差错分析的时候就是觉得能这个会是没有报错,,,想拿真实例子来展示下没有报错要怎么办

三:查看是否是操作不当导致问题出现

  • 因为是显示没有用户id,因此我们很容易就能想到是因为没有进行用户登录,因此导致没有传递用户id,所以检查是否是在登录的情况下进行的操作

    image-20240722090648270

  • 发现是登录下,依然还是添加失败。(这里可能存在误解,误解为不要看前端,而是要看请求是否成功)

四:定位问题代码

image-20240722084925661

  • 因为现代开发将数据处理分为了三个层,因此我们需要在能打印的时候打印出来,看看是那一步开始没有了userId
  • 但在这里,添加购物车方法,很显然没有接收userId参数

image-20240722091546504

  • 因此去服务层看看

image-20240722091713964

image-20240722091945899

  • 这个时候就可以下出判断了,这是一个微服务项目,各个模块是彼此分散的,而这里是将用户信息去上下文中去取出来,因此这是一个其他模块没有将用户存储在上下文导致的错误
    • 一层错误(表面错误): 数据库没有userId字段,无法进行查询
    • 二层错误(truth错误):网关没有将用户id在登录的时候存储好

五:仔细查看代码

image-20240722152532095

  • 这一段网关保存用户登录信息的逻辑其实挺长的,线程存储和请求头添加用户绕来绕去的
  • 文档的代码和视频代码不是完全相同的,不要照着抄

网关

什么是网关

image-20240720104847819

image-20240720104948998

  • 网关的意思 和 nat协议差不多的,不知道nat协议的可以看看我这篇博客: (写了 没发)

https://blog.csdn.net/qq_61654952/article/details/139453099?spm=1001.2014.3001.5501 (这篇解释的比较官方,看目录,在最后那边)

网关是如何实现路由转发、身份校验的?

image-20240720105545549

  • 说到这里,可能对网关会认识不全面,不明白大概是个什么样。
  • 网关其实也是一个微服务模块,这个模块实现了路由转发 身份校验等等功能,和单体项目中的拦截器是一样的

image-20240720105942113

  • 使用了网关后,对于访问者来说,所有的东西不能自由地被请求,因为有网关拦截着

image-20240720110829005

快速搭建一个网关

image-20240720164802537

image-20240720170655384

- id: item # 路由规则id,自定义,唯一
  uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表
  predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
    - Path=/items/**,/search/** # 这里是以请求路径作为判断规则
  • 当请求路径是 /items/**/search/** 时, 满足 Path 条件。符合条件的请求将会被路由从注册中心拉取 item-service 的服务列表到目标服务。
  • 路由是什么?路由在的位置比较底层,你在配置的路由地址就是路由的一部分,你在告诉路由你要做什么。而这个路由又只是整个网关模块的一部分

一些网关问题的推断方式 感谢出镜的小伙伴

  • 看到原本文章里的一个小伙伴说这个,博主虽然没有遇到这个问题,但我知道是什么引起的

推断

  • 1、首先 500 表示是服务器的问题,但服务器报出500的问题情况是多样的,仅凭一个500只能得出是服务器的问题
  • 2、在这里,是配置网关后,与使用网关的行为后报错 500,而原模块没有产生问题 因此,可以判断 问题出在网关上
  • 3、网关目前只进行了基础配置,配置了路由、端口号、nacos,显然,端口号不会出现这个问题。而nacos,出问题应该也是自己出问题,不是影响整个网关,因此定位到路由。
  • 4、根据以上得出粗略推断:路由写的有问题

网关路由配置

image-20240721085149759

路由断言

image-20240721085210143

路由过滤器

image-20240721085546122

打印为空

image-20240721090928719

  • 响应头和请求头单词长得有的像了,因此很容易分不清

网关登录校验

  • 需求描述:对请求进行登录校验,分别设在每个模块是不太合理的,因此将其设在网关层。因此,我们需要了解网关的运行过程,从而判断在哪一步编写相关登录校验

image-20240721113036032

image-20240721113445096

网关中自定义过滤器 全局和局部过滤器

image-20240721113600056

GlobalFilter全局

package com.hmall.gateway.filters;


import com.alibaba.nacos.api.naming.pojo.healthcheck.impl.Http;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // TODO 登录校验逻辑
        ServerHttpRequest request=exchange.getRequest();
        HttpHeaders headers=request.getHeaders();
        return chain.filter(exchange) ;
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

image-20240721215729326

GatewayFilter局部过滤器

image-20240721220944081

  • 这里是在创建抽象工厂,关于抽象工厂不知道的可以看我的另一篇博客

https://blog.csdn.net/qq_61654952/article/details/138126798?spm=1001.2014.3001.5501

  • 使用这个过滤器工厂,需要有FilterFactory后缀

image-20240721221754234

  • 多个参数的情况

过滤器在idea中没有输出

image-20240721222933354

  • 像视频一样刷新页面,但是没有任何提示
  • 这是因为你没有登录

image-20240721223013983

  • 你需要登录后网关才能生效

网关中传递用户(在请求中添加用户数据方式)

image-20240722083616771

image-20240722100346532

  • @ConditionalOnClass(DispatcherServlet.class 是Spring Boot中的一个条件注解,它在特定条件下有选择地加载某些配置或Bean
  • 在这个例子中注解会检查类路径中是否存在指定的类DispatcherServlet。只有当 DispatcherServlet 类存在于类路径中时,Spring才会实例化和加载标注了这个注解的配置类或Bean。

网关传递用户的核心

  • 首先在网关层中,会有一个东西负责将信息存储到请求头,存储到请求头后,这时候就分为不同的形式了,比如

image-20240722155427366

形式一:每个请求手动添加

image-20240722155853077

  • 如图,在每个方法上手动添加,捕获,然后得到userId属性

形式二:给每个模块添加一个拦截器

  • 在拦截器中将用户的id取出来

  • 这样又几个模块就需要加几个代码,也是比较麻烦

形式三:定义一个通用的拦截器(本例使用)

  • 通用拦截器可能会遇到没有sprigboot依赖的模块无法中使用会报错的问题,需要使用 @ConditionalOnClass(DispatcherServlet.class) 来检测项目是否存在springboot依赖,不存在则不生效,由此来规避报错

image-20240722161450236

AuthGlobalFilter拦截器无法打印数据而又没有任何报错

image-20240722141902257

  • 这是因为你的前端挂掉了,将前端nginx再启动然后重启一遍服务即可

  • 即我写了打印1 但是不打印1

使用OpenFeign 传递用户

image-20240722161601816

  • 之前传递的方式是用户网关登录,而没登录访问页面会跳转到登录页面,这时候自然将用户信息写进去了

  • 可是这次是交易完,需要删除购物车的商品,这时候,使用网关来进行传递商品信息就有些不妥了,当然你也可以实现用网关来传递

  • 因此,使用OpenFeign来进行用户传递

image-20240722165152069

无报错 复合bug排查解决方法思路 :在api中添加完DefaultFeignConfig等依然无法删除购物车中的商品

一:确认基础配置没有问题

image-20240722223116950

二:确认有无报错

image-20240722230622244

image-20240722230634653

  • 其他也是如此 没有任何报错

image-20240722230822222

image-20240722231102732

  • 但购物车没有删除

三:查看自己留下来的排错信息

image-20240722231342012

  • 居然没有打印,显然,没有调用,于是我们得去找是谁会来调用这个方法。
  • 因为我们使用OpenFeign来进行调用的,所以显然得去这里

image-20240723090118144

  • 同时,能发现拦截器 并没有生效

image-20240723090509771

  • 这时候就能发现关于DefaulFeignConfig的问题,多了个@Configuration的注释

image-20240723091312370

  • 去掉后,发现拦截器在运行了,但是点开购物车,发现购物车商品还是没有删除

image-20240723091404655

  • 因此判断,这是一个复合bug

四:查看这时有没有报错信息

  • 查看了一番,还是没有任何报错
  • 不过注意到

image-20240723091736596

  • 于是进行全局搜索

image-20240723091828971

image-20240723091940482

  • 修改下代码,果然是这个。那这时候我心里有了个猜测了,于是我回去听下业务逻辑

微服务02-09.网关登录校验-OpenFeign传递用户信息_哔哩哔哩_bilibili

  • 业务逻辑大概是:
    • 网关将用户信息写在请求上
    • hm-common中定义UserInfoInterceptor来获取请求中的id
    • hm-api中定义DefaultFeignConfig来从上下文中获取id
    • 在各个模块中,使用pom将其联系起来(这样模块耦合度太大了)
  • 因此,我们可以判断出这些执行的先后顺序。将所有微服务模块重启一遍,然后看具体的日志

先进行登录操作,查看有那些发出了信息

image-20240723093858590

image-20240723094000319

image-20240723094011542

image-20240723094016780

image-20240723094037318

  • 可以看到,到这一步都没什么问题

二:点击结算

image-20240723094351256

  • 这时候user露出鸡脚了,它没有查询到user_id为2的数据

image-20240723094519087

  • 去数据库一看,原来叫id不叫userid,那问题就好办了

image-20240723094906506

  • 但仔细阅读后,发现这是查地址的东西,好像是设计成找不到,然后前端来展示数据

  • 线索又一次断掉了

  • 但能发现,并没有打印删除的提示词,因此查看前端,也没有发现删除的请求,因此发现,应该是OpenFeign的问题

image-20240723115259140

  • 一番寻找,发现cart的客户端居然使用get
package com.hmall.api.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Collection;

@FeignClient("cart-service")
public interface CartClient {
    @DeleteMapping("/carts")
    void deleteCartItemByIds(@RequestParam("ids") Collection<Long> ids);
}
  • 修改后,发现还是没有删除商品

  • 百思不得其解

image-20240723120510311

  • 服务注册也没问题

image-20240723120648883

image-20240723120716274

  • 接口测试也通过

五:最终问题排查

  • 这个时候,就要开始梳理逻辑了,逻辑一梳理,数据库中的数据是原本就有的,而代码使用item_id来进行删除增加购物车中商品,因此我们去查看校对两个值

image-20240723161050377

  • 发现值也是一样的,那就先将数据库中的数据全部删除,再次添加结算

image-20240723160248160

  • 如此竟可以了
开始清理购物车商品 itemIds的值是[40305713537]
15:59:54:118 DEBUG 39592 --- [nio-8085-exec-1] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] ---> DELETE http://cart-service/carts?ids=40305713537 HTTP/1.1
15:59:54:118 DEBUG 39592 --- [nio-8085-exec-1] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] user-info: 1
15:59:54:118 DEBUG 39592 --- [nio-8085-exec-1] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] ---> END HTTP (0-byte body)
15:59:54:144 DEBUG 39592 --- [nio-8085-exec-1] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] <--- HTTP/1.1 200 (25ms)
15:59:54:144 DEBUG 39592 --- [nio-8085-exec-1] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] connection: keep-alive
15:59:54:144 DEBUG 39592 --- [nio-8085-exec-1] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] content-length: 0
15:59:54:144 DEBUG 39592 --- [nio-8085-exec-1] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] date: Tue, 23 Jul 2024 07:59:54 GMT
15:59:54:144 DEBUG 39592 --- [nio-8085-exec-1] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] keep-alive: timeout=60
15:59:54:144 DEBUG 39592 --- [nio-8085-exec-1] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] 
15:59:54:144 DEBUG 39592 --- [nio-8085-exec-1] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] <--- END HTTP (0-byte body)
我是UserInfoInterceptor 我将要把数据存储到线程中 userInfo = 1
15:59:54:235 DEBUG 39592 --- [nio-8085-exec-2] c.h.trade.mapper.OrderMapper.selectById  : ==>  Preparing: SELECT id,total_fee,payment_type,user_id,status,create_time,pay_time,consign_time,end_time,close_time,comment_time,update_time FROM `order` WHERE id=?
15:59:54:235 DEBUG 39592 --- [nio-8085-exec-2] c.h.trade.mapper.OrderMapper.selectById  : ==> Parameters: 1815658079372996609(Long)
15:59:54:243 DEBUG 39592 --- [nio-8085-exec-2] c.h.trade.mapper.OrderMapper.selectById  : <==      Total: 1
15:59:54:539  INFO 39592 --- [ent-executor-16] com.alibaba.nacos.common.remote.client   : [f9caff51-eccd-4556-bcfd-9974893d2976] Receive server push request, request = NotifySubscriberRequest, requestId = 267
15:59:54:539  INFO 39592 --- [ent-executor-16] com.alibaba.nacos.common.remote.client   : [f9caff51-eccd-4556-bcfd-9974893d2976] Ack server push request, request = NotifySubscriberRequest, requestId = 267
15:59:54:638  INFO 39592 --- [ent-executor-17] com.alibaba.nacos.common.remote.client   : [f9caff51-eccd-4556-bcfd-9974893d2976] Receive server push request, request = NotifySubscriberRequest, requestId = 268
15:59:54:638  INFO 39592 --- [ent-executor-17] com.alibaba.nacos.common.remote.client   : [f9caff51-eccd-4556-bcfd-9974893d2976] Ack server push request, request = NotifySubscriberRequest, requestId = 268
我是UserInfoInterceptor 我将要把数据存储到线程中 userInfo = 1
16:02:00:026 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] ---> GET http://item-service/items?ids=8533120 HTTP/1.1
16:02:00:027 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] user-info: 1
16:02:00:027 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] ---> END HTTP (0-byte body)
16:02:00:033 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] <--- HTTP/1.1 200 (7ms)
16:02:00:033 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] connection: keep-alive
16:02:00:033 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] content-type: application/json
16:02:00:033 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] date: Tue, 23 Jul 2024 08:02:00 GMT
16:02:00:033 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] keep-alive: timeout=60
16:02:00:033 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] transfer-encoding: chunked
16:02:00:033 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] 
16:02:00:033 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] [{"id":"8533120","name":"海尔 (Haier )LQ65H31 65英寸 4K曲面人工智能全面屏超高清LED液晶电视","price":379500,"stock":10000,"image":"https://m.360buyimg.com/mobilecms/s720x720_jfs/t1/2851/14/13998/101463/5bd9723cE81b2c299/1bfdf2d1628648e4.jpg!q70.jpg.webp","category":"曲面电视","brand":"海尔","spec":"{}","sold":0,"commentCount":0,"isAD":false,"status":1}]
16:02:00:035 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.ItemClient          : [ItemClient#queryItemByIds] <--- END HTTP (384-byte body)
16:02:00:036 DEBUG 39592 --- [nio-8085-exec-4] c.hmall.trade.mapper.OrderMapper.insert  : ==>  Preparing: INSERT INTO `order` ( id, total_fee, payment_type, user_id, status ) VALUES ( ?, ?, ?, ?, ? )
16:02:00:036 DEBUG 39592 --- [nio-8085-exec-4] c.hmall.trade.mapper.OrderMapper.insert  : ==> Parameters: 1815658607628808194(Long), 379500(Integer), 3(Integer), 1(Long), 1(Integer)
16:02:00:037 DEBUG 39592 --- [nio-8085-exec-4] c.hmall.trade.mapper.OrderMapper.insert  : <==    Updates: 1
16:02:00:038 DEBUG 39592 --- [nio-8085-exec-4] c.h.t.mapper.OrderDetailMapper.insert    : ==>  Preparing: INSERT INTO order_detail ( order_id, item_id, num, name, spec, price, image ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
16:02:00:038 DEBUG 39592 --- [nio-8085-exec-4] c.h.t.mapper.OrderDetailMapper.insert    : ==> Parameters: 1815658607628808194(Long), 8533120(Long), 1(Integer), 海尔 (Haier )LQ65H31 65英寸 4K曲面人工智能全面屏超高清LED液晶电视(String), {}(String), 379500(Integer), https://m.360buyimg.com/mobilecms/s720x720_jfs/t1/2851/14/13998/101463/5bd9723cE81b2c299/1bfdf2d1628648e4.jpg!q70.jpg.webp(String)
开始清理购物车商品 itemIds的值是[8533120]
16:02:00:040 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] ---> DELETE http://cart-service/carts?ids=8533120 HTTP/1.1
16:02:00:040 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] user-info: 1
16:02:00:040 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] ---> END HTTP (0-byte body)
16:02:00:050 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] <--- HTTP/1.1 200 (9ms)
16:02:00:051 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] connection: keep-alive
16:02:00:051 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] content-length: 0
16:02:00:051 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] date: Tue, 23 Jul 2024 08:02:00 GMT
16:02:00:051 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] keep-alive: timeout=60
16:02:00:051 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] 
16:02:00:051 DEBUG 39592 --- [nio-8085-exec-4] com.hmall.api.client.CartClient          : [CartClient#deleteCartItemByIds] <--- END HTTP (0-byte body)
  • 有理由怀疑,这个数字是个上限值之类的。

image-20240723162242194

  • 再添加一份商品,然后将item_id修改为这个数字 40305713537,点击结算后居然也行了。。。。
  • 那看来是别的字段导致无法删除某个商品,一番查看,果然发现num字段为0,该商品不可删除

配置管理

image-20240723155413197

image-20240723163418064

  • 剩下的添加配置直接看我原本的博客吧 原本博客还有个总结三种拦截器
  • https://blog.csdn.net/qq_61654952/article/details/140390388?spm=1001.2014.3001.5501

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

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

相关文章

python3.10.4——windows环境安装

python下载官网&#xff1a;https://www.python.org/downloads/ 如果安装在C盘&#xff0c;需要右键→选择“以管理员身份运行” 勾选2个按钮&#xff0c;选择自定义安装 全部选择&#xff0c;点击Next 更改安装路径 命令行检查python是否安装成功&#xff1a; 出现版本号说明…

通俗地理解主动元数据管理

元数据管理&#xff0c;是企业开展数据管理的核心基础&#xff0c;内容涉及元数据的创建&#xff0c;确定需要捕获哪些元数据&#xff0c;通过哪些工具和流程进行创建&#xff0c;继而将元数据妥善存储&#xff0c;保障安全性和可访问性&#xff0c;并不断更新维护&#xff0c;…

vue3前端开发-小兔鲜项目-使用逻辑函数拆分业务模块

vue3前端开发-小兔鲜项目-使用逻辑函数拆分业务模块&#xff01;其实就是把一些单独的业务代码组成一个js文件。抽离出去后&#xff0c;方便后面的维护。 如图&#xff0c;在一级分类下面新建一个文件夹。composables里面新建2个js文件。 分别封装之前的分类&#xff0c;和ban…

Electron 企业级开发通信与本地存储实用解决方案

背景 之前写了一篇Electron通信的方式&#xff0c;讲述了一下三者之间的通信机制&#xff0c;比较恶心&#xff0c;后来发现有个electron/remote&#xff0c; Electron 渲染进程直接调用主进程的API库electron/remote引用讲解-CSDN博客文章浏览阅读58次。remote是个老库&…

将mars3D导入自己的项目中

文章目录 Mars3D官方文档 一、打开自己的vite项目二、创建场景配置文件1.json文件路径 public\config\config.json2.创建组件定义文件路径 src\components\mars-work\mars-map.vue三、demo中引入四、必要样式 依赖文件 总结 Mars3D官方文档 一、打开自己的vite项目 我创建了一…

【Linux】安装Nacos-单机版

一、摘要 单机模式又称单例模式, 拥有所有Nacos的功能及特性&#xff0c;具有极易部署、快速启动等优点。但无法与其他节点组成集群&#xff0c;无法在节点或网络故障时提供高可用能力。单机模式同样可以使用内置Derby数据库&#xff08;默认&#xff09;和外置数据库进行存储…

爆赞!终于有大佬把网络安全零基础入门教程给讲明白了!

网络安全的一个通用定义指网络信息系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的破坏、更改、泄露&#xff0c;系统能连续、可靠、正常地运行&#xff0c;服务不中断。网络安全简单的说是在网络环境下能够识别和消除不安全因素的能力。 网络安全…

探索智能本质:技术智能的演进趋势

在人工智能的浪潮中&#xff0c;我们常常被各种技术术语和概念所包围&#xff0c;但智能的本质究竟是什么&#xff1f;香港大学计算与数据科学学院院长马毅教授&#xff0c;在第三届「知乎 AI 先行者沙龙」上的演讲&#xff0c;为我们提供了全新视角。香港大学马毅&#xff1a;…

vue3 vite 引入包报错 无法找到模块“lib-flexible/flexible.js”的声明文件

文章目录 vue3 vite 引入包报错解决方法 1解决方法 2 vue3 vite 引入包报错 无法找到模块“lib-flexible/flexible.js”的声明文件。“d:/mine/web面试/video-demo/node_modules/lib-flexible/flexible.js”隐式拥有 "any" 类型。尝试使用 npm i --save-dev types…

《昇思25天学习打卡营第23天 | 基于MobileNetv2的垃圾分类》

《昇思25天学习打卡营第23天 | 基于MobileNetv2的垃圾分类》 目录 《昇思25天学习打卡营第23天 | 基于MobileNetv2的垃圾分类》1、实验目的2、MobileNetv2模型原理介绍3、实验环境4、数据处理4.1数据准备下载data_en数据集 4.2数据加载将模块导入&#xff0c;具体如下&#xff…

k8s 公共服务

修改named.conf。修改第13行和第21行 下面是 named.rfc1912 修改位置&#xff0c;在最后 所以用cp -p 复制文件&#xff0c;保留权限 nslookup 回车&#xff0c;server是看哪个dns 在起作用 dns服务器要配置给所有公共服务节点和 k8s 节点 就在网络文件加个DNS2就行了&…

c++ - set、map、multiset、multimap容器介绍和常用接口使用

文章目录 前言一、set容器二、multiset三、map四、multimap 前言 1、set、map、 multiset、 multimap都是基于红黑树实现的容器。 2、set、multiset都使用头文件#include<set>,map、multimap都是使用头文件#include<map> 一、set容器 1、set容器的介绍 C标准库中的…

S02. 中断与异常处理

中断处理过程及保护 1、 中断处理过程 处理器根据中断向量号定位中断门描述符。中断向量号是中断描述符的索引&#xff0c;当处理器收到一个外部中断向量号后&#xff0c;它用此向量号在中断描述符表中查询对应的中断描述符&#xff0c;然后再去执行该中断描述符中的中断处理程…

谷歌浏览器跨域

首先创建谷歌浏览器快捷键 右击 属性 在C盘创建文件夹MyChromeDevUserData “C:\Program Files\Google\Chrome\Application\chrome.exe” --disable-web-security --user-data-dirC:\MyChromeDevUserData

数据结构初阶(C语言)-二叉树-顺序表建堆

一&#xff0c;堆的概念与结构 如果有⼀个关键码的集合&#xff0c;把它的所有元素按完全⼆叉树的顺序存储方式存储&#xff0c;在⼀个⼀维数组中&#xff0c;并满足&#xff1a;&#xff0c;i0,1,2...则称为小堆(或⼤堆)。将根结点最大的堆叫做最大堆或大根堆&#xff0c;根结…

调度子系统在特定时间执行

时序逻辑调度器设计模式允许您安排Simulink子系统在指定时间执行。以下模型说明了这种设计模式。 时序逻辑调度器图表包含以下逻辑&#xff1a; 时序逻辑调度器的关键行为 时序逻辑调度器图表包含两个状态&#xff0c;它们以不同的速率调度函数调用子系统A1、A2和A3的执行&…

frp反向代理的安装与配置、ftp服务的搭建及应用

1、frp简介 frp 是⼀个开源、简洁易⽤、⾼性能的内⽹穿透和反向代理软件&#xff0c;⽀持 tcp, udp, http, https等 协议。frp 项⽬官⽹是 https://github.com/fatedier/frp 2、frp⼯作原理 服务端运⾏&#xff0c;监听⼀个主端⼝&#xff0c;等待客户端的连接&#xff1b; …

基于内容的音乐推荐网站/基于ssm的音乐推荐系统/基于协同过滤推荐的音乐网站/基于vue的音乐平台

获取源码联系方式请查看文末&#x1f345; 摘 要 随着信息化时代的到来&#xff0c;系统管理都趋向于智能化、系统化&#xff0c;音乐推荐网站也不例外&#xff0c;但目前国内的有些公司仍然都使用人工管理&#xff0c;公司规模越来越大&#xff0c;同时信息量也越来越庞大&…

C++中const关键字的多方面应用

const 的基本作用 const有且只有一种作用&#xff0c;那就是限定被修饰的对象无法被修改&#xff0c;在c中&#xff0c;被const修饰的对象被看作常量&#xff0c;存储在只读存储区(.rodata)。 测试代码 const int a 5;char arr[a];对测试代码进行汇编编译 – gcc -S test.c …

机械学习—零基础学习日志(高数09——函数图形)

零基础为了学人工智能&#xff0c;真的开始复习高数 函数图像&#xff0c;开始新的学习&#xff01; 幂函数 利用函数的性质&#xff0c;以幂函数为例&#xff0c;因为单调性相同&#xff0c;利用图中的2和3公式&#xff0c;求最值问题&#xff0c;可以直接将式子进行简化。这…