SpringCloud GitHub Demo(看完文章的同学可以自己练手玩玩):

  • https://github.com/ZhongFuCheng3y/msc-Demo

项目结构图:

 

二、集群/分布式/微服务/SOA是什么?

像我这种技术小白,看到这些词(集群/分布式/微服务/SOA)的时候,感觉就是遥不可及的(高大尚的技术!!)。就好像刚学Java面向对象的时候,在论坛上翻阅资料的时候,无意看到"面向切面编程",也认为这是遥不可及的(高大尚的技术!!)。

但真正接触到"面向切面编程"的时候,发现原来就是如此啊,也没什么大不了的。只不过当时被它的名字给唬住了...

不知道各位在刚接触这些名字集群/分布式/微服务/SOA的时候,有没有被唬住了呢??

  • 下面我就简单说说这些名词的意思

2.1什么是集群

以下内容来源维基百科:

计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多

集群技术特点:

  • 通过多台计算机完成同一个工作,达到更高的效率。
  • 两机或多机内容、工作过程等完全一样。如果一台死机,另一台可以起作用。

在维基百科上说得也挺明白的了,我来举个例子吧。

  • 小周在公司写Java程序,但公司业务在发展,一个Java开发者可能忙不过来,小周有的时候也得请个假呀。于是请了3y过去一起做Java开发。平时小周和3y就写Java程序,但3y可能有事要回学校一趟。没事,公司还有小周做Java开发呢,公司开发还能继续运作。
    • 3y跟小周都是做Java开发
    • 3y来了,小周的工作可以分担一些。
    • 3y请假了,还有小周在呢。

 

我写了一个910便利网发布到服务器去了,现在越来越多的人访问了,访问有点慢,怎么办???很简单,(只有充钱才能变强),加配置吧(加cpu,加内存)。升级完配置之后,访问人数越来越多,于是发现又不禁用啦,在这台机器上加配置已经解决不了了,怎么办???很简单,(只有充钱才能变强),我再买一台服务器,将910便利网也发布到新买的这台服务器上去

特点:

  • 这两台服务器都是运行同一个系统--->910便利网

好处:

  • 本来只有一台机器处理访问,现在有两台机器处理访问了,分担了压力
  • 如果其中一台忘记缴费了,暂时用不了了。没关系,还有另一台可以用呢。

集群:同一个业务,部署在多个服务器上(不同的服务器运行同样的代码,干同一件事)

2.2什么是分布式

以下内容来源维基百科:

分布式系统是一组计算机,通过网络相互连接传递消息与通信后并协调它们的行为而形成的系统。组件之间彼此进行交互以实现一个共同的目标

我也来举个例子来说明一下吧:

  • 现在公司有小周和3y一起做Java开发,做Java开发一般jQuery,AJAX都能写一点,所以这些活都由我们来干。可是呢,3y对前端不是很熟,有的时候调试半天都调不出来。老板认为3y是真的菜!于是让小周专门来处理前端的事情。这样3y就高兴了,可以专心写自己的Java,前端就专门交由小周负责了。于是,小周和3y就变成了协作开发
    • 3y对前端不熟(能写出来),但在调试的时候可能会花费很多时间
    • 小周来专门做前端的事,3y可以专心写自己的Java程序了。
    • 都是为了项目正常运行以及迭代。

 

我的910便利网已经部署到两台服务器去了,但是越来越多的人去访问。现在也逐渐承受不住啦。那现在怎么办啊??那继续充钱变强??作为一个理智的我,肯定得想想是哪里有问题。现在910便利网的模块有好几个,全都丢在同一个Tomcat里边。

其实有些模块的访问是很低的(比如后台管理),那我可不可以这样做:将每个模块抽取独立出来,访问量大的模块用好的服务器装着,没啥人访问的模块用差的服务器装着。这样的好处是:一、资源合理利用了(没人访问的模块用性能差的服务器,访问量大的模块单独提升性能就好了)。二、耦合度降低了:每个模块独立出来,各干各的事(专业的人做专业的事),便于扩展

特点:

  • 将910便利网的功能拆分,模块之间独立,在使用的时候再将这些独立的模块组合起来就是一个系统了。

好处:

  • 模块之间独立,各做各的事,便于扩展,复用性高
  • 高吞吐量。某个任务需要一个机器运行10个小时,将该任务用10台机器的分布式跑(将这个任务拆分成10个小任务),可能2个小时就跑完了

分布式:一个业务分拆多个子业务,部署在不同的服务器上(不同的服务器,运行不同的代码,为了同一个目的)

2.3集群/分布式

集群和分布式并不冲突,可以有分布式集群

现在3y的公司规模变大了,有5个小伙子写Java,4个小伙子写前端,2个小伙子做测试,1个小伙子做DBA。

  • Java,前端,测试,DBA的关系看作是分布式的
  • 5个Java看作是集群的(前端,测试同理)...

