来源丨java思维导图

juejin.im/post/5de2553e5188256e885f4fa3


首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然大悟。

什么是Spring cloud

构建分布式系统不需要复杂和容易出错。Spring Cloud 为最常见的分布式系统模式提供了一种简单且易于接受的编程模型,帮助开发人员构建有弹性的、可靠的、协调的应用程序。Spring Cloud 构建于 Spring Boot 之上,使得开发者很容易入手并快速应用于生产中。

官方果然官方,介绍都这么有板有眼的。

我所理解的 Spring Cloud 就是微服务系统架构的一站式解决方案,在平时我们构建微服务的过程中需要做如 服务发现注册配置中心消息总线负载均衡断路器数据监控 等操作,而 Spring Cloud 为我们提供了一套简易的编程模型,使我们能在 Spring Boot 的基础上轻松地实现微服务项目的构建。

Spring Cloud 的版本

当然这个只是个题外话。

Spring Cloud 的版本号并不是我们通常见的数字版本号,而是一些很奇怪的单词。这些单词均为英国伦敦地铁站的站名。同时根据字母表的顺序来对应版本时间顺序,比如:最早 的 Release 版本 Angel,第二个 Release 版本 Brixton(英国地名),然后是 Camden、 Dalston、Edgware、Finchley、Greenwich、Hoxton。

Spring Cloud 的服务发现框架——Eureka

Eureka是基于REST(代表性状态转移)的服务,主要在AWS云中用于定位服务,以实现负载均衡和中间层服务器的故障转移。我们称此服务为Eureka服务器。Eureka还带有一个基于Java的客户端组件Eureka Client,它使与服务的交互变得更加容易。客户端还具有一个内置的负载平衡器,可以执行基本的循环负载平衡。在Netflix,更复杂的负载均衡器将Eureka包装起来,以基于流量,资源使用,错误条件等多种因素提供加权负载均衡,以提供出色的弹性。

总的来说,Eureka 就是一个服务发现框架。何为服务,何又为发现呢?

举一个生活中的例子,就比如我们平时租房子找中介的事情。

在没有中介的时候我们需要一个一个去寻找是否有房屋要出租的房东,这显然会非常的费力,一你找凭一个人的能力是找不到很多房源供你选择,再者你也懒得这么找下去(找了这么久,没有合适的只能将就)。这里的我们就相当于微服务中的 Consumer ,而那些房东就相当于微服务中的 Provider 。消费者 Consumer 需要调用提供者 Provider 提供的一些服务,就像我们现在需要租他们的房子一样。

但是如果只是租客和房东之间进行寻找的话,他们的效率是很低的,房东找不到租客赚不到钱,租客找不到房东住不了房。所以,后来房东肯定就想到了广播自己的房源信息(比如在街边贴贴小广告),这样对于房东来说已经完成他的任务(将房源公布出去),但是有两个问题就出现了。第一、其他不是租客的都能收到这种租房消息,这在现实世界没什么,但是在计算机的世界中就会出现资源消耗 的问题了。第二、租客这样还是很难找到你,试想一下我需要租房,我还需要东一个西一个地去找街边小广告,麻不麻烦?

那怎么办呢?我们当然不会那么傻乎乎的,第一时间就是去找 中介 呀,它为我们提供了统一房源的地方,我们消费者只需要跑到它那里去找就行了。而对于房东来说,他们也只需要把房源在中介那里发布就行了。

那么现在,我们的模式就是这样的了。

但是,这个时候还会出现一些问题。

  1. 房东注册之后如果不想卖房子了怎么办?我们是不是需要让房东定期续约 ?如果房东不进行续约是不是要将他们从中介那里的注册列表中移除

  2. 租客是不是也要进行注册 呢?不然合同乙方怎么来呢?

  3. 中介可不可以做连锁店 呢?如果这一个店因为某些不可抗力因素而无法使用,那么我们是否可以换一个连锁店呢?

针对上面的问题我们来重新构建一下上面的模式图

好了,举完这个????我们就可以来看关于 Eureka 的一些基础概念了,你会发现这东西理解起来怎么这么简单。????????????

服务发现 :其实就是一个“中介”,整个过程中有三个角色:服务提供者(出租房子的)、服务消费者(租客)、服务中介(房屋中介)

服务提供者 :就是提供一些自己能够执行的一些服务给外界。

服务消费者 :就是需要使用一些服务的“用户”。

服务中介 :其实就是服务提供者和服务消费者之间的“桥梁”,服务提供者可以把自己注册到服务中介那里,而服务消费者如需要消费一些服务(使用一些功能)就可以在服务中介中寻找注册在服务中介的服务提供者。

服务注册 Register

官方解释:当 Eureka 客户端向 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server 注册时,它提供自身的元数据 ,比如IP地址、端口,运行状况指示符URL,主页等。

结合中介理解:房东 (提供者 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Client Provider)在中介 (服务器 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server) 那里登记房屋的信息,比如面积,价格,地段等等(元数据 metaData)。

服务续约 Renew

官方解释:Eureka 客户会每隔30秒(默认情况下)发送一次心跳来续约 。通过续约来告知 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server 该 Eureka 客户仍然存在,没有出现问题。正常情况下,如果 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server 在90秒没有收到 Eureka 客户的续约,它会将实例从其注册表中删除。

