本章将对现在流行的 web 框架中的中间件技术原理进行分析,并介绍如何使用中间件技术将业务和非业务代码功能进行解耦。

代码泥潭

先来看一段代码:

// middleware/hello.go
package mainfunc hello(wr http.ResponseWriter, r *http.Request) {wr.Write([]byte("hello"))
}func main() {http.HandleFunc("/", hello)err := http.ListenAndServe(":8080", nil)...
}

这是一个典型的 web 服务,挂载了一个简单的路由。我们的线上服务一般也是从这样简单的服务开始逐渐拓展开去的。

现在突然来了一个新的需求,我们想要统计之前写的 hello 服务的处理耗时,需求很简单,我们对上面的程序进行少量修改:

// middleware/hello_with_time_elapse.go
var logger = log.New(os.Stdout, "", 0)func hello(wr http.ResponseWriter, r *http.Request) {timeStart := time.Now()wr.Write([]byte("hello"))timeElapsed := time.Since(timeStart)logger.Println(timeElapsed)
}

这样便可以在每次接收到 http 请求时,打印出当前请求所消耗的时间。

完成了这个需求之后,我们继续进行业务开发,提供的 api 逐渐增加,现在我们的路由看起来是这个样子:

// middleware/hello_with_more_routes.go
// 省略了一些相同的代码
package mainfunc helloHandler(wr http.ResponseWriter, r *http.Request) {...
}func showInfoHandler(wr http.ResponseWriter, r *http.Request) {...
}func showEmailHandler(wr http.ResponseWriter, r *http.Request) {...
}func showFriendsHandler(wr http.ResponseWriter, r *http.Request) {timeStart := time.Now()wr.Write([]byte("your friends is tom and alex"))timeElapsed := time.Since(timeStart)logger.Println(timeElapsed)
}func main() {http.HandleFunc("/", helloHandler)http.HandleFunc("/info/show", showInfoHandler)http.HandleFunc("/email/show", showEmailHandler)http.HandleFunc("/friends/show", showFriendsHandler)...
}

每一个 handler 里都有之前提到的记录运行时间的代码,每次增加新的路由我们也同样需要把这些看起来长得差不多的代码拷贝到我们需要的地方去。因为代码不太多,所以实施起来也没有遇到什么大问题。

渐渐的我们的系统增加到了 30 个路由和 handler 函数,每次增加新的 handler,我们的第一件工作就是把之前写的所有和业务逻辑无关的周边代码先拷贝过来。

接下来系统安稳地运行了一段时间,突然有一天,老板找到你,我们最近找人新开发了监控系统,为了系统运行可以更加可控,需要把每个接口运行的耗时数据主动上报到我们的监控系统里。给监控系统起个名字吧,叫 metrics。现在你需要修改代码并把耗时通过 http post 的方式发给 metrics 了。我们来修改一下 helloHandler:

func helloHandler(wr http.ResponseWriter, r *http.Request) {timeStart := time.Now()wr.Write([]byte("hello"))timeElapsed := time.Since(timeStart)logger.Println(timeElapsed)// 新增耗时上报metrics.Upload("timeHandler", timeElapsed)
}

修改到这里,本能地发现我们的开发工作开始陷入了泥潭。无论未来对我们的这个 web 系统有任何其它的非功能或统计需求,我们的修改必然牵一发而动全身。只要增加一个非常简单的非业务统计,我们就需要去几十个 handler 里增加这些业务无关的代码。虽然一开始我们似乎并没有做错,但是显然随着业务的发展,我们的行事方式让我们陷入了代码的泥潭。

使用 middleware 剥离非业务逻辑

我们来分析一下,一开始在哪里做错了呢?我们只是一步一步地满足需求,把我们需要的逻辑按照流程写下去呀?

实际上,我们犯的最大的错误是把业务代码和非业务代码揉在了一起。对于大多数的场景来讲,非业务的需求都是在 http 请求处理前做一些事情,或者/并且在响应完成之后做一些事情。我们有没有办法使用一些重构思路把这些公共的非业务功能代码剥离出去呢?回到刚开头的例子,我们需要给我们的 helloHandler 增加超时时间统计,我们可以使用一种叫 function adapter 的方法来对 helloHandler 进行包装:


func hello(wr http.ResponseWriter, r *http.Request) {wr.Write([]byte("hello"))
}func timeMiddleware(next http.Handler) http.Handler {return func(wr http.ResponseWriter, r *http.Request) {timeStart := time.Now()// next handlernext.ServeHTTP(wr, r)timeElapsed := time.Since(timeStart)logger.Println(timeElapsed)}
}func main() {http.HandleFunc("/", timeMiddleware(hello))err := http.ListenAndServe(":8080", nil)...
}

这样就非常轻松地实现了业务与非业务之间的剥离,魔法就在于这个 timeMiddleware。可以从代码中看到,我们的 timeMiddleware 也是一个函数,其参数为 http.Handler,http.Handler 的定义在 net/http 包中:

type Handler interface {ServeHTTP(ResponseWriter, *Request)
}

任何方法实现了 ServeHTTP,即是一个合法的 http.Handler,读到这里你可能会有一些混乱,我们先来梳理一下 http 库的 Handler,HandlerFunc 和 ServeHTTP 的关系:

type Handler interface {ServeHTTP(ResponseWriter, *Request)
}type HandlerFunc func(ResponseWriter, *Request)func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request)f(w, r)
}

实际上只要你的 handler 函数签名是:

func (ResponseWriter, *Request)

那么这个 handler 就是一个 HandlerFunc 类型了,也就相当于实现了 http.Handler 这个接口,这要归功于 golang 的 duck typing 式的类型系统。在 http 库需要调用你的 handler 函数来处理 http 请求时,会调用 HandlerFunc 的 ServeHTTP 函数,可见一个请求的基本调用链是这样的:

h = getHandler() => h.ServeHTTP(w, r) => h(w, r)

知道 handler 是怎么一回事,我们的中间件通过包装 handler,再返回一个新的 handler 就好理解了。

总结一下,我们的中间件要做的事情就是通过一个或多个函数对 handler 进行包装,返回一个包括了各个中间件逻辑的函数链。我们把上面的包装再做得复杂一些:

customizedHandler = logger(timeout(ratelimit(helloHandler)))

这个函数链在执行过程中的上下文可以用下面这张图来表示。

再直白一些,这个流程在进行请求处理的时候实际上就是不断地进行函数压栈再出栈,有一些类似于递归的执行流:

[exec of logger logic]           函数栈: [][exec of timeout logic]          函数栈: [logger][exec of ratelimit logic]        函数栈: [timeout/logger][exec of helloHandler logic]     函数栈: [ratelimit/timeout/logger][exec of ratelimit logic part2]  函数栈: [timeout/logger][exec of timeout logic part2]    函数栈: [logger][exec of logger logic part2]     函数栈: []

功能实现了,但在上面的使用过程中我们也看到了,这种函数套函数的用法不是很美观,同时也不具备什么可读性。

更优雅的 middleware 写法

上一节中解决了业务功能代码和非业务功能代码的解耦,但也提到了,看起来并不美观,如果需要修改这些函数的顺序,或者增删 middleware 还是有点费劲,本节我们来进行一些“写法”上的优化。

看一个例子:

r = NewRouter()
r.Use(logger)
r.Use(timeout)
r.Use(ratelimit)
r.Add("/", helloHandler)

通过多步设置,我们拥有了和上一节差不多的执行函数链。胜在直观易懂,如果我们要增加或者删除 middleware,只要简单地增加删除对应的 Use 调用就可以了。非常方便。

从框架的角度来讲,怎么实现这样的功能呢?也不复杂:

type middleware func(http.Handler) http.Handlertype Router struct {middlewareChain [] func(http.Handler) http.Handlermux map[string] http.Handler
}func NewRouter() *Router{return &Router{}
}func (r *Router) Use(m middleware) {r.middlewareChain = append(r.middlewareChain, m)
}func (r *Router) Add(route string, h http.Handler) {var mergedHandler = hfor i := len(r.middlewareChain) - 1; i >= 0; i-- {mergedHandler = r.middlewareChain[i](mergedHandler)}r.mux[route] = mergedHandler
}

注意代码中的 middleware 数组遍历顺序,和用户希望的调用顺序应该是"相反"的。应该不难理解。

哪些事情适合在 middleware 中做

以较流行的开源 golang 框架 chi 为例:

compress.go=> 对 http 的 response body 进行压缩处理
heartbeat.go=> 设置一个特殊的路由,例如 /ping,/healthcheck,用来给 load balancer 一类的前置服务进行探活
logger.go=> 打印 request 处理日志,例如请求处理时间,请求路由
profiler.go=> 挂载 pprof 需要的路由,如 /pprof、/pprof/trace 到系统中
realip.go=> 从请求头中读取 X-Forwarded-For 和 X-Real-IP,将 http.Request 中的 RemoteAddr 修改为得到的 RealIP 
requestid.go=> 为本次请求生成单独的 requestid,可一路透传,用来生成分布式调用链路,也可用于在日志中串连单次请求的所有逻辑
timeout.go=> 用 context.Timeout 设置超时时间,并将其通过 http.Request 一路透传下去
throttler.go=> 通过定长大小的 channel 存储 token,并通过这些 token 对接口进行限流