2.4分布式/微服务/SOA

其实我认为分布式/微服务/SOA这三个概念是差不多的,了解了其中的一个,然后将自己的理解往上面套就好了。没必要细分每个的具体概念~~(当然了,我很期待有大佬可以在评论区留言说下自己的看法哈)

参考资料:

  • 分布式与集群的区别是什么?https://www.zhihu.com/question/20004877
  • 分布式、集群、微服务、SOA 之间的区别https://blog.csdn.net/heatdeath/article/details/79038795

三、CAP理论

从上面所讲的分布式概念我们已经知道,分布式简单理解就是:一个业务分拆多个子业务,部署在不同的服务器上

  • 一般来说,一个子业务我们称为节点

如果你接触过一些分布式的基础概念,那肯定会听过CAP这个理论。就比如说:你学了MySQL的InnoDB存储引擎相关知识,你肯定听过ACID!

首先,我们来看一下CAP分别代表的是什么意思:

  • C:数据一致性(consistency)
    • 所有节点拥有数据的最新版本
  • A:可用性(availability)
    • 数据具备高可用性
  • P:分区容错性(partition-tolerance)
    • 容忍网络出现分区,分区之间网络不可达。

 

下面有三个节点(它们是集群的),此时三个节点都能够相互通信:

 

 

由于我们的系统是分布式的,节点之间的通信是通过网络来进行的。只要是分布式系统,那很有可能会出现一种情况:因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域

  • 数据就散布在了这些不连通的区域中,这就叫分区

 

 

现在出现了网络分区后,此时有一个请求过来了,想要注册一个账户。

 

 

此时我们节点一和节点三是不可通信的,这就有了抉择:

  • 如果允许当前用户注册一个账户,此时注册的记录数据只会在节点一和节点二或者节点二和节点三同步,因为节点一和节点三的记录不能同步的。
    • 这种情况其实就是选择了可用性(availability),抛弃了数据一致性(consistency)
  • 如果不允许当前用户注册一个账户(就是要等到节点一和节点三恢复通信)。节点一和节点三一旦恢复通信,我们就可以保证节点拥有的数据是最新版本
    • 这种情况其实就是抛弃了可用性(availability),选择了数据一致性(consistency)

 

3.1再次梳理一下CAP理论

一般我们说的分布式系统,P:分区容错性(partition-tolerance)这个是必需的,这是客观存在的。

CAP是无法完全兼顾的,从上面的例子也可以看出,我们可以选AP,也可以选CP。但是,要注意的是:不是说选了AP,C就完全抛弃了。不是说选了CP,A就完全抛弃了!

在CAP理论中,C所表示的一致性是强一致性(每个节点的数据都是最新版本),其实一致性还有其他级别的:

  • 弱一致性:弱一致性是相对于强一致性而言,它不保证总能得到最新的值;
  • 最终一致性(eventual consistency):放宽对时间的要求,在被调完成操作响应后的某个时间点,被调多个节点的数据最终达成一致

可用性的值域可以定义成0到100%的连续区间

 

 

所以,CAP理论定义的其实是在容忍网络分区的条件下,“强一致性”和“极致可用性”无法同时达到

参考资料:

  • CAP理论中的P到底是个什么意思?https://www.zhihu.com/question/54105974
  • 浅谈分布式系统的基本问题:可用性与一致性:https://m.aliyun.com/yunqi/articles/2709
  • 分布式系统的CAP理论:http://www.hollischuang.com/archives/666
  • 为什么CAP理论在舍弃P的情况下,可以有完美的CA?https://www.zhihu.com/question/285878189
  • 不懂点CAP理论,你好意思说你是做分布式的吗?http://www.yunweipai.com/archives/8432.html

扩展阅读:

  • 浅谈分布式事务:https://m.aliyun.com/yunqi/articles/230242

四、SpringCloud就是这么简单

相信大家读到这里,对分布式/微服务已经有一定的了解了,其实单从概念来说,是非常容易理解的。只是很可能被它的名字给唬住了。

下面我就来讲讲SpringCloud最基础的知识~

4.1为什么需要SpringCloud?

前面也讲了,从分布式/微服务的角度而言:就是把我们一的项目,分解成多个的模块。这些小的模块组合起来,完成功能。

举个可能不太恰当的例子(现实可能不会这么拆分,但意思到位就好了):

 

 

拆分出多个模块以后,就会出现各种各样的问题,而SpringCloud提供了一整套的解决方案!

  • 注:这些模块是独立成一个子系统的(不同主机)。

SpringCloud的基础功能

  • 服务治理: Spring Cloud Eureka
  • 客户端负载均衡: Spring Cloud Ribbon
  • 服务容错保护: Spring Cloud Hystrix
  • 声明式服务调用: Spring Cloud Feign
  • API网关服务:Spring Cloud Zuul
  • 分布式配置中心: Spring Cloud Config