结合中介理解:房东 (提供者 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Client Provider) 定期告诉中介 (服务器 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server) 我的房子还租(续约) ,中介 (服务器[Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server) 收到之后继续保留房屋的信息。

获取注册列表信息 Fetch Registries

官方解释:Eureka 客户端从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每30秒钟)更新一次。每次返回注册列表信息可能与 Eureka 客户端的缓存信息不同, Eureka 客户端自动处理。如果由于某种原因导致注册列表信息不能及时匹配,Eureka 客户端则会重新获取整个注册表信息。Eureka 服务器缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。Eureka 客户端和 Eureka 服务器可以使用JSON / XML格式进行通讯。在默认的情况下 Eureka 客户端使用压缩 JSON 格式来获取注册列表的信息。

结合中介理解:租客(消费者 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Client Consumer) 去中介 (服务器 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server) 那里获取所有的房屋信息列表 (客户端列表 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Client List) ,而且租客为了获取最新的信息会定期向中介 (服务器 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server) 那里获取并更新本地列表。

服务下线 Cancel

官方解释:Eureka客户端在程序关闭时向Eureka服务器发送取消请求。发送请求后,该客户端实例信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:DiscoveryManager.getInstance().shutdownComponent();

结合中介理解:房东 (提供者 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Client Provider) 告诉中介  (服务器 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server) 我的房子不租了,中介之后就将注册的房屋信息从列表中剔除。

服务剔除 Eviction

官方解释:在默认的情况下,当Eureka客户端连续90秒(3个续约周期)没有向Eureka服务器发送服务续约,即心跳,Eureka服务器会将该服务实例从服务注册列表删除 ,即服务剔除。

结合中介理解:房东(提供者 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Client Provider) 会定期联系 中介  (服务器 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server) 告诉他我的房子还租(续约),如果中介  (服务器 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server) 长时间没收到提供者的信息,那么中介会将他的房屋信息给下架(服务剔除)。

下面就是 Netflix 官方给出的 Eureka 架构图,你会发现和我们前面画的中介图别无二致。

当然,可以充当服务发现的组件有很多:ZookeeperConsul , Eureka 等。

