分布式微服务电商项目
最近用了接近两个月的时间,完成了一个分布式微服务项目,本篇博文将会对项目中涉及到的重点技术进行总结。
前言
项目中使用的一些中间件、服务软件,都是使用 docker 进行安装、配置的,如果不会 docker 安装和配置这些软件的可以参考下面这篇博文:
Docker 常用软件安装
在项目中使用到的技术:
- 微服务框架:SpringBoot(2.2.2)、SpringCloud(Hoxton.SR1)、SpringCloudAlibaba(2.2.0.RELEASE)
- 数据库:mysql(8.0.17)、redis
- 持久化层框架:mybatis-plus(3.2.0)
- 检索中间件:elasticsearch(7.4.2)
- 分布式缓存:SpringCache
- 分布式锁:Redisson(3.12.5)
- 消息队列:AMQP-RabbitMQ
- 动静分离:Nginx
- 定时任务:Spring Schedule
- 共享Session:spring-session
- 模板引擎:thymeleaf
其中一些网关、服务监控、服务熔断降级限流,这些用的都是 SpringBoot、SpringCloudAlibaba 中的技术,就不再一一列举了。
--------------------------------------分割线--------------------------------------
下面,我会以一个客户进入购物网站,从登录、检索商品、加入购物车、下订单、去支付、秒杀商品,这样的流程将各个部分所用到的关键技术进行讲解,并且每个流程会附有相应的业务逻辑图,便于了解整个电商项目的流程。
一、登录
用户登录有比较重要的两点:
- 用户使用社交账号(微博、微信、QQ等)登录
- 网站内一处登录(父域名),处处(子域名)可以显示用户登录信息
1.社交账号登录
在项目中,博主使用的是微博的社交账号登录,具体可以参考微博OAuth2.0 文档使用:
微博OAuth2.0登录 - 使用接口深度开发,适合后端开发人员,在使用前需要创建一个应用项目,获取 App Key、App Secret。
社交登录大致流程如下:
使用 Access Token 通过微博API 获取用户信息:微博API
2.SpringSession 共享登录信息
在用户登录之后,对于用户本机来说,无论访问网站的哪一个页面,都应该各个微服务都应该知道当前用户的登录信息。博主在项目中,使用SpringSession 来解决 Session 共享问题。
但是还有一个问题,将用户登录信息存储到 Session 中,Session 底层也是通过 Cookie 向服务器获取数据的,但是网站的不同服务,域名都不相同,为了解决这个问题,需要将保存用户信息的 Cookie 扩大域名范围到父域,这样就可以保证每个服务都可以获取到 Cookie。
使用 SpringSession 还是和 Session 一样,获取到 HttpSession 调用 session.setAttribute()
方法进行数据存储,但 SpringSession 会将数据存储到 Redis 中,保证了分布式服务可以共享 Session。
SpringSession 配置类:
@Configuration
public class RedisSessionConfig {/*** cooike 序列化器:自定义 cookie 作用域*/@Beanpublic CookieSerializer cookieSerializer() {DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();// 设置 cookie 的作用域,设置为项目的父域,所有域都可访问cookieSerializer.setDomainName("mall.com");return cookieSerializer;}/*** Redis 序列化器:设置存入 Redis 中的序列化机制*/@Beanpublic RedisSerializer<Object> redisSerializer() {return new GenericJackson2JsonRedisSerializer();}
}
登录简单业务梳理:
二、检索商品
检索商品主要就是对 ElasticSearch 的使用,项目中有以下两点:
- 商品上架:需要根据商品信息的字段提前创建索引以及各个字段的映射关系,并保存输入商品信息;
- 商品检索:根据检索参数动态构建DSL语句,根据DSL语句向ES服务器发送检索请求,获取到检索响应封装为指定数据返回。
检索商品简单业务梳理:
三、加入购物车
将商品加入购物车有一个关注点:
- 临时用户与登录用户:临时用户也是可以添加商品到购物车的,并且关闭页面之后,下一次还能查看之前添加的商品。
为了解决这个业务问题,使用了两个购物车数据结构来分别将 临时购物车、用户购物车 存储到 Redis 中,并且在用户登录查看购物车时,会合并临时购物车的商品到用户购物车中。
解决方法:创建拦截器,对于每一个没有登录的用户,在使用购物车服务时,会分配一个 user-key
并保存到 Cookie 中,设置 Cookie 保存1个月。这样就可以保证1个月内,临时用户可以查看自己添加过的商品。
CartInterceptor 拦截器类:
public class CartInterceptor implements HandlerInterceptor {public static ThreadLocal<UserInfoTo> threadLocal = new ThreadLocal<>();/*** 业务执行之前:检测用户登录状态,如果是临时用户分配一个 user-key*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {UserInfoTo userInfoTo = new UserInfoTo();HttpSession session = request.getSession();MemberRespVo member = (MemberRespVo) session.getAttribute(AuthServerConstant.LOGIN_USER);// 1.用户登录:if (member != null) {userInfoTo.setId(member.getId());}// 2.临时用户:如果之前已经存在就从浏览器中获取 user-keyCookie[] cookies = request.getCookies();if (cookies != null && cookies.length > 0) {for (Cookie cookie : cookies) {if (cookie.getName().equals(CartConstant.TEMP_USER_COOKIE_NAME)) {userInfoTo.setUserKey(cookie.getValue());userInfoTo.setTempUser(true); // 标记已经是临时用户,没有必要保存 cookie}}}// 3.临时用户:在第一次使用购物车时,自动生成一个 user-key,并会在 postHandle 中将 user-key 保存到浏览器的 cookie 中if (StringUtils.isEmpty(userInfoTo.getUserKey())) {String userKey = UUID.randomUUID().toString();userInfoTo.setUserKey(userKey);}// 在方法执行之前,将用户的登录状态存入到 ThreadLocal 中,方便后面 controller 的执行threadLocal.set(userInfoTo);return true;}/*** 业务执行之后:* 如果第一次访问购物车,保存临时用户的 user-key 到浏览器 cookie 中,保证以后每次访问都会携带这个 user-key*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {UserInfoTo userInfoTo = threadLocal.get();// 如果是第一次使用购物车,才会在浏览器 cookie 中保存一个 user-keyif (!userInfoTo.isTempUser()) {Cookie cookie = new Cookie(CartConstant.TEMP_USER_COOKIE_NAME, userInfoTo.getUserKey());cookie.setDomain("mall.com");cookie.setMaxAge(CartConstant.TEMP_USER_COOKIE_TIMEOUT); // 设置1个月的过期时间response.addCookie(cookie);}}
}
在 Redis 保存每个购物车的商品信息时,使用的是 hash 类型,使用 hash 类型可以使查看购物车项、结算等业务逻辑都非常快速。
购物车简单业务梳理:
四、下订单
订单服务所涉及到的就是多服务的分布式事务问题,如何保证订单的创建、库存的扣减、订单的回滚、库存的回滚是下订单关注的问题:
- SpringCloudAlibabaSeata:一个保证分布式服务事务的框架,但是由于锁太重,不利于与用户流量较大的订单服务,而利于后台对商品上架等业务;
- 分布式事务(柔性事务 + 可靠消息 + 最终一致性):使用 RabbitMQ 来进行服务之间的消息沟通,保证订单与库存的最终一致性,使用消息队列的好处在于处理业务迅速。
博主在项目中的下订单以及库存扣减,都是采用 RabbitMQ 来保证订单服务与库存服务之间事务的一致性。
这里先插入一张图,可以简单了解一下 RabbitMQ 的工作流程:
在消息队列中,可以使用死信队列来控制订单的有效时间,如果订单在有效时间内没有完成支付,死信队列就会向库存服务发送解锁库存的消息,在库存服务手动将库存数量将会回滚。
订单服务与库存服务之间消息队列工作流程图:
五、支付
因为只是一个简单的项目,所以我使用的是第三方支付宝沙箱环境进行的支付测试,不了解支付宝沙箱环境可以参考:沙箱环境
在支付过程中,支付宝使用了 RSA 非对称加密算法来保证支付过程的安全,对于 RSA 加密算法可以通过下面的图简单了解一下:
所以在使用支付接口时,我们需要给支付宝上传一个商户公钥(商户私钥自己安全保管),支付宝会给我们一个支付宝公钥。在支付过程中,我们使用商户私钥对数据进行加签加密,支付宝通过商户公钥进行验签解密,将响应再次通过支付宝私钥加签加密发送给我们,我们在使用支付宝公钥解签解密,才能获取到支付的响应结果。
调用支付宝支付的模板类:
@ConfigurationProperties(prefix = "alipay")
@Component
@Data
public class AlipayTemplate {//在支付宝创建的应用的idprivate String app_id = "2016102600763438";// 商户私钥,您的PKCS8格式RSA2私钥private String merchant_private_key = xxx;// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。private String alipay_public_key = xxx;// 服务器[异步通知]页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问// 支付宝会悄悄的给我们发送一个请求,告诉我们支付成功的信息private String notify_url;// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问//同步通知,支付成功,一般跳转到成功页private String return_url;// 签名方式private String sign_type = "RSA2";// 字符编码格式private String charset = "utf-8";// 订单超时时间private String timeout = "30m";// 支付宝网关; https://openapi.alipaydev.com/gateway.doprivate String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";public String pay(PayVo vo) throws AlipayApiException {//AlipayClient alipayClient = new DefaultAlipayClient(AlipayTemplate.gatewayUrl, AlipayTemplate.app_id, AlipayTemplate.merchant_private_key, "json", AlipayTemplate.charset, AlipayTemplate.alipay_public_key, AlipayTemplate.sign_type);//1、根据支付宝的配置生成一个支付客户端AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl,app_id, merchant_private_key, "json",charset, alipay_public_key, sign_type);//2、创建一个支付请求 //设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(return_url);alipayRequest.setNotifyUrl(notify_url);//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = vo.getOut_trade_no();//付款金额,必填String total_amount = vo.getTotal_amount();//订单名称,必填String subject = vo.getSubject();//商品描述,可空String body = vo.getBody();alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","+ "\"total_amount\":\"" + total_amount + "\","+ "\"subject\":\"" + subject + "\","+ "\"body\":\"" + body + "\","+ "\"timeout_express\":\"" + timeout + "\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");String result = alipayClient.pageExecute(alipayRequest).getBody();//会收到支付宝的响应,响应的是一个页面,只要浏览器显示这个页面,就会自动来到支付宝的收银台页面System.out.println("支付宝的响应:" + result);return result;}
}
如果支付完成,支付宝会有两个返回(直接返回、异步回调),直接返回跳转到用户的订单列表,而异步回调则可以对订单进行后续处理(解锁库存、修改订单状态等等),而且异步回调的速度快与直接返回。 使用异步回调需要先支付宝服务器返回一个 success,否则支付宝服务器会一直发送这个异步请求(具体参考:支付宝异步回调)。
处理异步回调方法:
/*** 支付宝异步回调通知:https://opendocs.alipay.com/open/270/105902*/@PostMapping("/payed/notify")public String handleAilpayed(HttpServletRequest request, PayAsyncVo vo) throws AlipayApiException, UnsupportedEncodingException {System.out.println("进入支付异步回调...");// 只要我们收到了支付宝给我们异步的通知,告诉我们订单支付成功,返回 success,支付宝不在通知// 1.验签// 获取支付宝POST过来反馈信息Map<String,String> params = new HashMap<String,String>();Map<String,String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}// 乱码解决,这段代码在出现乱码时使用
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayTemplate.getAlipay_public_key(), alipayTemplate.getCharset(), alipayTemplate.getSign_type()); //调用SDK验证签名// 2.签名验证成功,处理订单if (signVerified) {String result = orderService.handlePayResult(vo);System.out.println("签名验证成功..");return result;}return "error";}
支付业务梳理:
六、秒杀
商品秒杀可以说是比较经典的高并发场景,如何让自己的应用承受百万级的并发是非常重要的,下面提出几个高并发场景需要注意的问题:
- 服务单一职责+独立部署:保证秒杀服务单独部署,即使挂掉,也不会影响别的服务运行;
- 秒杀链接加密:防止恶意攻击,要保证秒杀链接是在开始秒杀的那一刻才能访问,防止提前秒杀商品;
- 库存预热+快速扣减:在秒杀开始前,提前将需要秒杀的商品存储到 Redis 中,库存的扣减可以使用信号量来控制;
- 动静分离:保证秒杀和商品详情页的动态请求才能进入后台服务集群,而一些静态资源访问 Nginx 就可以;
- 恶意请求拦截:识别非法攻击请求并进行拦截,一般在网关层;
- 流量错峰:将瞬时流量使用各种手段分担到一个时间段,比如:秒杀时输入验证码、加入购物车等操作;
- 限流&熔断&降级:限制次数,限制总量,快速失败降级,熔断隔离防止雪崩;
- 队列削峰:可以将秒杀成功的请求,进入队列,而订单服务监听队列,慢慢创建队列,扣减库存即可。
有了上面的这些方法,再加上一些集群的部署,处理百万并发也不是不可能。博主在项目中也是尽量满足了上面的部分条件:
- 秒杀服务的单独部署;
- 为每个秒杀商品添加了秒杀随机码,只有在秒杀时间才能获取到,并且秒杀商品必须带有随机码才能进行秒杀,保证了秒杀链接加密;
- 将近3天的秒杀商品都存储到 Redis 中,并且使用分布式锁 Redisson 的信号量来对商品库存进行扣减;
- 使用 Nginx 来保证动静分离;
- SpringCloud Gateway 网关服务会拦截恶意请求;
- 使用 SpringCloudAlibaba Sentinel 来对服务进行限流、熔断、降级;
- 使用 RabbitMQ 来完成队列削峰,商品秒杀成功后,会向订单服务发送一个消息,订单服务监听消息,完成后续的订单业务逻辑。
还有一个需要注意的就是对于秒杀商品的上架,这里博主使用了 Spring 自带的定时任务注解@EnableScheduling @Scheduled(cron = "0 0 3 * * ?")
,定时任务在每天的3点进行秒杀商品上架,上架最近3天的秒杀场数据。
秒杀业务梳理:
在秒杀流程中,这些操作都没有数据库操作、服务调用等,每个步骤执行速度非常快,提高秒杀业务处理吞吐量。
七、其他技术补充
1.OpenFeign 的远程调用,出现消息头丢失问题
问题原因:由于使用 Feign 进行远程调用时,会创建代理对象重新封装一个 RequestTemplate,但是这个请求里面并没有携带原 Request 的请求头 Cookie 信息,导致远程调用访问 Session 内容为空,导致服务之间无法获取到 Session 中存储的用户信息。
解决方法:在 Feign 的代理对象构建 RequestTemplate 过程中会提供一个 RequestInterceptor 拦截器处理,我们可以利用这个机制来对RequestTemplate 进行修改,将原 Request 请求中的 Cookie 信息,添加到新的 RequestTemplate 中。
Feign 的配置类:
@Configuration
public class MyFeignConfig {@Beanpublic RequestInterceptor requestInterceptor() {return template -> {// 1.使用 RequestContextHolder 拿到原请求ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (attributes != null) {HttpServletRequest request = attributes.getRequest();// 2.将原请求中的 Cookie 信息添加到新的 RequestTemplate 中String cookie = request.getHeader("Cookie");template.header("Cookie", cookie);}};}
}
2.异步编排,无法获取主线程 Request 请求
上面为了解决 OpenFeign 远程调用出现的消息头丢失问题,我们可以从RequestAttributes
中获取到原请求,将原请求的 Cookie 设置给 Feign RequestTemplate
,但是在异步线程 Feign 拦截器调用 RequestContextHolder.getRequestAttributes()
时,只是新线程的 RequestAttributes
,在新线程的 RequestAttributes
中并没有存储主线程的 Request 请求,所以在异步任务 Feign 调用时会出现上下文丢失的情况。
main -> ThreadLocal (RequestAttributes(main) -> "/toTrade"请求的相关信息)main("/toTrade") --- confirmOrder() ------------------------thread1 -> ThreadLocal (RequestAttributes(thread1) -> null)thread1:addressFuture ----------thread2 -> ThreadLocal (RequestAttributes(thread2) -> null)thread2:cartItemsFuture --------
解决方法:在开启异步任务之前,将主线程的 RequestAttributes(main) 存储到异步线程的 RequestAttributes 中进行线程间共享,这样别的线程就可以通过主线程的 RequestAttributes 获取到请求上下文信息。
// 获取主前线程的 RequestAttributes
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();// 1.远程查询所有的收货列表
CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {// 将主线程的 RequestAttributes 设置到自己 ThreadLocal 中RequestContextHolder.setRequestAttributes(requestAttributes);List<MemberAddressVo> address = memberFeignService.getAddress(memberId);confirmVo.setAddressVos(address);
}, executor);
八、总结
花了2个月的时间完成一个分布式项目还是非常有意义的,在这个项目中学到了非常多的东西,也巩固了之前学过的东西,总的来说对自己帮助还是非常大的,继续淦!
项目 GitHub 仓库地址:
https://github.com/zk-kiger/Shopping-Mall
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 分布式存储成未来趋势,为何IPFS/Filecoin最为瞩目?
随着区块链技术在全球范围内的风靡,越来越多的分布式应用开始成长起来,并逐渐成为一种主流趋势。未来是大数据的时代,因此利用区块链技术解决数据存储问题便成了重中之重。然而,区块链在数据存储方面却表现出了发展瓶颈。 正是基于此,由Protocol Labs创建的IPFS/Filecoin项…...
2024/5/4 13:54:27 - 小秘谈币: 7.7 BTC行情分析 上涨仍有阻力
据波网Boboo.com交易大数据显示,截至7月7日9:00,BTC永续合约报价9333.8美元,较现货价格(9330.13美元)高出3.67美元,合约价格保持升水状态,较昨日升水(4.41美元)微幅缩小;多空持仓比为1.51,较昨日(0.83)上升明显;永续合约资金费率为-0.0003%,资金费率由正转负。 …...
2024/4/16 7:57:47 - 微服务架构 与 Spring Cloud 的前世今生
本文目录:写在开头1.什么是微服务架构2.Spring Cloud 介绍3.Spring Cloud 集成有哪些优质项目4.Dubbo 对比 Spring Cloud5.Spring Cloud 体系那么多框架都要学吗?6.Spring Cloud 升级后的替代品写在开头在学习 Spring Cloud 之前,如果你还对微服务架构不是很了解的话,我们就…...
2024/4/1 1:49:17 - EMBA丨在VUCA时代,成年人应该如何学习?
什么是VUCA? VUCA由以下四部分组成: 不稳定(Volatile)、不确定(Uncertain)、复杂(Complex)、模糊(Ambiguous)。 人到中年,虽然说40不惑,但在这个VUCA时代,即使年过四十,我们仍然可能会面临很多困惑,需要通过学习和思考去解决。 那么,在不惑之年,应该如何更好地学习呢?…...
2024/4/16 7:57:52 - 垃圾收集器G1和ZGC详解
垃圾收集器G1和ZGC详解1、G1(Garbage-First)1、分代特性2、G1回收流程3、G1回收主要算法1、G1垃圾回收算法2、G1筛选回收筛选算法4、G1垃圾收集器的特点5、G1垃圾收集分类6、G1垃圾收集器优化建议7、G1的适合场景2、ZGC(Z Garbage Collector)1、版本支持2、ZGC目标3、暂时不分代…...
2024/4/16 7:57:52 - 边三连通分量算法
题目链接给出一张 nnn 个点 mmm 条边的无向图,可能不连通、有重边、有自环、有割边。求其所有极大的边三连通分量。 n,m≤5105n, m \le 5 \times 10 ^ 5n,m≤5105。论文太长了,还没看完,目前只看懂了算法步骤,一些证明还咕在后面。就先介绍一下步骤,正确性证明和时间复杂度…...
2024/4/16 7:58:43 - 使用正则,查找页面中指定内容
第一题/di.*[\-].*[0-9]\.html/dict/dict.*[\-].*\.html第二题 如果使用js, 代码如下: var list = document.getElementsByClassName("blue w44"); var i; for (i = 0; i < list.length; i++) { x[i].innerText }```...
2024/4/21 22:11:09 - PHP必背函数
json_encode json_decode call_user_func — 把第一个参数作为回调函数调用 call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数...
2024/4/16 7:58:07 - Maven的使用配置
1 配置本地仓库 (1)打开maven配置文件夹conf,打开setting.xml。(2)找到标签,修改标签内容为本地maven仓库的路径。2 配置阿里云远程仓库镜像 (1)同样打开setting.xml文件。 (2)找到标签,然后先注释掉默认的远程仓库镜像地址,再添加下面内容。 <mirror> <id>al…...
2024/4/26 15:36:17 - cocoscreator打包 android 无法访问appcompatactivity的问题
天坑...
2024/4/28 19:57:57 - 237删除链表中的节点(单链表基本操作)
1、题目描述请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。说明:链表至少包含两个节点。链表中所有节点的值都是唯一的。给定的节点为非末尾节点并且一定是链表中的一个有效节点。不要从你的函数中返回任何结果。 现有一个链表 …...
2024/4/16 7:57:37 - iPhone小屏回潮逆袭成“机皇”:太好卖
根据手机评测网最新消息58同一城市的二手交易平台转让了“ 2020年第二季度移动市场报告”。报告显示,在二手手机市场,新的99种二手主要型号的交易价格有所下降,例如3月小米10的5G版本下跌了558元。另外,自从新的iPhoneSE推出以来,小屏幕手机在二手市场上的流行持续升温。该…...
2024/4/16 7:57:57 - mysql游标循环的使用
CREATE PROCEDURE `test`.`new_procedure` () BEGIN -- 需要定义接收游标数据的变量 DECLARE a CHAR(16);-- 游标DECLARE cur CURSOR FOR SELECT i FROM test.t;-- 遍历数据结束标志DECLARE done INT DEFAULT FALSE;-- 将结束标志绑定到游标DECLARE CONTINUE HANDLER FOR NOT F…...
2024/4/20 11:09:35 - 洛谷P2563 质数和分解(欧拉筛 + 背包)
2020.7.7 祝各位高考考生们旗开得胜,金榜题名。乾坤未定,逆风翻盘乃传统艺能。 今天还有个很不好的消息就是我的签证可能要出问题了,估计大概率就是呆在国内某一个学校了,不过也蛮好的,P大说可以接收,但学校不知道能不能给力一些,另外估计留学生又要被网暴了。我似乎看见…...
2024/4/18 4:58:04 - 最简单的贪心
定义:略 一学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。 输入 第一…...
2024/4/19 20:20:54 - 棒棒团前端学习日记 丨 第6天
加入棒棒团自学前端的第6天,今天的学习日记有以下内容: 一、 复习学过的知识: 昨天学习理解了HTML如何浏览和创建网页,学习了基本语法规范,网页与网页之间的链接与跳转,标签节点层级节点。学习了HTML的元素及其特点:块元素 --可以设置宽高,独占一行;内联元素–不可以设…...
2024/4/16 7:58:43 - 235二叉搜索树的最近公共祖先(迭代、递归)
1、题目描述给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”说明:所有节点的值…...
2024/4/16 7:58:12 - 零基础如何自学编程
首先学习编程,需要具备以下三个条件。第一:硬件保证,具备一台笔记本或者台式电脑,操Windows操作系统,性能高低对编程的前期学习几乎无任何影响。第二:买一本c语言的纸质书籍,便于随时携带,随时翻阅。如果是电子版本,长时间盯着看会对眼不利。建议选择C语言,虽然门槛较…...
2024/4/19 9:03:05 - spring boot 基本构建maven
spring boot 基本构建mavenpom.xml<!-- web--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 监控--><dependency><groupId&…...
2024/4/17 8:35:34 - 华为eNSP的SSH远程登陆配置
我们将采用eNSP进行拓扑图的搭建:首先,我们将进行路由器的简单配置,确认IP地址在同一网段接下来,我们将配置SSH远程登陆完成!!!...
2024/4/16 7:58:28
最新文章
- ue引擎游戏开发笔记(29)——实现第三人称角色随手柄力度进行移动
1.需求分析 角色可以随手柄力量大小进行走路和跑步,不动时保持角色停顿。 2.操作实现 1.思路:通过动画蓝图和动画混合实现角色移动和输入的联系。 2.建立动画蓝图和混合空间: 3.在混合空间中对角色移动进行编辑: 4.在蓝图中设定变…...
2024/5/4 14:43:40 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - CTK插件框架学习-事件监听(04)
CTK插件框架学习-插件注册调用(03)https://mp.csdn.net/mp_blog/creation/editor/136989802 一、主要流程 发送者注册消息事件接收者订阅消息事件接收者相应消息事件 事件监听比插件接口调用耦合性更弱,事件由框架维护,不需要指定发送方和接收方 二、…...
2024/5/1 10:29:55 - LeetCode-200. 岛屿数量【深度优先搜索 广度优先搜索 并查集 数组 矩阵】
LeetCode-200. 岛屿数量【深度优先搜索 广度优先搜索 并查集 数组 矩阵】 题目描述:解题思路一:bfs,主要思想都是遇到一个没有visited过的"陆地"先result 1,然后用深搜或者广搜将这片"陆地"全部做上visited标…...
2024/5/4 10:03:41 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/1 17:30:59 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/2 16:16:39 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/3 23:10:03 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/2 15:04:34 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/4 2:59:34 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/2 9:07:46 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) 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 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在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