SpringCloud的高级功能(本文不讲):

  • 消息总线: Spring Cloud Bus
  • 消息驱动的微服务: Spring Cloud Stream
  • 分布式服务跟踪: Spring Cloud Sleuth

五、引出Eureka

那会出现什么问题呢??首当其冲的就是子系统之间的通讯问题。子系统与子系统之间不是在同一个环境下,那就需要远程调用。远程调用可能就会想到httpClient,WebService等等这些技术来实现。

既然是远程调用,就必须知道ip地址,我们可能有以下的场景。

  • 功能实现一:A服务需要调用B服务
    • 在A服务的代码里面调用B服务,显式通过IP地址调用http://123.123.123.123:8888/java3y/3
  • 功能实现二:A服务调用B服务,B服务调用C服务,C服务调用D服务
    • 在A服务的代码里面调用B服务,显式通过IP地址调用:http://123.123.123.123:8888/java3y/3,(同样地)B->C,C->D
  • 功能实现三:D服务调用B服务,B服务调用C服务
    • 在D服务的代码里面调用B服务,显式通过IP地址调用:http://123.123.123.123:8888/java3y/3,(同样地)B->C

 

  • .....等等等等

万一,我们B服务的IP地址变了,想想会出现什么问题:A服务,D服务(等等)需要手动更新B服务的地址

  • 在服务多的情况下,手动来维护这些静态配置就是噩梦!
为了解决微服务架构中的服务实例维护问题(ip地址), 产生了大量的服务治理框架和产品。 这些框架和产品的实现都围绕着服务注册与服务发现机制来完成对微服务应用实例的自动化管理

在SpringCloud中我们的服务治理框架一般使用的就是Eureka。

我们的问题:

  • 现在有A、B、C、D四个服务,它们之间会互相调用(而且IP地址很可能会发生变化),一旦某个服务的IP地址变了,那服务中的代码要跟着变,手动维护这些静态配置(IP)非常麻烦!

Eureka是这样解决上面所说的情况的:

  • 创建一个E服务,将A、B、C、D四个服务的信息都注册到E服务上,E服务维护这些已经注册进来的信息

 

 

A、B、C、D四个服务都可以拿到Eureka(服务E)那份注册清单。A、B、C、D四个服务互相调用不再通过具体的IP地址,而是通过服务名来调用

  • 拿到注册清单--->注册清单上有服务名--->自然就能够拿到服务具体的位置了(IP)。
  • 其实简单来说就是:代码中通过服务名找到对应的IP地址(IP地址会变,但服务名一般不会变)

 

 

5.1Eureka细节

Eureka专门用于给其他服务注册的称为Eureka Server(服务注册中心),其余注册到Eureka Server的服务称为Eureka Client。

 

 

在Eureka Server一般我们会这样配置:

register-with-eureka: false     #false表示不向注册中心注册自己。fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务

Eureka Client分为服务提供者和服务消费者

  • 但很可能,某服务既是服务提供者又是服务消费者

如果在网上看到SpringCloud的某个服务配置没有"注册"到Eureka-Server也不用过于惊讶(但是它是可以获取Eureka服务清单的)

  • 很可能只是作者把该服务认作为单纯的服务消费者,单纯的服务消费者无需对外提供服务,也就无须注册到Eureka中了
eureka:client:register-with-eureka: false  # 当前微服务不注册到eureka中(消费端)service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

下面是Eureka的治理机制:

  • 服务提供者
    • 服务注册:启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息。
    • **服务续约:**在注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka Server: "我还活着 ” 、
    • 服务下线:当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server, 告诉服务注册中心:“我要下线了 ”。
  • 服务消费者
    • 获取服务:当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取上面注册的服务清单
    • 服务调用:服务消费者在获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例的元数据信息。在进行服务调用的时候,优先访问同处一个Zone中的服务提供方

 

  • Eureka Server(服务注册中心):
    • 失效剔除:默认每隔一段时间(默认为60秒) 将当前清单中超时(默认为90秒)没有续约的服务剔除出去
    • 自我保护:。EurekaServer 在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%(通常由于网络不稳定导致)。 Eureka Server会将当前的实例注册信息保护起来, 让这些实例不会过期,尽可能保护这些注册信息

 

最后,我们就有了这张图:

 

 

举个例子:

  • 3y跟女朋友去东站的东方宝泰逛街,但不知道东方宝泰有什么好玩的。于是就去物业搜了一下东方宝泰商户清单,发现一楼有优衣库,二楼有星巴克,三楼有麦当劳。
  • 在优衣库旁边,有新开张的KFC,在墙壁打上了很大的标识“欢迎KFC入驻东方宝泰”。
  • 商家们需要定时交物业费给物业。
  • 物业维持东方宝泰的稳定性。如果某个商家不想在东方宝泰运营了,告诉了物业。物业自然就会将其在东方宝泰商户清单去除。