每一个 web 框架都会有对应的 middleware 组件,如果你有兴趣,也可以向这些项目贡献有用的 middleware,只要合理一般项目的维护人也愿意合并你的 pull request。

比如开源界很火的 gin 这个框架,就专门为用户贡献的 middleware 开了一个仓库:

如果读者去阅读 gin 的源码的话,可能会发现 gin 的 middleware 中处理的并不是 http.Handler,而是一个叫 gin.HandlerFunc 的函数类型,和本节中讲解的 http.Handler 签名并不一样。不过实际上 gin 的 handler 也只是针对其框架的一种封装,middleware 的原理与本节中的说明是一致的。

刘掌柜的
发布了83 篇原创文章 · 获赞 9 · 访问量 5万+
私信关注
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. PyTorch & PyTorch Geometric图神经网络(GNN)实战

    mark一下,感谢作者分享! http://www.360doc.com/content/19/0601/13/7673502_839610173.shtml http://www.jintiankansha.me/t/OsNpfQP895 github: https://github.com/khuangaf/Pytorch-Geometric-YooChoose点赞收藏分享文章举报法相发布了60 篇原创文章 获赞 54 访问量 …...

    2024/3/29 4:42:58
  2. Java中关于static静态关键字

    在Java语言中,static表示“静态”的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块。static的主要作用在于创建独立于具体对象的域变量或者方法。本文主要来去讲解一下static的来龙去脉。static要解决什么问题?我们知道,当我们通过new关键字去创建对…...

    2024/4/26 20:28:18
  3. js版本基于链表法的散列表

    let getWords=require("./1.js").getWords //导入1.js,代码见字符串部分的文章 let char2int=require("./1.js").char2intwords=getWords(maxcount=555,minlen=1,maxlen=5,R=26) words=Array.from(new Set(words)) //去重 console.log(words) let M=…...

    2024/4/26 15:18:45
  4. Vue父子组件相互传值

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>父子组件相互传值</title><!--<script src="vue.js"></script>--><script type="text/javascript"…...

    2024/4/19 23:40:12
  5. [SpringCloud]~常用架构分层

    目录常用架构分层commom(公共业务代码层)config(配置层)controller(控制层)DTO(Data Transfer Object 数据传输对象)mapper(数据持久层)VO(Value Object 值对象)domain/model(数据模型层)service(业务层)Impl(业务实现层)task (定时任务)util(工具类) 常…...

    2024/4/17 18:23:23
  6. leetcode-124-二叉树中的最大路径和-java

    题目及测试package pid124;/*二叉树中的最大路径和给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3]1/ \2 3输出: 6示例 2:输入: [-10,9,20,null…...

    2024/4/23 2:34:48
  7. ABAP 内表 排序

    将内表 it_ebtable字段按照升序和降序进行排列SORT it_ebtable BY budat ASCENDING belnr DESCENDING.(将内表 it_ebtable 中 budat字段按照升序排列 并且 belnr按照降序进行排列 )点赞收藏分享文章举报粨毐不侵发布了3 篇原创文章 获赞 0 访问量 7私信关注...

    2024/4/23 5:05:27
  8. 贺利坚老师汇编课程25笔记:LOOP指令看CX

    用CX和LOOP指令相配合实现循环功能的三个要点 1.在CX中存放循环次数 2.用标号指定循环开始的位置 3.在标号和LOOP指令的中间,写上要循环执行的程序段(循环体) 代码计算2^12;loop指令示例 ASSUME CS:CODE CODE SEGMENT MOV AX,2 ADD CX,11 S:ADD AX,AX LOOP SMOV AX,4C00H IN…...

    2024/4/26 17:07:49
  9. vue 搭建脚手架项目

    在搭建vue项目之前需要先安装vue的脚手架(npm)和node.js安装之后可在黑窗口node-v查看,如果有版本号证明安装成功。npm同理搭建脚手架项目流程如下图点赞收藏分享文章举报人间至味是清欢发布了94 篇原创文章 获赞 15 访问量 16万+私信关注...

    2024/4/20 18:10:28
  10. sublime中替换成换行

    ctrl + h 打开替换窗口。replace with里输入 ctrl + shift + enter点赞收藏分享文章举报爬虫仔蛙发布了167 篇原创文章 获赞 20 访问量 29万+他的留言板关注...

    2024/4/26 9:40:32
  11. Appium自带定位

    Appium定位元素 #点赞收藏分享文章举报qq_45134780发布了8 篇原创文章 获赞 0 访问量 26私信关注...

    2024/4/26 21:15:20
  12. 举个栗子:将文件复制到root目录下

    1:拷贝复制cp /普通用户下的路径/文件 /root用户路径下的文件名/ cp /home/admin/123.txt /root/ https://blog.csdn.net/zllww123/article/details/78792384/2:权限chown -R 用户名:用户组 /home/用户名/文件夹chown -R root:root /root/123.txt https://zhidao.baidu.com…...

    2024/4/19 4:22:13
  13. 在SSM下基于POI实现Excel表的导入(多sheet)/导出

    在SSM下基于POI实现Excel表的导入(多sheet)/导出 学习Excel编写项目时的一些心得,适合小白观看。项目中实现了Excel中多个sheet的导入和单数表的导出功能,对于多数据表指定导出可自行添加if或者for循环来实现。Excel表的结构,简单的分成 Sheet,Cell,Row 三部分,即页,列,…...

    2024/4/26 2:10:04
  14. 微信公众号网页授权----redirect_uri域名与后台配置不一致,错误码10003 错误

    获取code并重定向到回调地址链接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx702a005562417853&redirect_uri=http%3A%2F%2Fpinit.com%2FWeixin%2Fauthorize.do&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redir…...

    2024/3/29 6:38:04
  15. strchr函数的应用

    strchr函数接收两个参数,第一个是原来的字符串,第二个是用于标明分割的第一个字符必须是第一个。函数将返回一个字符串,是以第二个字符串打头的分割字符串。 #include<iostream> #include<cstring> using namespace std;int main() {char c[] = "I love yo…...

    2024/4/24 4:19:27
  16. maven换源

    maven换源需要修改settings.xml,首先用mvn -version查找出maven的安装位置 然后cd到maven目录下的conf文件夹下,打开settings.xml文件,修改<mirrors>节点,添加镜像(常用的如阿里的镜像) <!--阿里maven镜像--> <mirror><id>aliyun</id><…...

    2024/4/27 0:15:47
  17. 比较好的maven库

    https://mvnrepository.com/http://nexus.bsdn.org/index.html#nexus-search;quick~mysql阿里云maven镜像,以及阿里云内建的maven私有仓库地址http://maven.aliyun.com/nexus/content/groups/public/ 这个是公共的maven仓库,,查看网上资料,引用的大部分是这个地址由于开…...

    2024/4/24 20:32:46
  18. Android 矩形/柱状进度条

    一般我们表示容量使用进度,或者出售量/库存,还是当期那拼团人数/剩余拼团人数这种表示时 一般可用数字来表示,或者圆形图。但是每个老板审美不一样,最近就遇到了一个要求使用柱状图来表示的需求。类似下图表示:或者这种效果使用ProgressBar/Seekbar自定义也行。但是吧,感…...

    2024/4/26 0:58:10
  19. 驾驶证行驶证识别

    驾驶证、行驶证识别 一、OCR证件识别技术种类 OCR识别技术可谓当下人工智能领域最为火热的一项技术,在各种APP爆发式增长的同时,可以看到的是几乎所有的智能软件,开发人员如果想要提高客户人机交互的感受,那么智能识别技术是一个必选项。那么总体来说当今的ocr识别技术主要…...

    2024/3/29 11:12:15
  20. vue-版的老虎机抽奖活动效果折腾小记

    前沿最近公司有一个活动,让做一个老虎机抽奖活动,对于之前没有做过的我来说还是有些吃力的,于是就开始各种网上找插件,发现大部分都是jquery的,要不就是好多一部分的,一个完整的流程都走不下来,更有甚者让花钱买他的代码,我就想说大家都是分享,互相交流,你们怎么就那…...

    2024/4/27 2:54:57

最新文章

  1. 基于Spring Boot的口腔管理平台设计与实现

    基于Spring Boot的口腔管理平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录界面图&#xff0c;管理员登录进入口腔管理平…...

    2024/4/27 4:32:09
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. promise.all方式使用

    romise.all( ).then( ) 处理多个异步任务&#xff0c;且所有的异步任务都得到结果时的情况。 比如&#xff1a;用户点击按钮&#xff0c;会弹出一个弹出对话框&#xff0c;对话框中有两部分数据呈现&#xff0c;这两部分数据分别是不同的后端接口获取的数据。 弹框弹出后的初…...

    2024/4/23 6:24:29
  4. 在 Visual Studio Code (VSCode) 中隐藏以 . 开头的文件

    打开VSCode。 按下Ctrl ,快捷键打开设置。您也可以点击屏幕左下角的齿轮图标&#xff0c;然后选择“Settings”。 在设置搜索框中&#xff0c;键入files.exclude。 在找到的Files: Exclude项中&#xff0c;点击Add Pattern按钮来添加一个新的模式&#xff0c;或者直接在搜索…...

    2024/4/22 21:08:05
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/26 21:56:58
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/26 16:00:35
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/26 22:01:59
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  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