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

你好,我是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 {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// TODO 登录校验逻辑ServerHttpRequest request=exchange.getRequest();HttpHeaders headers=request.getHeaders();return chain.filter(exchange) ;}@Overridepublic 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.mzph.cn/diannao/49191.shtml

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

相关文章

UniCAVE实现融合输出或多屏输出

介绍 CAVE沉浸式系统包含单主机多屏和多主机多屏两种系统架构。此文档主要介绍融合输出与单机多屏输出&#xff0c;这两种方式都属于单主机多屏。均以使用UniCAVE输出到前左右下为例。引用的Package为UniCAVE2019。 融合输出 实现原理 &#xff08;猜测&#xff09;是将多块…

2024春秋杯网络安全联赛夏季赛Crypto(AK)解题思路及用到的软件

2024春秋杯网络安全联赛夏季赛Crypto(AK) 2024春秋杯网络安全联赛夏季赛Crypto解题思路以及用到的软件 所有题用到的软件 1.vm(虚拟机kali)和Ubuntu&#xff0c;正常配置即可B站有很多。 2.Visual Studio Code(里面要配置python&#xff0c;crypto库和Sagemath数学软件系统S…

基于微信小程序+SpringBoot+Vue的青少年科普教学系统平台(带1w+文档)

基于微信小程序SpringBootVue的青少年科普教学系统平台(带1w文档) 基于微信小程序SpringBootVue的青少年科普教学系统平台(带1w文档) 这个工具就是解决上述问题的最好的解决方案。它不仅可以实时完成信息处理&#xff0c;还缩短高校教师成果信息管理流程&#xff0c;使其系统化…

LINUX之MMC子系统分析

目录 1. 概念1.1 MMC卡1.2 SD卡1.3 SDIO 2. 总线协议2.1 协议2.2 一般协议2.3 写数据2.4 读数据2.5 卡模式2.5.1 SD卡模式2.5.2 eMMC模式 2.6 命令2.6.1 命令类2.6.2 详细命令 2.7 应答2.8 寄存器2.8.1 OCR2.8.2 CID2.8.3 CSD2.8.4 RCA2.8.5 扩展CSD 3. 关键结构3.1 struct sdh…

数学建模(7)——Logistic模型

一、马尔萨斯人口模型 import numpy as np import matplotlib.pyplot as plt# 初始人口 N0 100 # 人口增长率 r 0.02 # 时间段&#xff08;年&#xff09; t np.linspace(0, 200, 200)# 马尔萨斯人口模型 N N0 * np.exp(r * t)# 绘图 plt.plot(t, N, labelPopulation) plt.…

【数据结构】堆的实现以及建堆算法和堆排序

【数据结构】堆的实现以及建堆算法和堆排序 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;数据结构 文章目录 【数据结构】堆的实现以及建堆算法和堆排序前言一.堆的实现1.1 堆数据的插入1.2堆数据的删除 二.建堆算法和堆排序2.1思路分析2.…

java的转义字符,注释和代码规范

目录 1.Java运行机制 Java开发快速入门 Java开发注意事项和细节说明 Java学习方法 2.Java的转义字符 Java常用的转义字符 代码示例&#xff1a; 转义字符练习 3.初学java易犯错误 4.注释&#xff08;comment&#xff09; 单行注释与多行注释 文档注释 5.Java代码规…

Spark轨迹大数据处理_scalaSpark代码实两个GIS点(经纬度点)之间的方位角计算

终于有时间来搞一搞这个专栏了 首先声明一下 1、我这个代码是基于一个简化方位角模型&#xff0c;忽略了地球的曲率&#xff0c;适用于距离相对较短的距离。因为业务相关&#xff0c;这个方位角两个点的距离计算不会超过1000km。 2、我这个方位角的计算逻辑&#xff1a;是从一…

使用Top进行设备性能分析思路

Top命令 像windows一样&#xff0c;linux也有一个“进程管理”&#xff0c;可以在命令行执行 top &#xff0c;就可以整体的查看当前机器的资源及进程情况。 在性能问题中&#xff0c;Top是使用较多的一个命令&#xff0c;一般用它可以从整体上了解系统的CPU、内存、IO情况&am…

MongoDB教程(十七):MongoDB主键类型ObjectId

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、Object…

【状态机动态规划 状态压缩】1434. 每个人戴不同帽子的方案数

本文涉及知识点 位运算、状态压缩、枚举子集汇总 动态规划汇总 LeetCode 1434. 每个人戴不同帽子的方案数 总共有 n 个人和 40 种不同的帽子&#xff0c;帽子编号从 1 到 40 。 给你一个整数列表的列表 hats &#xff0c;其中 hats[i] 是第 i 个人所有喜欢帽子的列表。 请你…

建投数据人力资源系列产品获得欧拉操作系统及华为鲲鹏技术认证书

近日&#xff0c;经欧拉生态创新中心和华为技术有限公司测评&#xff0c;建投数据自主研发的人力资源管理系统、招聘管理系统、绩效管理系统、培训管理系统&#xff0c;完成了基于欧拉操作系统openEuler 22.03、华为鲲鹏Kunpeng 920&#xff08;Taisha 200&#xff09;的兼容性…

ASP.NET MVC

ASP.NET MVC与.NET Framework关系 .NET Framework是一个庞大的代码库&#xff0c;能为多种编程语言提供支持(如C#、VB、F#等)。同时.NET Framework 提供了多种技术框架&#xff0c;ASP.NET MVC是.NET Framework提供的众多技术框架中的一种&#xff0c;用于开发Web应用。 .NET …

B端:小小详情页蕴藏大学问,附大量案例 。

在B端&#xff08;Business-to-Business&#xff0c;即企业与企业之间的商业模式&#xff09;的设计中&#xff0c;详情页是一个非常重要的环节。虽然它可能看起来只是一个简单的页面&#xff0c;但实际上其中蕴藏着许多大学问。 用户需求与体验&#xff1a; 在B端设计中&…

【Docker】Docker-consul容器服务自动发现与注册

目录 一.Consul概述 1.解决了什么问题 2.什么叫微服务或者注册与发现 3.consul的模式 4.相关命令 二.consul 部署 1.consul服务器部署 2.部署docker容器 3.Nginx负载均衡器 3.1.安装启动nginx 3.2.配置nginx负载均衡 3.3.创建配置consul complate模板文件 3.4.添加…

基于Qt的上位机通用框架

0.前言 最近一年多的时间一直在开发设备控制相关的软件&#xff0c;加上之前在聚光的两年时间&#xff0c;前前后后开发这种设备控制类型的上位机软件也有三年的时间了。总结出了一套基于Qt的上位机编程框架&#xff0c;核心思想类似于C#的依赖注入&#xff0c;对象的初始化都…

JavaScript青少年简明教程:流程控制语句

JavaScript青少年简明教程&#xff1a;流程控制语句 JavaScript 提供了一系列的流程控制语句&#xff0c;用于控制代码的执行顺序。 条件语句 条件语句根据表达式的真假来执行不同的代码块。 if 语句 用于在条件为真时执行代码块。 语法&#xff1a; if(条件){ 条件满足执…

微信小程序获取蓝牙并实现内容打印

通过微信小程序如何实现获取蓝牙打印机并实现打印能力&#xff0c;之前做过一个测试Dome&#xff0c;能够获取附近的蓝牙打印机设备并实现打印,今天开放出来供大家参考。 wxml <!--右下角搜索--> <view class"ly-cass-box"><view class"ly-cas…

Hadoop、HDFS、MapReduce 大数据解决方案

本心、输入输出、结果 文章目录 Hadoop、HDFS、MapReduce 大数据解决方案前言HadoopHadoop 主要组件的Web UI端口和一些基本信息MapReduceMapReduce的核心思想MapReduce的工作流程MapReduce的优缺点Hadoop、HDFS、MapReduce 大数据解决方案 编辑 | 简简单单 Online zuozuo 地址…

广义线性模型(1)广义线性模型详解

一 GLM概述 广义线性模型&#xff08;Generalized Linear Models&#xff0c;GLM&#xff09;由 Nelder 和 Wedderburn 于 1972年提出和发表 &#xff0c;旨在解决普通线性回归模型无法处理因变量离散&#xff0c;并发展能够解决非正态因变量的回归建模任务的建模方法。 在广…