优秀博文:

  • Spring Cloud Eureka详解:https://blog.csdn.net/sunhuiliang85/article/details/76222517
  • 《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka 的使用:https://zhuanlan.zhihu.com/p/26472547
  • 微服务架构:Eureka参数配置项详解:https://www.cnblogs.com/fangfuhai/p/7070325.html

六、引出RestTemplate和Ribbon

通过Eureka服务治理框架,我们可以通过服务名来获取具体的服务实例的位置了(IP)。一般在使用SpringCloud的时候不需要自己手动创建HttpClient来进行远程调用。

可以使用Spring封装好的RestTemplate工具类,使用起来很简单:

// 传统的方式,直接显示写死IP是不好的!//private static final String REST_URL_PREFIX = "http://localhost:8001";// 服务实例名private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";/*** 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap,* ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。*/@Autowiredprivate RestTemplate restTemplate;@RequestMapping(value = "/consumer/dept/add")public boolean add(Dept dept) {return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);}

为了实现服务的高可用,我们可以将服务提供者集群。比如说,现在一个秒杀系统设计出来了,准备上线了。在11月11号时为了能够支持高并发,我们开多台机器来支持并发量。

 

 

现在想要这三个秒杀系统合理摊分用户的请求(专业来说就是负载均衡),可能你会想到nginx。

其实SpringCloud也支持的负载均衡功能,只不过它是客户端的负载均衡,这个功能实现就是Ribbon!

负载均衡又区分了两种类型:

  • 客户端负载均衡(Ribbon)
    • 服务实例的清单在客户端,客户端进行负载均衡算法分配。
    • (从上面的知识我们已经知道了:客户端可以从Eureka Server中得到一份服务清单,在发送请求时通过负载均衡算法,在多个服务器之间选择一个进行访问)
  • 服务端负载均衡(Nginx)
    • 服务实例的清单在服务端,服务器进行负载均衡算法分配

 

所以,我们的图可以画成这样:

 

 

6.1Ribbon细节

Ribbon是支持负载均衡,默认的负载均衡策略是轮询,我们也是可以根据自己实际的需求自定义负载均衡策略的。

@Configuration
public class MySelfRule
{@Beanpublic IRule myRule(){//return new RandomRule();// Ribbon默认是轮询,我自定义为随机//return new RoundRobinRule();// Ribbon默认是轮询,我自定义为随机return new RandomRule_ZY();// 我自定义为每台机器5次}
}

实现起来也很简单:继承AbstractLoadBalancerRule类,重写public Server choose(ILoadBalancer lb, Object key)即可。

SpringCloud 在CAP理论是选择了AP的,在Ribbon中还可以配置重试机制的(有兴趣的同学可以去搜搜)~

举个例子:

  • 3y跟女朋友过了几个月,又去东方宝泰了。由于记性不好,又去物业那弄了一份东方宝泰商户清单。
  • 这次看到东方宝泰又开了一间麦当劳,一间在二楼,一间在三楼。原来生意太好了,为了能提高用户体验,在二楼多开了一间麦当劳
  • 这时,3y问女朋友:“去哪间麦当劳比较好?要不我们抛硬币决定?”3y女朋友说:”你是不是傻,肯定哪间近去哪间啊“

优秀博文:

  • 撸一撸Spring Cloud Ribbon的原理-负载均衡策略:https://www.cnblogs.com/kongxianghai/p/8477781.html

七、引出Hystrix

到目前为止,我们的服务看起来好像挺好的了:能够根据服务名来远程调用其他的服务,可以实现客户端的负载均衡。

 

 

但是,如果我们在调用多个远程服务时,某个服务出现延迟,会怎么样??

 

 

高并发的情况下,由于单个服务的延迟,可能导致所有的请求都处于延迟状态,甚至在几秒钟就使服务处于负载饱和的状态,资源耗尽,直到不可用,最终导致这个分布式系统都不可用,这就是“雪崩”。

 

 

针对上述问题, Spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能。

  • Fallback(失败快速返回):当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝), 向调用方返回一个错误响应, 而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延
  • 资源/依赖隔离(线程池隔离):它会为每一个依赖服务创建一个独立的线程池,这样就算某个依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响, 而不会拖慢其他的依赖服务

Hystrix提供几个熔断关键参数:滑动窗口大小(20)、 熔断器开关间隔(5s)、错误率(50%)

  • 每当20个请求中,有50%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。
  • 直到5s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开

Hystrix还有请求合并、请求缓存这样强大的功能,在此我就不具体说明了,有兴趣的同学可继续深入学习~

7.1Hystrix仪表盘

Hystrix仪表盘:它主要用来实时监控Hystrix的各项指标信息。通过Hystrix Dashboard反馈的实时信息,可以帮助我们快速发现系统中存在的问题,从而及时地采取应对措施。