更多关于 Eureka 的知识(自我保护,初始注册策略等等)可以自己去官网查看,或者查看我的另一篇文章 [深入理解 Eureka](https://juejin.im/post/5dd497e3f265da0ba7718018)。

负载均衡之 Ribbon

什么是 RestTemplate?

不是讲 Ribbon 么?怎么扯到了 RestTemplate 了?你先别急,听我慢慢道来。

我不听我不听我不听????????????。

我就说一句!RestTemplateSpring提供的一个访问Http服务的客户端类 ,怎么说呢?就是微服务之间的调用是使用的 RestTemplate 。比如这个时候我们 消费者B 需要调用 提供者A 所提供的服务我们就需要这么写。如我下面的伪代码。

@Autowired
private RestTemplate restTemplate;
// 这里是提供者A的ip地址,但是如果使用了 Eureka 那么就应该是提供者A的名称
private static final String SERVICE_PROVIDER_A = "http://localhost:8081";@PostMapping("/judge")
public boolean judge(@RequestBody Request request) {String url = SERVICE_PROVIDER_A + "/service1";return restTemplate.postForObject(url, request, Boolean.class);
}

如果你对源码感兴趣的话,你会发现上面我们所讲的 Eureka 框架中的 注册续约 等,底层都是使用的 RestTemplate

为什么需要 Ribbon?

Ribbon  是 Netflix 公司的一个开源的负载均衡 项目,是一个客户端/进程内负载均衡器,运行在消费者端

我们再举个????,比如我们设计了一个秒杀系统,但是为了整个系统的 高可用 ,我们需要将这个系统做一个集群,而这个时候我们消费者就可以拥有多个秒杀系统的调用途径了,如下图。

如果这个时候我们没有进行一些 均衡操作 ,如果我们对 秒杀系统1 进行大量的调用,而另外两个基本不请求,就会导致 秒杀系统1 崩溃,而另外两个就变成了傀儡,那么我们为什么还要做集群,我们高可用体现的意义又在哪呢?

所以 Ribbon 出现了,注意我们上面加粗的几个字——运行在消费者端 。指的是,Ribbon 是运行在消费者端的负载均衡器,如下图。

其工作原理就是 Consumer 端获取到了所有的服务列表之后,在其内部 使用负载均衡算法 ,进行对多个系统的调用。

Nginx 和 Ribbon 的对比

提到 负载均衡 就不得不提到大名鼎鼎的 Nignx 了,而和 Ribbon 不同的是,它是一种集中式 的负载均衡器。

何为集中式呢?简单理解就是 将所有请求都集中起来,然后再进行负载均衡 。如下图。

我们可以看到 Nginx 是接收了所有的请求进行负载均衡的,而对于 Ribbon 来说它是在消费者端进行的负载均衡。如下图。

请注意 Request 的位置,在 Nginx 中请求是先进入负载均衡器,而在 Ribbon 中是先在客户端进行负载均衡才进行请求的。

Ribbon 的几种负载均衡算法

负载均衡,不管 Nginx 还是 Ribbon 都需要其算法的支持,如果我没记错的话 Nginx 使用的是 轮询和加权轮询算法。而在 Ribbon 中有更多的负载均衡调度算法,其默认是使用的 RoundRobinRule 轮询策略。

  • RoundRobinRule :轮询策略。Ribbon 默认采用的策略。若经过一轮轮询没有找到可用的 provider,其最多轮询 10 轮。若最终还没有找到,则返回 null。

  • RandomRule : 随机策略,从所有可用的 provider 中随机选择一个。

  • RetryRule : 重试策略。先按照 RoundRobinRule 策略获取 provider,若获取失败,则在指定的时限内重试。默认的时限为 500 毫秒。

???????????? 还有很多,这里不一一举????了,你最需要知道的是默认轮询算法,并且可以更换默认的负载均衡算法,只需要在配置文件中做出修改就行。

providerName:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

当然,在 Ribbon 中你还可以自定义负载均衡算法 ,你只需要实现 IRule 接口,然后修改配置文件或者自定义 Java Config 类。

什么是 Open Feign

有了 Eureka,RestTemplateRibbon 我们就可以????愉快地进行服务间的调用了,但是使用 RestTemplate 还是不方便,我们每次都要进行这样的调用。

@Autowired
private RestTemplate restTemplate;
// 这里是提供者A的ip地址,但是如果使用了 Eureka 那么就应该是提供者A的名称
private static final String SERVICE_PROVIDER_A = "http://localhost:8081";@PostMapping("/judge")
public boolean judge(@RequestBody Request request) {String url = SERVICE_PROVIDER_A + "/service1";// 是不是太麻烦了???每次都要 url、请求、返回类型的return restTemplate.postForObject(url, request, Boolean.class);
}

这样每次都调用 RestRemplateAPI 是否太麻烦,我能不能像调用原来代码一样进行各个服务间的调用呢?

????????????聪明的小朋友肯定想到了,那就用 映射 呀,就像域名和IP地址的映射。我们可以将被调用的服务代码映射到消费者端,这样我们就可以 “无缝开发” 啦。

OpenFeign 也是运行在消费者端的,使用 Ribbon 进行负载均衡,所以 OpenFeign 直接内置了 Ribbon。

在导入了 Open Feign 之后我们就可以进行愉快编写  Consumer 端代码了。

// 使用 @FeignClient 注解来指定提供者的名字
@FeignClient(value = "eureka-client-provider")
public interface TestClient {// 这里一定要注意需要使用的是提供者那端的请求相对路径,这里就相当于映射了@RequestMapping(value = "/provider/xxx",method = RequestMethod.POST)CommonResponse<List<Plan>> getPlans(@RequestBody planGetRequest request);
}

然后我们在 Controller 就可以像原来调用 Service 层代码一样调用它了。

@RestController
public class TestController {// 这里就相当于原来自动注入的 Service@Autowiredprivate TestClient testClient;// controller 调用 service 层代码@RequestMapping(value = "/test", method = RequestMethod.POST)public CommonResponse<List<Plan>> get(@RequestBody planGetRequest request) {return testClient.getPlans(request);}
}

必不可少的 Hystrix

什么是 Hystrix之熔断和降级

在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。Hystrix是一个库,可通过添加等待时间容限和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性。

总体来说 [Hystrix](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) 就是一个能进行 熔断降级 的库,通过使用它能提高整个系统的弹性。

那么什么是 熔断和降级 呢?再举个????,此时我们整个微服务系统是这样的。服务A调用了服务B,服务B再调用了服务C,但是因为某些原因,服务C顶不住了,这个时候大量请求会在服务C阻塞。

服务C阻塞了还好,毕竟只是一个系统崩溃了。但是请注意这个时候因为服务C不能返回响应,那么服务B调用服务C的的请求就会阻塞,同理服务B阻塞了,那么服务A也会阻塞崩溃。

请注意,为什么阻塞会崩溃。因为这些请求会消耗占用系统的线程、IO 等资源,消耗完你这个系统服务器不就崩了么。

这就叫 服务雪崩 。妈耶,上面两个 熔断降级 你都没给我解释清楚,你现在又给我扯什么 服务雪崩 ?????????????

别急,听我慢慢道来。

不听我也得讲下去!

所谓 熔断 就是服务雪崩的一种有效解决方案。当指定时间窗内的请求失败率达到设定阈值时,系统将通过 断路器 直接将此请求链路断开。

也就是我们上面服务B调用服务C在指定时间窗内,调用的失败率到达了一定的值,那么 [Hystrix](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) 则会自动将 服务B与C 之间的请求都断了,以免导致服务雪崩现象。

其实这里所讲的 熔断 就是指的 [Hystrix](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) 中的 断路器模式 ,你可以使用简单的 @[Hystrix](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q)Command 注解来标注某个方法,这样 [Hystrix](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) 就会使用 断路器 来“包装”这个方法,每当调用时间超过指定时间时(默认为1000ms),断路器将会中断对这个方法的调用。

当然你可以对这个注解的很多属性进行设置,比如设置超时时间,像这样。

@HystrixCommand(commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1200")}
)
public List<Xxx> getXxxx() {// ...省略代码逻辑
}

但是,我查阅了一些博客,发现他们都将 熔断降级 的概念混淆了,以我的理解,降级是为了更好的用户体验,当一个方法调用异常时,通过执行另一种代码逻辑来给用户友好的回复 。这也就对应着 [Hystrix](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q)后备处理 模式。你可以通过设置 fallbackMethod 来给一个方法设置备用的代码逻辑。比如这个时候有一个热点新闻出现了,我们会推荐给用户查看详情,然后用户会通过id去查询新闻的详情,但是因为这条新闻太火了(比如最近什么*易对吧),大量用户同时访问可能会导致系统崩溃,那么我们就进行 服务降级 ,一些请求会做一些降级处理比如当前人数太多请稍后查看等等。

// 指定了后备方法调用
@HystrixCommand(fallbackMethod = "getHystrixNews")
@GetMapping("/get/news")
public News getNews(@PathVariable("id") int id) {// 调用新闻系统的获取新闻api 代码逻辑省略
}
//
public News getHystrixNews(@PathVariable("id") int id) {// 做服务降级// 返回当前人数太多,请稍后查看
}

什么是Hystrix之其他

我在阅读 《Spring微服务实战》这本书的时候还接触到了一个舱壁模式 的概念。在不使用舱壁模式的情况下,服务A调用服务B,这种调用默认的是使用同一批线程来执行 的,而在一个服务出现性能问题的时候,就会出现所有线程被刷爆并等待处理工作,同时阻塞新请求,最终导致程序崩溃。而舱壁模式会将远程资源调用隔离在他们自己的线程池中,以便可以控制单个表现不佳的服务,而不会使该程序崩溃。

具体其原理我推荐大家自己去了解一下,本篇文章中对舱壁模式 不做过多解释。当然还有 [Hystrix](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) 仪表盘 ,它是用来实时监控 [Hystrix](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) 的各项指标信息的 ,这里我将这个问题也抛出去,希望有不了解的可以自己去搜索一下。

微服务网关——Zuul

ZUUL 是从设备和 web 站点到 Netflix 流应用后端的所有请求的前门。作为边界服务应用,ZUUL 是为了实现动态路由、监视、弹性和安全性而构建的。它还具有根据情况将请求路由到多个 Amazon Auto Scaling Groups(亚马逊自动缩放组,亚马逊的一种云计算方式) 的能力

在上面我们学习了 Eureka 之后我们知道了 服务提供者消费者 通过 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server 进行访问的,即 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server服务提供者 的统一入口。那么整个应用中存在那么多 消费者 需要用户进行调用,这个时候用户该怎样访问这些 消费者工程 呢?当然可以像之前那样直接访问这些工程。但这种方式没有统一的消费者工程调用入口,不便于访问与管理,而 Zuul 就是这样的一个对于 消费者 的统一入口。

如果学过前端的肯定都知道 Router 吧,比如 Flutter 中的路由,Vue,React中的路由,用了 Zuul 你会发现在路由功能方面和前端配置路由基本是一个理。???? 我偶尔撸撸 Flutter。

大家对网关应该很熟吧,简单来讲网关是系统唯一对外的入口,介于客户端与服务器端之间,用于对请求进行鉴权限流路由监控 等功能。

没错,网关有的功能,Zuul 基本都有。而 Zuul 中最关键的就是 路由和过滤器 了,在官方文档中 Zuul 的标题就是

Router and Filter : Zuul

Zuul 的路由功能

简单配置

本来想给你们复制一些代码,但是想了想,因为各个代码配置比较零散,看起来也比较零散,我决定还是给你们画个图来解释吧。

请不要因为我这么好就给我点赞 ???? 。疯狂暗示。

比如这个时候我们已经向 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server 注册了两个 Consumer 、三个 Provicer ,这个时候我们再加个 Zuul 网关应该变成这样子了。

emmm,信息量有点大,我来解释一下。关于前面的知识我就不解释了???? 。

首先,Zuul 需要向 Eureka 进行注册,注册有啥好处呢?

你傻呀,Consumer 都向 [Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) Server 进行注册了,我网关是不是只要注册就能拿到所有 Consumer 的信息了?

拿到信息有什么好处呢?

我拿到信息我是不是可以获取所有的 Consumer 的元数据(名称,ip,端口)?

拿到这些元数据有什么好处呢?拿到了我们是不是直接可以做路由映射 ?比如原来用户调用 Consumer1 的接口 localhost:8001/studentInfo/update 这个请求,我们是不是可以这样进行调用了呢?localhost:9000/consumer1/studentInfo/update 呢?你这样是不是恍然大悟了?

这里的url为了让更多人看懂所以没有使用 restful 风格。

上面的你理解了,那么就能理解关于 Zuul 最基本的配置了,看下面。

server:port: 9000
eureka:client:service-url:# 这里只要注册 Eureka 就行了defaultZone: http://localhost:9997/eureka

然后在启动类上加入 @EnableZuulProxy 注解就行了。没错,就是那么简单????。

统一前缀

这个很简单,就是我们可以在前面加一个统一的前缀,比如我们刚刚调用的是 localhost:9000/consumer1/studentInfo/update,这个时候我们在 yaml 配置文件中添加如下。

zuul:prefix: /zuul

这样我们就需要通过 localhost:9000/zuul/consumer1/studentInfo/update 来进行访问了。

路由策略配置

你会发现前面的访问方式(直接使用服务名),需要将微服务名称暴露给用户,会存在安全性问题。所以,可以自定义路径来替代微服务名称,即自定义路由策略。

zuul:routes:consumer1: /FrancisQ1/**consumer2: /FrancisQ2/**

这个时候你就可以使用 localhost:9000/zuul/FrancisQ1/studentInfo/update 进行访问了。

服务名屏蔽

这个时候你别以为你好了,你可以试试,在你配置完路由策略之后使用微服务名称还是可以访问的,这个时候你需要将服务名屏蔽。

zuul:ignore-services: "*"

路径屏蔽

Zuul 还可以指定屏蔽掉的路径 URI,即只要用户请求中包含指定的 URI 路径,那么该请求将无法访问到指定的服务。通过该方式可以限制用户的权限。

zuul:ignore-patterns: **/auto/**

这样关于 auto 的请求我们就可以过滤掉了。

** 代表匹配多级任意路径

*代表匹配一级任意路径

敏感请求头屏蔽

默认情况下,像 Cookie、Set-Cookie 等敏感请求头信息会被 zuul 屏蔽掉,我们可以将这些默认屏蔽去掉,当然,也可以添加要屏蔽的请求头。

Zuul 的过滤功能

如果说,路由功能是 Zuul 的基操的话,那么过滤器 就是 Zuul的利器了。毕竟所有请求都经过网关(Zuul),那么我们可以进行各种过滤,这样我们就能实现 限流灰度发布权限控制 等等。

简单实现一个请求时间日志打印

要实现自己定义的 Filter 我们只需要继承 ZuulFilter 然后将这个过滤器类以 @Component 注解加入 Spring 容器中就行了。

在给你们看代码之前我先给你们解释一下关于过滤器的一些注意点。

过滤器类型:Pre、Routing、Post。前置Pre就是在请求之前进行过滤,Routing路由过滤器就是我们上面所讲的路由策略,而Post后置过滤器就是在 Response 之前进行过滤的过滤器。你可以观察上图结合着理解,并且下面我会给出相应的注释。

// 加入Spring容器
@Component
public class PreRequestFilter extends ZuulFilter {// 返回过滤器类型 这里是前置过滤器@Overridepublic String filterType() {return FilterConstants.PRE_TYPE;}// 指定过滤顺序 越小越先执行,这里第一个执行// 当然不是只真正第一个 在Zuul内置中有其他过滤器会先执行// 那是写死的 比如 SERVLET_DETECTION_FILTER_ORDER = -3@Overridepublic int filterOrder() {return 0;}// 什么时候该进行过滤// 这里我们可以进行一些判断,这样我们就可以过滤掉一些不符合规定的请求等等@Overridepublic boolean shouldFilter() {return true;}// 如果过滤器允许通过则怎么进行处理@Overridepublic Object run() throws ZuulException {// 这里我设置了全局的RequestContext并记录了请求开始时间RequestContext ctx = RequestContext.getCurrentContext();ctx.set("startTime", System.currentTimeMillis());return null;}
}// lombok的日志
@Slf4j
// 加入 Spring 容器
@Component
public class AccessLogFilter extends ZuulFilter {// 指定该过滤器的过滤类型// 此时是后置过滤器@Overridepublic String filterType() {return FilterConstants.POST_TYPE;}// SEND_RESPONSE_FILTER_ORDER 是最后一个过滤器// 我们此过滤器在它之前执行@Overridepublic int filterOrder() {return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}// 过滤时执行的策略@Overridepublic Object run() throws ZuulException {RequestContext context = RequestContext.getCurrentContext();HttpServletRequest request = context.getRequest();// 从RequestContext获取原先的开始时间 并通过它计算整个时间间隔Long startTime = (Long) context.get("startTime");// 这里我可以获取HttpServletRequest来获取URI并且打印出来String uri = request.getRequestURI();long duration = System.currentTimeMillis() - startTime;log.info("uri: " + uri + ", duration: " + duration / 100 + "ms");return null;}
}

上面就简单实现了请求时间日志打印功能,你有没有感受到 Zuul 过滤功能的强大了呢?

没有?好的、那我们再来。

令牌桶限流

当然不仅仅是令牌桶限流方式,Zuul 只要是限流的活它都能干,这里我只是简单举个????。

我先来解释一下什么是 令牌桶限流 吧。

首先我们会有个桶,如果里面没有满那么就会以一定 固定的速率 会往里面放令牌,一个请求过来首先要从桶中获取令牌,如果没有获取到,那么这个请求就拒绝,如果获取到那么就放行。很简单吧,啊哈哈、

下面我们就通过 Zuul 的前置过滤器来实现一下令牌桶限流。

@Component
@Slf4j
public class RouteFilter extends ZuulFilter {// 定义一个令牌桶,每秒产生2个令牌,即每秒最多处理2个请求private static final RateLimiter RATE_LIMITER = RateLimiter.create(2);@Overridepublic String filterType() {return FilterConstants.PRE_TYPE;}@Overridepublic int filterOrder() {return -5;}@Overridepublic Object run() throws ZuulException {log.info("放行");return null;}@Overridepublic boolean shouldFilter() {RequestContext context = RequestContext.getCurrentContext();if(!RATE_LIMITER.tryAcquire()) {log.warn("访问量超载");// 指定当前请求未通过过滤context.setSendZuulResponse(false);// 向客户端返回响应码429,请求数量过多context.setResponseStatusCode(429);return false;}return true;}
}

这样我们就能将请求数量控制在一秒两个,有没有觉得很酷?

关于 Zuul  的其他

Zuul 的过滤器的功能肯定不止上面我所实现的两种,它还可以实现 权限校验 ,包括我上面提到的 灰度发布 等等。

当然,Zuul 作为网关肯定也存在 单点问题 ,如果我们要保证 Zuul 的高可用,我们就需要进行 Zuul 的集群配置,这个时候可以借助额外的一些负载均衡器比如 Nginx

Spring Cloud配置管理——Config

为什么要使用进行配置管理?

当我们的微服务系统开始慢慢地庞大起来,那么多 ConsumerProvider[Eureka](https://mp.weixin.qq.com/s/etloMGMydBgC0Ll1yBgx8Q) ServerZuul 系统都会持有自己的配置,这个时候我们在项目运行的时候可能需要更改某些应用的配置,如果我们不进行配置的统一管理,我们只能去每个应用下一个一个寻找配置文件然后修改配置文件再重启应用

首先对于分布式系统而言我们就不应该去每个应用下去分别修改配置文件,再者对于重启应用来说,服务无法访问所以直接抛弃了可用性,这是我们更不愿见到的。

那么有没有一种方法既能对配置文件统一地进行管理,又能在项目运行时动态修改配置文件呢?

那就是我今天所要介绍的 Spring Cloud Config

能进行配置管理的框架不止 Spring Cloud Config 一种,大家可以根据需求自己选择(disconf,阿波罗等等)。而且对于 Config 来说有些地方实现的不是那么尽人意。

Config 是什么

Spring Cloud Config 为分布式系统中的外部化配置提供服务器和客户端支持。使用 Config 服务器,可以在中心位置管理所有环境中应用程序的外部属性。

简单来说,Spring Cloud Config 就是能将各个 应用/系统/模块 的配置文件存放到 统一的地方然后进行管理 (Git 或者 SVN)。

你想一下,我们的应用是不是只有启动的时候才会进行配置文件的加载,那么我们的 Spring Cloud Config 就暴露出一个接口给启动应用来获取它所想要的配置文件,应用获取到配置文件然后再进行它的初始化工作。就如下图。

当然这里你肯定还会有一个疑问,如果我在应用运行时去更改远程配置仓库(Git)中的对应配置文件,那么依赖于这个配置文件的已启动的应用会不会进行其相应配置的更改呢?

答案是不会的。

什么?那怎么进行动态修改配置文件呢?这不是出现了 配置漂移 吗?你个渣男????,你又骗我!

别急嘛,你可以使用 Webhooks ,这是  github 提供的功能,它能确保远程库的配置文件更新后客户端中的配置信息也得到更新。

噢噢,这还差不多。我去查查怎么用。

慢着,听我说完,Webhooks 虽然能解决,但是你了解一下会发现它根本不适合用于生产环境,所以基本不会使用它的。

而一般我们会使用 Bus 消息总线 + Spring Cloud Config 进行配置的动态刷新。

引出 Spring Cloud Bus

用于将服务和服务实例与分布式消息系统链接在一起的事件总线。在集群中传播状态更改很有用(例如配置更改事件)。

你可以简单理解为 Spring Cloud Bus 的作用就是管理和广播分布式系统中的消息 ,也就是消息引擎系统中的广播模式。当然作为 消息总线Spring Cloud Bus 可以做很多事而不仅仅是客户端的配置刷新功能。

而拥有了 Spring Cloud Bus 之后,我们只需要创建一个简单的请求,并且加上 @ResfreshScope 注解就能进行配置的动态修改了,下面我画了张图供你理解。

总结

这篇文章中我带大家初步了解了 Spring Cloud 的各个组件,他们有

  • Eureka 服务发现框架

  • Ribbon 进程内负载均衡器

  • Open Feign 服务调用映射

  • Hystrix 服务降级熔断器

  • Zuul 微服务网关

  • Config 微服务统一配置中心

  • Bus 消息总线

如果你能这个时候能看懂下面那张图,也就说明了你已经对 Spring Cloud 微服务有了一定的架构认识。

(完)

近期精彩内容推荐:  

 有个程序媛上司是什么体验

 一个天才程序员的黑帮大佬人生

 200行Python代码做一个换脸程序

 在 IntelliJ IDEA 中使用 Git,太方便了!

在看点这里好文分享给更多人↓↓

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

相关文章

  1. 关于微信小程序getUserInfo最新修改后,如何在原有项目的授权逻辑的调整

    今天一大早调试小程序,结果出现这个。。。微信小程序也是醉了,这么大的改动,也没有通过开发者服务号通知一声。人在屋檐下不得不低头(改呗,那么如何以最小的代价更新呢,下面给我的解决方案)原来我们在首次进入小程序时,会通过getUserInfo调起用户授权的弹窗,但是根…...

    2024/3/7 19:21:17
  2. 搞清楚clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop

    每个HTML元素都具有clientHeight offsetHeight scrollHeight offsetTop scrollTop 这5个和元素高度、滚动、位置相关的属性,单凭单词很难搞清楚分别代表什么意思之间有什么区别。通过阅读它们的文档总结出规律如下: clientHeight和offsetHeight属性和元素的滚动、位置没有关系…...

    2024/3/7 19:21:16
  3. android 开发 checkBox的显示和隐藏

    首先使用findviewbyid得到这个checkbox;CheckBox pengRadioButton=(RadioButton) findViewById(R.id.peng);然后设置可见性 pengCheckBox.setVisibility(View.GONE); pengCheckBox.setVisibility(View.VISIBLE);...

    2024/3/7 19:21:16
  4. 微信小程序开发中常见问题的解决

    在微信小程序的开发过程中,会遇到各式各样的问题,本文主要是针对自己开发中遇到的问题,找到解决方案后的记录总结。1.控件中同时使用wx:if和wx:for导致无效的问题这个问题是一个朋友问到的,场景是一个类似微信朋友圈的列表数据,通过服务器的一个参数控制条目中图片的显示隐…...

    2024/3/11 21:18:00
  5. 《Verilog数字系统设计教程》夏宇闻 第四版思考题答案(第3章)

    1.模块由几个部分组成? 由描述接口和描述逻辑功能两部分组成。 2.端口分为几种? 三种:输出口,输入口,输入/输出口。 3.为什么端口要说明信号的位宽? 因为如果不说明信号的位宽可能会在信号发生改变时发生错误,不容易看出接收到的信号的数据宽度,就很难进行数据的处理。…...

    2024/3/4 8:34:21
  6. isa2004 sp3发布

    Microsoft Internet Security and Acceleration (ISA) Server 2004 Service Pack 3 (SP3) 提供了最新的 ISA Server2004 Standard Edition 和 Enterprise Edition 更新,并具有增强的安全性、新增的功能以及改进的功能。此外,此 Service Pack 还提供改进的疑难解答选项,旨在帮…...

    2024/3/21 9:34:12
  7. 微信小程序-项目初始化

    小程序是一个mvvm模型的框架,在js中有一个page,为一个页面的构造器,渲染页面的时候先装载json文件,配置当前的顶部导航,接着装载wxml文件,配置页面的DOM,在装载wxss,这个是样式文件,最后读取js文件,并根据页面中的Page函数即构造器中的内容,将wxml和data进行绑定,渲…...

    2024/3/4 8:34:19
  8. Spring Cloud 基于Spring Boot 2.x的服务注册与发现(Eureka)

    目录一.Spring Cloud 简介二.注册与发现三.创建服务注册中心四.创建服务提供者参考文献:一.Spring Cloud 简介Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,领导…...

    2024/3/28 22:10:04
  9. scrollHeight在IE和FF下的区别

    /***调整滚屏出现的弹出div位置差别的现象,这个只在IE下才有,在ff下不用调整*/ function getScollTop(){var eleHeight;if(document.documentElement){eleHeight = document.documentElement.scrollHeight-document.documentElement.clientHeight ;}else{eleHeight = documen…...

    2024/3/28 22:10:05
  10. 微信小程序云开发-微信小程序账号申请及新手环境配置

    申请一个微信小程序账号在微信开发时,我们yx时候可能需要用到微信小程序,微信小程序云开发需要使用注册的小程序appid,测试和游客进入是没有云开发的功能,所以我们需要注册一个微信小程序账号。在注册账号时要注意的是,是通过邮箱作为登录帐号进行注册,邮箱必须是未被微信…...

    2024/3/28 22:10:01
  11. android studio checkbox隐藏和显示在recyclerview中

    首先在mainactivity中: boolean is_in_action_mode=false; 在onBindViewHolder 中: if (!mainActivity.is_in_action_mode){holder.checkBox.setVisibility(View.GONE); }else {holder.checkBox.setVisibility(View.VISIBLE);holder.checkBox.setChecked(false); }...

    2024/3/28 22:10:01
  12. Verilog RTL新手实验分析总结

    想要交流的,关注公众号,后台联系即可Verilog RTL 代码设计新手上路 通过对杜老师新手代码的抄写,并对学生实验进行验证,练习和体会到了Verilog语言常用的语法,同时,结合夏宇闻老师的《Verilog数字系统设计教程》,对Verilog语言以及RTL电路有了初步的认识。 多路选择器 m…...

    2024/3/7 19:21:09
  13. git操作教程详解

    一章 给心急者1.1 git是什么git是一种版本控制器.更直白说,团队开发时,管理代码用的软件.面试时,容易被问到的一个东西.1.2 安装git在Linux,Mac,Win下都可以安装.本文是以Win7系统为环境编写的.Window环境:到 https://git-for-windows.github.io/ 下载软件, 双击,一路"Ne…...

    2024/3/7 19:21:08
  14. 浏览器窗口尺寸clientHeight / scrollHeight / offsetHeight / innerHeight

    https://www.cnblogs.com/nanshanlaoyao/p/5964730.html clientHeight:元素客户区的大小,指的是元素内容及其边框所占据的空间大小(经过实践取出来的大多是视口大小) scrollHeight: 滚动大小,指的是包含滚动内容的元素大小(元素内容的总高度) offsetHeight: 偏移量,包含…...

    2024/3/7 19:21:07
  15. 微信小程序开发知识点总结

    微信小程序开发知识点总结微信小程序的目录结构1.外联公共样式的方法根据微信的官方文档,是支持@import的方式一如外联的公共样式的使用@import语句可以导入外联样式表,@import后跟需要导入的外联样式表的相对路径,用;表示语句结束。文档地址:https://mp.weixin.qq.com/deb…...

    2024/3/7 19:21:06
  16. 【转】牛仔裤品牌介绍大全

    LevisLevis 是来自美国西部最闻名的名字之一。它也是世界第一条牛仔裤的发明人Levi Strauss(利瓦伊史特劳斯)的名字。 Levi Strauss于1847年十七岁时从德国移民至纽约。几乎完全不会讲英语的他在美国的起初几年是为他的两名兄长打工。他在纽约及肯德基一带的偏僻市镇和乡村到处…...

    2024/3/7 19:21:05
  17. [javascript]让滚动条显示最下面的内容及scrollTop和scrollHeight

    今天在自己做聊天室的时候发现最下面内容不会显示,所有查阅资料,解决了问题 问题:如何让滚动条显示最下面的内容? 需求:内容后不段添加,添加的内容显示在后面,超过高度会显示滚动条。现在想实现,将数据停留在滚动条的最后。 解决方案:设置scrollTop的值:$("#div…...

    2024/3/7 19:21:04
  18. 【教程】数电基础与Verilog设计(一)

    本文为明德扬原创及录用文章,转载请注明出处! 作者:轩工 一、概述二、 基本概念 2.1 数字电路2.2 硬件电路2.3 数制 2.3.1 进制转换表2.4 编码2.5 逻辑代数基础 2.5.1 布尔代数2.5.2 基本逻辑运算2.5.3 基本逻辑表达2.5.4 逻辑函数2.6 电路分类2.7 建模 2.7.1 建模概述2…...

    2024/3/14 8:09:01
  19. 完成架构搭建 — iBrand Laravel API 0.5

    重要通知: Laravel + 小程序的开源电商版本源码已经在 github 上拉,欢迎提交 issue 和 star :) 开源电商 Server 端: Laravel API源码 开源电商 client 端:小程序源码 iBrand 系统在搭建的时候,最注重的就是可复用性,希望通过产品+项目的方式积累下来的代码能够重复使用…...

    2024/3/7 19:21:02
  20. 微信小程序_仿QQ

    https://github.com/xiehui999/SmallAppForQQ创建微信小程序(微信应用号),后续开发仿QQ应用程序实现微信小程序(微信应用号)QQ进度更新:2016/09/25 00:37 Add images,Realization funnction QQ tab.2016/09/25 12:28 Create pages of message,contact,dynamic and create d…...

    2024/3/7 19:21:01

最新文章

  1. 程序汪若依微服务华为云Linux部署保姆教程

    若依官方有3个版本&#xff0c;程序汪以前已经出了对应的安装部署视频教程 单应用版本 前后分离版本 微服务版本 本视频是若依微服务版本&#xff0c;如果基础的环境软件都不会安装建议看下程序汪的单应用和前后端分离版本教程&#xff0c; 欢迎点击进入 &#xff08;单应…...

    2024/3/29 20:50:05
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. 跨境专用链路 助力畅快上网

    在当今数字化快速发展的时代&#xff0c;网络连接的稳定性和高效性对于企业的业务运营至关重要。为了满足客户在不同地域间畅快上网的需求&#xff0c;我们为您提供了具备专属IP地址和独享带宽的专用链路。无论是在境内还是境外&#xff0c;我们都能为您提供多种速率的实时在线…...

    2024/3/29 20:15:01
  4. 设计模式——观察者模式Observer

    Q&#xff1a;观察者模式属于哪一类设计模式 A&#xff1a;观察者模式属于行为学模式 Q&#xff1a;什么是观察者模式 A&#xff1a;当一个对象的状态发生改变时&#xff0c;所有依赖它的对象都得到通知&#xff0c;并自动更新 观察者模式解析&#xff1a;报纸类维护了一个…...

    2024/3/28 7:29:11
  5. 【外汇早评】美通胀数据走低,美元调整

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

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

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

    2024/3/29 18:08:34
  7. 【外汇周评】靓丽非农不及疲软通胀影响

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

    2024/3/29 2:45:46
  8. 【原油贵金属早评】库存继续增加,油价收跌

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

    2024/3/29 16:26:39
  9. 【外汇早评】日本央行会议纪要不改日元强势

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

    2024/3/29 5:19:52
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

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

    2024/3/29 18:08:00
  11. 【外汇早评】美欲与伊朗重谈协议

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

    2024/3/29 11:11:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

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

    2024/3/29 1:13:26
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

    2024/3/29 8:28:16
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

    2024/3/29 7:41:19
  15. 【外汇早评】美伊僵持,风险情绪继续升温

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

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

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

    2024/3/29 9:57:23
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/3/29 0:49:46
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/3/29 18:06:57
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

    2024/3/29 17:27:19
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

    2024/3/29 18:06:36
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

    2024/3/29 18:06:22
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

    2024/3/28 18:26:34
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/3/29 18:06:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/3/28 20:09:10
  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