启动时的页面:

 

 

监控单服务的页面:

 

 

我们现在的服务是这样的:

 

 

除了可以开启单个实例的监控页面之外,还有一个监控端点 /turbine.stream是对集群使用的。 从端点的命名中,可以引入Turbine, 通过它来汇集监控信息,并将聚合后的信息提供给 HystrixDashboard 来集中展示和监控

 

 

举个例子:

  • 3y和女朋友决定去万达玩,去到万达的停车场发现在负一层已经大大写上“负一层已停满,请下负二层,负二层空余停车位还有100个!”
  • 这时,3y就跟女朋友说:“万达停车场是做得挺好的,如果它没有直接告知我负一层已满,可能我就去负一层找位置了,要是一堆人跑去负一层但都找不到车位的话,恐怕就塞死了”。3y接着说:“看停车位的状态也做得不错,在停车位上头有一个感应(监控),如果是红色就代表已被停了,如果是绿色就说明停车位是空的”。
  • 3y女朋友不屑的说:“你话是真的多”

参考资料:

  • Hystrix ,为什么说它是每个系统不可或缺的开源框架?https://zhuanlan.zhihu.com/p/34304136
  • 深入理解Hystrix之文档翻译:https://zhuanlan.zhihu.com/p/28523060
  • 谈谈我对服务熔断、服务降级的理解:https://blog.csdn.net/guwei9111986/article/details/51649240
  • Hystrix几篇文章《青芒》:https://segmentfault.com/u/yedge/articles

八、引出Feign

上面已经介绍了Ribbon和Hystrix了,可以发现的是:他俩作为基础工具类框架广泛地应用在各个微服务的实现中。我们会发现对这两个框架的使用几乎是同时出现的。

为了简化我们的开发,Spring Cloud Feign出现了!它基于 Netflix Feign 实现,整合了 Spring Cloud Ribbon 与 Spring Cloud Hystrix, 除了整合这两者的强大功能之外,它还提 供了声明式的服务调用(不再通过RestTemplate)。

Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。

下面就简单看看Feign是怎么优雅地实现远程调用的:

服务绑定:

// value --->指定调用哪个服务
// fallbackFactory--->熔断器的降级提示
@FeignClient(value = "MICROSERVICECLOUD-DEPT", fallbackFactory = DeptClientServiceFallbackFactory.class)
public interface DeptClientService {// 采用Feign我们可以使用SpringMVC的注解来对服务进行绑定!@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)public Dept get(@PathVariable("id") long id);@RequestMapping(value = "/dept/list", method = RequestMethod.GET)public List<Dept> list();@RequestMapping(value = "/dept/add", method = RequestMethod.POST)public boolean add(Dept dept);
}

Feign中使用熔断器:

/*** Feign中使用断路器* 这里主要是处理异常出错的情况(降级/熔断时服务不可用,fallback就会找到这里来)*/
@Component // 不要忘记添加,不要忘记添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {@Overridepublic DeptClientService create(Throwable throwable) {return new DeptClientService() {@Overridepublic Dept get(long id) {return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭").setDb_source("no this database in MySQL");}@Overridepublic List<Dept> list() {return null;}@Overridepublic boolean add(Dept dept) {return false;}};}
}

调用:

 

 

九、引出Zuul

基于上面的学习,我们现在的架构很可能会设计成这样:

 

 

这样的架构会有两个比较麻烦的问题:

  1. 路由规则与服务实例的维护间题:外层的负载均衡(nginx)需要维护所有的服务实例清单(图上的OpenService)
  2. 签名校验、 登录校验冗余问题:为了保证对外服务的安全性, 我们在服务端实现的微服务接口,往往都会有一定的权限校验机制,但我们的服务是独立的,我们不得不在这些应用中都实现这样一套校验逻辑,这就会造成校验逻辑的冗余。

还是画个图来理解一下吧:

 

 

每个服务都有自己的IP地址,Nginx想要正确请求转发到服务上,就必须维护着每个服务实例的地址

  • 更是灾难的是:这些服务实例的IP地址还有可能会变,服务之间的划分也很可能会变。
http://123.123.123.123http://123.123.123.124http://123.123.123.125http://123.123.123.126http://123.123.123.127

购物车和订单模块都需要用户登录了才可以正常访问,基于现在的架构,只能在购物车和订单模块都编写校验逻辑,这无疑是冗余的代码。

为了解决上面这些常见的架构问题,API网关的概念应运而生。在SpringCloud中了提供了基于Netfl ix Zuul实现的API网关组件Spring Cloud Zuul

Spring Cloud Zuul是这样解决上述两个问题的:

  • SpringCloud Zuul通过与SpringCloud Eureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得了所有其他微服务的实例信息。外层调用都必须通过API网关,使得将维护服务实例的工作交给了服务治理框架自动完成
  • 在API网关服务上进行统一调用来对微服务接口做前置过滤,以实现对微服务接口的拦截和校验

Zuul天生就拥有线程隔离和断路器的自我保护功能,以及对服务调用的客户端负载均衡功能。也就是说:Zuul也是支持Hystrix和Ribbon

关于Zuul还有很多知识点(由于篇幅问题,这里我就不细说了):

  • 路由匹配(动态路由)
  • 过滤器实现(动态过滤器)
  • 默认会过滤掉Cookie与敏感的HTTP头信息(额外配置)

9.1可能对Zuul的疑问

Zuul支持Ribbon和Hystrix,也能够实现客户端的负载均衡。我们的Feign不也是实现客户端的负载均衡和Hystrix的吗?既然Zuul已经能够实现了,那我们的Feign还有必要吗?

 

 

或者可以这样理解:

  • zuul是对外暴露的唯一接口相当于路由的是controller的请求,而Ribbonhe和Fegin路由了service的请求
  • zuul做最外层请求的负载均衡 ,而Ribbon和Fegin做的是系统内部各个微服务的service的调用的负载均衡

有了Zuul,还需要Nginx吗?他俩可以一起使用吗?

  • 我的理解:Zuul和Nginx是可以一起使用的(毕竟我们的Zuul也是可以搭成集群来实现高可用的),要不要一起使用得看架构的复杂度了(业务)~~~

参考资料:

  • 微服务与API网关(上): 为什么需要API网关?:http://blog.didispace.com/hzf-ms-apigateway-1/
  • 谈谈 API 网关:https://www.jianshu.com/p/b52a2773e75f
  • 谈谈微服务中的 API 网关(API Gateway):https://www.cnblogs.com/savorboard/p/api-gateway.html
  • API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway :http://www.360doc.com/content/18/0208/05/46368139_728502763.shtml
  • 谈API网关的背景、架构以及落地方案:http://www.infoq.com/cn/news/2016/07/API-background-architecture-floo
  • zuul和nginx:https://zhuanlan.zhihu.com/p/37385481

十、引出SpringCloud Config

随着业务的扩展,我们的服务会越来越多,越来越多。每个服务都有自己的配置文件。

既然是配置文件,给我们配置的东西,那难免会有些改动的。

比如我们的Demo中,每个服务都写上相同的配置文件。万一我们有一天,配置文件中的密码需要更换了,那就得三个都要重新更改

 

 

在分布式系统中,某一个基础服务信息变更,都很可能会引起一系列的更新和重启

Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用

  • 简单来说,使用Spring Cloud Config就是将配置文件放到统一的位置管理(比如GitHub),客户端通过接口去获取这些配置文件。
  • 在GitHub上修改了某个配置文件,应用加载的就是修改后的配置文件。

 

 

SpringCloud Config其他的知识:

  • 在SpringCloud Config的服务端, 对于配置仓库的默认实现采用了Git,我们也可以配置SVN。
  • 配置文件内的信息加密和解密
  • 修改了配置文件,希望不用重启来动态刷新配置,配合Spring Cloud Bus 使用~

使用SpringCloud Config可能的疑问:application.yml和 bootstrap.yml区别

  • https://www.cnblogs.com/BlogNetSpace/p/8469033.html

总结

本文主要写了SpringCloud的基础知识,希望大家看完能有所帮助~

SpringCloud的资料也很多,我整理一些我认为比较好,想要深入的同学不妨看看下边的资源~~~

SpringCloud系列文章参考资料:

  • 史上最简单的 SpringCloud 教程 | 终章https://blog.csdn.net/forezp/article/details/70148833
  • Spring Cloud基础教程《程序员DD》http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/
  • Spring Cloud 系列文章《纯洁的微笑》:http://www.ityouknow.com/spring-cloud.html
  • SpringCloud系列文章:https://www.cnblogs.com/woshimrf/tag/SpringCloud/
  • SpringCloud系列文章《狂小白》:https://www.cnblogs.com/huangjuncong/tag/SpringCloud/
  • SpringCloud官方文档:http://projects.spring.io/spring-cloud/
  • Spring Cloud 中文文档:https://springcloud.cc/spring-cloud-dalston.html#_appendix_compendium_of_configuration_properties

参考书籍:

  • 《SpringCloud 微服务实战》

SpringCloud GitHub Demo(看完文章的同学可以自己练手玩玩,写好了ReadMe了):

  • https://github.com/ZhongFuCheng3y/msc-Demo

 

涵盖Java后端所有知识点的开源项目(已有5.8K star):https://github.com/ZhongFuCheng3y/3y

如果大家想要实时关注我更新的文章以及分享的干货的话,微信搜索Java3y

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

相关文章

  1. 基于阿里云 Vue+docker+niginx前端项目部署

    1.首先,将项目打包 npm run build可以看到文件夹中多了一个dist文件然后在根目录下创建两个文件,一个命名为Dockerfile,一个命名为default.conf。2.在阿里云上安装nginx 首先需要在你的阿里云中安装好docker,具体过程这边就不详细讲解了,大家可自行百度。安装完之后可以使…...

    2024/5/6 9:31:50
  2. QT入门1

    1.新建项目继续点Next2.设置一个开关 #include "mainwindow.h" #include "ui_mainwindow.h" #include "QPushButton" MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);QPushButton…...

    2024/4/10 12:27:07
  3. flink教程-详解flink 1.11 中的CDC (Change Data Capture)

    文章目录CDC简介CanalCanalJson反序列化源码解析 CDC简介 CDC,Change Data Capture,变更数据获取的简称,使用CDC我们可以从数据库中获取已提交的更改并将这些更改发送到下游,供下游使用。这些变更可以包括INSERT,DELETE,UPDATE等, 用户可以在以下的场景下使用CDC:使用flink…...

    2024/5/6 13:12:31
  4. 工作日记(十四):完整项目开发之el-date-picker标签的daterange的用法

    2020.7.24本次前端vue用到了这个代码://<el-date-picker type="daterange" v-model="startDate"> //<el-date-picker type="daterange" v-model="endDate"> //daterange对应的v-model是数组,存着两个Date类型而已 //typ…...

    2024/5/6 12:04:25
  5. 语义分割网络Unet

    参考UNET-2015 网络结构如上图,Unet 网络结构是对称的,形似英文字母 U 所以被称为 Unet。整张图都是由蓝/白色框与各种颜色的箭头组成,其中,蓝/白色框表示 feature map;蓝色箭头表示 3x3 卷积,用于特征提取;灰色箭头表示 skip-connection,用于特征融合;红色箭头表示池…...

    2024/5/6 6:56:51
  6. HDU - 6540

    题目链接:HDU - 6540树形dp,dp[x][i] 为距离节点 x 的最大关键节点距离为 i 的方案数。 我们先算不选当前节点的方案数。 对于儿子节点,直接组合即可。 然后再考虑一个儿子单独和根组合。 然后如果这个节点是关键节点,那么我们就让小于等于k的方案数 * 2 即可。AC代码: #p…...

    2024/4/10 12:27:07
  7. 通过QT自带帮助文档学习QT

    QT学习了一段时间,发现最重要的还是通过自带的帮助文档来查询函数使用。如今天我用到connect参数不匹配。no matching funtion for call to "出错语句。简单啊,直接用F1完事,右侧就可以看到具体的调用说明了。不懂的直接点击超链接可以继续阅读,唯一要求的就是英文好一…...

    2024/4/12 20:55:39
  8. Docker -- 编程开发Java

    Java 1 使用官方镜像 在容器中运行Java代码最简单的方法就是将Java编译指令直接写入Dockerfile,然后使用此Dockerfile 构建并运行此镜像,即可启动程序。具体步骤如下。 首先,从官方仓库获取某版本Java基础镜像: $ docker pull java:8编写Dockerfile,如下: FROM openjdk:8…...

    2024/5/6 12:28:12
  9. “西山居校园招聘”笔试

    笔试时间:2020/7/23 15:00 笔试时长:120分钟笔试岗位:测试开发工程师笔试题目:Q1:已知递归函数fact如下int fact(int n){if(n<=0)return 1;elsereturn n*fact(n-1);}上述递归函数执行fact(n)时调用该函数的次数为?A1:Q2:若声明一个浮点数组如下:float average[]=ne…...

    2024/4/10 12:59:59
  10. 【MySQL8.0创建用户,分配权限】

    1、查询当前有哪些账户select user,host from mysql.user;一般来说你会显示如下红色框2、创建一个支持远程登录的账户create user 账户名@% identified by 密码;%表示支持任意IP远程访问然后再输入select user,host from mysql.user;查询一下,就发现多了一个你创建的账户3、查…...

    2024/4/10 12:59:58
  11. java执行SQL脚本文件

    java调用SQLExec类执行sql脚本文件 话不多说,直接上代码,有帮助的话记得点个赞 public class SqlExec {public static void runSqlScript(){SQLExec sqlExec = new SQLExec();//设置数据库参数,我的是MySQL 别的都类似sqlExec.setDriver("com.mysql.jdbc.Driver")…...

    2024/4/10 12:59:58
  12. Leetcode 28. Implement strStr() KMP算法解字符串匹配问题

    class Solution {public int strStr(String haystack, String needle) {if(needle.equals("")) {return 0;}if(haystack.equals("")) {return -1;}// 构造KMP中的dp矩阵int m = needle.length();// 各个状态(行)遇到下一个字符(列)跳转到哪个状态int[][] d…...

    2024/4/18 23:02:49
  13. Spark Core快速入门系列(6) | RDD的依赖关系

    大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但…...

    2024/4/10 12:59:56
  14. 谈谈你对重构的理解

    网站重构:在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为。也就是说是在不改变UI的情况下,对网站进行优化, 在扩展的同时保持一致的UI对于传统的网站来说重构通常是 表格(table)布局改为DIV+CSS 使网站前端兼容于现代浏览器(针对于不合规范的…...

    2024/4/16 11:57:15
  15. PAT (Basic Level) Practice 1072 开学寄语

    1072 开学寄语 (20分)下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面、理发、整衣,然后思过、读书、锻炼、明智、开悟、精进。而后必成大器也!本题要求你写个程序帮助这所…...

    2024/5/2 10:23:51
  16. 算法的重要性

    算法的重要性 已经学了一段时间的C语言,开始慢慢接触linux开发基础(初学者)下面分享一下我这两天遇到的一些问题以及解决办法 。 屏幕检测 上周接触了6818开发板,学了图片传输以及显示还有屏幕检测(就是传输坐标)于是就想着,要不自己写一个屏幕锁(现在手机的触屏解锁)…...

    2024/4/10 12:59:52
  17. Android 常用系统组件 MaterialButton

    项目中经常会使用到,给按钮添加边框,点击效果,圆角,icon+文字圆角。 发现系统就有提供好的组件,除了CardView 可以设置。android material design支持库中各种可以直接拿来用的组件。 meterialDesign 支持库 下面基于com.google.android.material.button.MaterialButton 这…...

    2024/4/10 12:59:51
  18. screw (螺丝钉) ~ 简洁好用的数据库表结构文档生成工具

    https://gitee.com/leshalv/screw特点简洁、轻量、设计良好多数据库支持多种格式文档灵活扩展支持自定义模板 数据库支持MySQLMariaDBTIDBOracleSqlServerPostgreSQLCache DB 文档生成支持htmlwordmarkdwon使用方式普通方式引入依赖<dependency><groupId>cn.smallb…...

    2024/4/16 16:57:11
  19. 转caffe solver参数意义与设置

    caffe solver参数意义与设置batchsize:每迭代一次,网络训练图片的数量,例如:如果你的batchsize=256,则你的网络每迭代一次,训练256张图片;则,如果你的总图片张数为1280000张,则要想将你所有的图片通过网络训练一次,则需要1280000/256=5000次迭代。epoch:表示将所有图…...

    2024/4/10 12:27:18
  20. 今天说说String相关知识点

    String 如何实现以及特性 String类被final修饰,所以String不可被继承,Integer等等的包装类都不可以被继承。 jdk1.8中,String底层使用final修饰的char数组来存储字符串 private final char value[];jdk1.9之后,底层使用final修饰的byte数组来存储字符串 private final byte…...

    2024/4/18 13:29:53

最新文章

  1. TRIZ理论助力充电桩产业跨越技术瓶颈,实现产业升级!

    随着新能源汽车市场的迅猛发展和电动汽车保有量的不断增加&#xff0c;充电桩作为电动汽车的“能量补给站”&#xff0c;其重要性日益凸显。然而&#xff0c;充电桩产业在发展过程中也面临着诸多技术瓶颈&#xff0c;如何突破这些瓶颈&#xff0c;推动充电桩产业升级成为行业亟…...

    2024/5/6 16:58:23
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/6 9:38:23
  3. composer常见错误解决

    在Java中&#xff0c;常见的问题和解决方法包括&#xff1a; 内存不足错误&#xff1a;Java应用程序在运行时可能会遇到内存不足的错误。可以通过增加JVM的堆内存大小来解决&#xff0c;可以通过设置-Xms和-Xmx参数来指定初始堆大小和最大堆大小。 java -Xms2G -Xmx4G YourAppl…...

    2024/5/5 8:38:08
  4. 图像处理相关知识 —— 椒盐噪声

    椒盐噪声是一种常见的图像噪声类型&#xff0c;它会在图像中随机地添加黑色&#xff08;椒&#xff09;和白色&#xff08;盐&#xff09;的像素点&#xff0c;使图像的质量降低。这种噪声模拟了在图像传感器中可能遇到的问题&#xff0c;例如损坏的像素或传输过程中的干扰。 椒…...

    2024/5/5 8:37:08
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/5 18:19:03
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/5 12:22:20
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/5 19:59:54
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/6 7:24:07
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/5 15:25:47
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/6 6:01:13
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/6 7:24:06
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/6 1:08:53
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/5 18:50:00
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/6 0:27:44
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/6 7:24:04
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/6 7:24:04
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/5 13:14:22
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/6 7:24:03
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/5 17:03:52
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/5 21:10:50
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/6 7:24:02
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/6 7:24:01
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/5 17:03:21
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/6 16:50: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