微服务面试题一

1.SOA、分布式、微服务之间有什么关系和区别?

  • 分布式架构是指将单体架构中的各个部分拆分,然后部署不同的机器或进程中去,SOA和微服务基
    本上都是分布式架构的
  • SOA是⼀种⾯向服务的架构,系统的所有服务都注册在总线上,当调⽤服务时,从总线上查找服务
    信息,然后调⽤
  • 微服务是⼀种更彻底的⾯向服务的架构,将系统中各个功能个体抽成⼀个个⼩的应⽤程序,基本保
    持⼀个应⽤对应的⼀个服务的架构

2.怎么拆分微服务?

拆分微服务的时候,为了尽量保证微服务的稳定,会有⼀些基本的准则:

  • 微服务之间尽量不要有业务交叉。
  • 微服务之前只能通过接⼝进⾏服务调⽤,⽽不能绕过接⼝直接访问对⽅的数据。
  • ⾼内聚,低耦合

3.Eureka

3.1 什么是服务注册和服务发现

以Eureka为例
服务注册:服务提供者需要把自己的信息注册到Eureka,Eureka来保存这些信息(服务名称,ip,端口号等)。
服务发现:消费者向Eureka拉取服务列表,如果服务者是集群,则消费者会利用负载均衡算法选择一个。

3.2 启动流程

  1. Eureka客户端(以下简称客户端)启动后,定时向Eureka服务端(以下简称服务端)注册自己的服务信息(服务名、IP、端口等)。这就是服务注册。
  2. 客户端启动后,根据名称定时拉取服务端保存注册信息。这就是服务发现或服务拉取。
  3. 之后,消费者就可以远程调用提供者。

3.3 消费者如何感知提供者健康状态

  1. 提供者每隔30秒向注册中心发起请求,报告自己的健康状态——称为心跳。
  2. Eureka会更新服务列表信息(注册信息),如果Eureka90秒没有接收到心跳,会被剔除
  3. 消费者就可以拉取到新的信息

3.4 如何搭建注册中心

  1. 引用服务端依赖
  2. 服务启动类上添加@EnableEurekaServer注解
  3. 在application.yml编写配置
server:port: 10086
spring:application:name: eureka-server
eureka:client:service-url: defaultZone: http://127.0.0.1:10086/eureka

3.5如何完成服务注册和服务发现

  1. 引入客户端依赖
  2. 编写配置文件 (服务发现也需要知道eureka地址,因此与服务注册一致,都是配置eureka信息)
spring:application:name: orderservice
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka

3.6 为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。

LoadBalancerInterceptor里面有个interceptor方法,该方法对RestTemplate的请求进行拦截,(获取请求的url,找到主机名(就是服务id))然后从Eureka根据名称获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。

3.7 负载均衡算法有哪些

  1. 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每⼀台服务器,而不关⼼服务器实际的连接数和当前的系统负载。
  2. 随机法:随机选择一个可用的服务器。
  3. 加权轮询法:为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
  4. 加权随机法:与加权轮询法⼀样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
  5. 最小连接数法:最⼩连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的⼀台服务器来处理当前的请求,尽可能地提⾼后端服务的利⽤效率,将负责合理地分流到每⼀台服务器.
  6. 区域敏感策略ZoneAvoidanceRule(默认):以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。

3.8 负载均衡如何实现

主要使用Ribbon,比如,使用Feign远程调用时,底层的负载均衡使用的就是Ribbon

3.9 自定义负载均衡策略

  1. 方法一(全局):通过定义IRule实现可以修改负载均衡规则,交给Spring容器管理
@Bean
public IRule randomRule(){return new RandomRule();
}
  1. 方法二(局部):通过配置文件
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务名ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

3.10 Ribbon负载均衡流程

在这里插入图片描述

3.11 饥饿加载和懒加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
饥饿加载:会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

ribbon:eager-load:enabled: trueclients: userservice

4.Nacos

4.1 什么是Nacos

Nacos是阿里巴巴开源的一个微服务组件,它有配置管理,服务发现,动态的DNS服务和服务管理平台
(1)配置管理:支持配置统一管理,配置自动更新等
(2)服务发现:支持DNS和RPC的服务发现,同时进行监控检查。
(3)动态DNS服务:支持路由权重,更容易实现负载均衡、更灵活的路由策略、流量监控等
(4)服务管理:

4.2 nacos如何完成服务注册

  1. 引依赖
  2. 配地址
spring:cloud:nacos:server-addr: localhost:8848

4.3 Eureka和Nacos区别

共同点:

  1. 都支持服务注册,服务拉取
  2. 都支持服务提供者心跳方式做健康检测
    区别:
  3. Nacos支持服务端主动监测提供者状态:临时实例提供心跳模式,非临时实例采用主动检测模式。
  4. 临时实例心跳不正常会被剔除,非临时实例不会被剔除
  5. Nacos支持服务列表变更的消息推送(服务列表发生变更主动告知消费者),服务列表更新更及时
  6. Nacos集群默认采用AP方式,当集群存在非临时实例时,采用CP模式;Eureka采用AP方式
  7. Nacos支持配置中心,Eureka只有注册中心。

4.4 Nacos和Eureka结构

Nacos
Eureka

4.5 如何添加DataId配置

  1. 在配置文件中添加环境
spring:profiles:active: dev
  1. 在Nacos控制台新建配置:
    (1)DataId: 服务名称-环境(dev).文件后缀(yml)
    (2)选择配置格式
    (3)配置内容
  2. 后端获取@Value(“${xxx.xxx}”) 如果类上使用@RefreshScope可以实现热更新

4.6 环境隔离

Namespace来做环境隔离
每个namespace都有唯一的id
不同namespace下服务不可见

5.feign如何使用

  1. 引依赖
  2. 在需要远程调用的启动类上加@EnableFeignClients注解
  3. 创建接口,并添加@FeignClient(“服务名称”)
@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}
  1. 将接口注入到要使用的地方,调用接口里面的抽象方法

6.GateWay

6.1 网关的核心功能

  1. 路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
  2. 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
  3. 限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。

6.2 项目中如何使用

  1. 引入网关和Nacos服务注册相关依赖
  2. 在配置文件中 编写基础配置和路由规则
server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- id: user-service # 路由id,自定义,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: # 路由断言,也就是判断请求是否符合路由规则的条件- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

路由配置包括:

  1. 路由id:路由的唯一标示
  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
  3. 路由断言(predicates):判断路由的规则
  4. 路由过滤器(filters):对请求或响应做处理

6.3 过滤器工厂

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理

6.4路由过滤器种类(部分)

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果中移除有一个响应头
RequestRateLimiter限制请求的流量

如何使用?只需要修改gateway服务的application.yml文件,添加路由过滤即可

spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/** filters: # 过滤器- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头

6.5 什么事跨域?

跨域:域名不一致就是跨域,
主要包括:域名不同和域名相同但端口不通
如何解决?编写gateway的配置文件

spring:cloud:gateway:# 。。。globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins: # 允许哪些网站的跨域请求 - "http://localhost:8090"allowedMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期

7消息列队

7.1如何进⾏消息队列选型?

  • Kafka:
    优点: 吞吐量非常⼤,性能非常好,集群高可⽤。
    缺点:会丢数据,功能比较单⼀。
    使⽤场景:⽇志分析、⼤数据采集
  • RabbitMQ:
    优点: 消息可靠性⾼,功能全⾯。
    缺点:吞吐量⽐较低,消息积累会严重影响性能。erlang语⾔不好定制。
    使⽤场景:⼩规模场景。
  • RocketMQ:
    优点:⾼吞吐、⾼性能、⾼可⽤,功能⾮常全⾯。
    缺点:开源版功能不如云上商业版。官⽅⽂档和周边⽣态还不够成熟。客户端只⽀持java。
    使⽤场景:⼏乎是全场景。

7.2 RabbitMQ如何确保消息不丢失

  1. 开启生产者确认机制,确保生产者的消息能够到达队列,如果出现错误,可以先记录到日志在处理
  2. 开启持久化功能。确保消息未消费之前队列不会丢失,其中交换机、队列、和消息都要做持久化。

①交换机持久化

@Bean
public DirectExchange simpleExchange(){
//三个参数:交换机名称,是否持久化,当没有队列与其绑定是是否删除return new DirectExchange("simple.direct",true,false); 
}

②队列持久化

@Bean 
pulic Queue simpleQueue(){
//使用QueueBuilder构建队列时,durable就是持久化return QueueBuilder.durable("simple.queue").build();
}	

③消息持久化,SpringAMQP中的消息持久化是默认的

  1. 开启消费者确认机制为auto,由Spring确认消息消费成功之后返回ack,抛出异常返回nack,当然也要设置重试次数,超过次数就将失败的消息投递到异常交换机,有人工处理。

7.4 RabbitMQ重复消费是怎么解决的

重复消费:当消费者设置了自动确认机制,当服务来没有来得及给MQ确认的时候,服务器宕机了,导致服务重启之后,又消费力一次消息。
解决:给每条消息设置唯一id,当服务器重启后,先到数据库去查询这个数据是否存在,如果不存在说明没有处理过,那么正常处理这条数据就行了,如果存在了说明处理过了,这样就避免了重复消费。

7.5 RabbitMQ死信交换机(延迟队列)

  • 像超时订单、限时优惠、定时发布会用到延迟队列
  • 其中延迟队列就用到了死信交换机和TTL(消息存活时间)实现的
  • 消息超时未消费就会变成死信(消费拒绝被消费,列队满了也会成为死信)

7.6 什么是惰性队列

  • 接收到的消息直接存入磁盘,而不是内存
  • 消费者消费消息时才会读到内存
  • 支持百万条消息存储
    如何实现惰性列队
    方式一:(声明队列时)
@Bean
public Queue lazyQueeu(){return QueueBuilder.durable("lazy.queue").lazy()//开启x-queue-mode为lazy.build();
}

方式二:(注解)

@RabbitListener(queueToDeclare = @Queue(name="lazy.queue",durable("ture"),arguments = @Argument(name = "x-queue-mode",value = "lazy")//添加此行
))
public void listenLazyQueue(Strinf msg){log.info("{}",msg)
}

7.7 消息堆积如何解决

  • 增加更多的消费者,提高消费速度
  • 在消费者内开启线程池加快消息处理速度
  • 扩大队列容积,提高堆积上线,采用惰性队列

7.8 RabbitMQ高可用机制了解吗?

  • 一般情况下,使用镜像模式搭建的集群,共有3个节点
  • 镜像列队结构是一主多从(从就是镜像),所有操作都是主节点完成,然后同步给镜像节点。
  • 主节点宕机后,镜像节点会代替成为新的主节点(如果在主节点同步数据之前宕机,可能存在数据丢失)

7.8.1那丢失怎么办呢?

使用仲裁列队,与镜像列队一样,但是它同步基于Raft协议,强一致
仲裁列队使用也比较简单,不需要额外的配置,只需在声明队列时指定它是仲裁队列就行了

7.9 消息列队的作用(为什么使用消息服务)

  • 应用解耦:如果有订单系统,下单成功之后,需要调用库存系统扣减库存;随着公司业务的发展又需要增加物流系统接收下单信息;此时有需要订单系统增加调用物流系统的代码;但是增加队列后,订单系统只需要将下单信息发送到队列,其他系统需要这个消息自己来订阅就可以了;并且也不会因为库存系统异常导致下单失败
  • 异步提速:用户注册成功后,需要先将数据保存,并且发送邮件通知,邮件通知成功后再发送短息通知,短信通知成功后才响应客户成功消息。用户体验很差。增加消息队列后,只需要保存数据,将发送邮件通知和短信通知消息发送到消息队列,可以极大提升响应速度
  • 流量削峰:如果订单系统每秒只能处理1k的请求量,但是在某一瞬间,比如抢单,每秒可以达到1W甚至更多的请求,这种情况下可能会直接导致订单系统崩溃;增加消息队列后,订单系统没拉取1K请求,可以很平稳的去消费消息。

7.10RabbitMQ工作原理

在这里插入图片描述
原理(流程):
(1)消息发布者向RabbitMQ代理(Broker)指定的虚拟主机服务器发送消息
(2)虚拟主机服务器内部的交换机接收消息,并将消息传递并存储到与之绑定的(Binding)的消息列队中
(3)消费者通过一定的网络连接,与消息代理建立连接,同时为了简化开发,在连接内部使用了复用的信道进行消息的最终消费。
Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker
Virtual host:Virtual host是一个虚拟主机的概念,一个Broker中可以有多个Virtual host,每个Virtual host都有一套自己的Exchange和Queue,同一个Virtual host中的Exchange和Queue不能重名,不同的Virtual host中的Exchange和Queue名字可以一样。这样,不同的用户在访问同一个RabbitMQ Broker时,可以创建自己单独的Virtual host,然后在自己的Virtual host中创建Exchange和Queue,很好地做到了不同用户之间相互隔离的效果。
Connection:publisher/consumer和borker之间的TCP连接
channel:发送消息的通道,如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程 序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客 户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销
Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发 消息到 queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)
Queue:Queue是一个用来存放消息的队列,生产者发送的消息会被放到Queue中,消费者消费消息时也是从Queue中取走消息。
Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key,Binding 信息被保 存到 exchange 中的查询表中,用于 message 的分发依据

7.11RabbitMQ常见的工作模式

7.11.1 Work queues(工作列队模式)

不需要设置交换机(会使用默认的交换机进行消息转换),需要指定消息列队,消费者通过轮训的方式接收消息

7.11.2 发布订阅模式

需要配置fanout类型交换机,同时将消息路由到每一条消息列队上,然后每个消息列队都可以对相同的消息进行接收存储,进而由各自消息列队关联的消费者进行消费

7.11.3 Routing(路由模式)

需要配置direct类型交换机,并且指定不同的路由键值(Rounting Key)将消息从交换机路由到不同的消息列队进行存储,由消费者进行各自消费

7.11.4Topics(通配符模式)

需要设置topic类型的交换机,并指定不同的路由键值(Routing Key)将对应的消息从交换机路由到不同的消息列队进行存储,由消费者进行各自消费;Topics模式与Routing模式不同的是:Topics模式的路由键值是包含通配符的,用"."和其他字符连接。

7.12 SpringAmqp的使用

7.12.1 发消息

  1. 引依赖
  2. 编写发布服务的配置文件
spring:rabbitmq:host: 192.168.150.101 # 主机名port: 5672 # 端口virtual-host: / # 虚拟主机username: itcast # 用户名password: 123321 # 密码
  1. 发布消息
 	@Autowiredprivate RabbitTemplate rabbitTemplate;public void testSimpleQueue() {// 队列名称String queueName = "simple.queue";// 消息String message = "hello, spring amqp!";// 发送消息rabbitTemplate.convertAndSend(queueName, message);//这里可以设置Routing key比如: rabbitTemplate.convertAndSend(exchangeName, "red", message);}

7.12.2接收消息

  1. 编写消费服务的配置文件
spring:rabbitmq:host: 192.168.150.101 # 主机名port: 5672 # 端口virtual-host: / # 虚拟主机username: itcast # 用户名password: 123321 # 密码

2.接受消息

@Component
public class SpringRabbitListener {@RabbitListener(queues = "simple.queue")public void listenSimpleQueueMessage(String msg) throws InterruptedException {System.out.println("spring 消费者接收到消息:【" + msg + "】");}
}

7.13 使用注解的方式声明和发布交换机

@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),key = {"red", "blue"}
))
public void listenDirectQueue1(String msg){System.out.println("消费者接收到direct.queue1的消息:【" + msg + "】");
}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue2"),exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),key = {"red", "yellow"}
))
public void listenDirectQueue2(String msg){System.out.println("消费者接收到direct.queue2的消息:【" + msg + "】");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805407.shtml

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

相关文章

TLF9471 - High-Speed CAN FD Transceiver

1 框图描述 2 功能描述 CAN收发器被设计用来承受汽车应用的恶劣条件,并支持12V应用。   SBC的控制器区域网络(CAN)收发器部分在汽车和工业应用中提供高速(HS)差分模式数据传输(最高可达2Mbaud&#xff09…

【Java基础】BigDecimal使用避坑规范

BigDecimal使用 解决浮点型运算时,出现结果失真的问题,比如0.10.2 —示例— public class ErrorCase {public static void main(String[] args) {// 0.30000000000000004System.out.println(0.1 0.2);} }构造方法 把string转成BigDecimal把double转B…

备战蓝桥杯Day40 - 第11届python组真题 - C跑步锻炼

一、题目描述 二、思路 1、使用datetime库中的方法可以很好的解决这个问题。 2、定义起始时间和结束时间,判断是否是周一或者是1号,结果res加上相应的里程数。 3、最后输出 res 即为本题答案。 三、代码实现 import datetimestart datetime.date(2…

深度学习图像处理04:图像分类模型训练实战——动物分类

这篇博文不涉及理论知识,主要通过一个完整的深度学习模型训练流程,直观地了解深度学习图像分类任务。有关理论的部分,之前几篇博文已经涉及基础部分,之后也会对一些理论进行补充。 本文将结合代码,主要介绍三部分内容…

OpenHarmony应用编译 - 如何在源码中编译复杂应用(4.0-Release)

文档环境 开发环境:Windows 11 编译环境:Ubuntu 22.04 开发板型号:DAYU 200(RK3568) 系统版本:OpenHarmony-4.0-Release 功能简介 在 OpenHarmony 系统中预安装应用的 hap 包会随系统编译打包到镜像中&a…

SpringBoot常用注解及其使用示例

Spring Boot是一个用于快速构建Java应用程序的框架,它简化了Spring应用程序的创建和部署过程。 Spring Boot提供了很多注解,用于简化开发过程,提高开发效率。本文将介绍几个Spring Boot常用注解的使用案例,包括Controller、Reques…

c#获取Web.Config中的值出现的错误及解决办法

c#获取Web.Config中的值出现的错误及解决办法 1.错误提示 2.原因寻找 问题出在Web.Config文件中 <add key"mchid " value"1495103432"/>//mchid 后面不应该有空格图示如下&#xff1a; 3.改正代码如下&#xff1a; <?xml version"1.0…

022——设计通信帧格式

本期没想好怎么排版以流水账形式展示了 int tcp_server(int argc, char *argv[]) {int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_len sizeof(client_addr); char *ip_address argv[1]; int port atoi(argv[2]); // 创建T…

Capture One 23 Enterprise for Mac中文版 全面的图像处理工具

Capture One 23 Enterprise for Mac中文版一款专业的图像编辑和管理软件&#xff0c;具备强大的功能和工具&#xff0c;适用于摄影师、摄影工作室和专业用户。 软件下载&#xff1a;Capture One 23 Enterprise for Mac中文版下载 该软件为用户提供了全面的图像处理工具&#xf…

SpringCloudAlibaba-整合nacos(二)

目录地址&#xff1a; SpringCloudAlibaba整合-CSDN博客 一、nacos服务部分 1.下载nacos&#xff0c;并执行数据库脚本&#xff1a;nacos-mysql.sql 2.修改配置文件&#xff0c;配置mysql 3.启动nacos ./startup.sh -m standalone 4.访问&#xff1a;http://127.0.0.1:884…

Terraform 扩展

Terraform 扩展 Terraform Meta-Arguments 元参数 count 创建相似的资源for_each 创建相似的资源depends_on 定义资源或者模块的依赖provider 定义provider选项lifecycle 资源的生命周期行为 参数使用范围备注countresource module适用于创建多个相似的资源&#xff0c;使用…

1999-2022年各省研究与试验发展人员全时当量数据/省研发人员全时当量数据/(RD)人员全时当量(无缺失)

1999-2022年各省研究与试验发展人员全时当量数据/省研发人员全时当量数据/(R&D)人员全时当量&#xff08;无缺失&#xff09; 1、时间&#xff1a;1999-2022年 2、来源&#xff1a;科技年鉴 3、指标&#xff1a;研究与试验发展人员全时当量/研发人员全时当量 4、范围&a…

软考-系统集成项目管理中级-新一代信息技术

本章历年考题分值统计 本章重点常考知识点汇总清单(掌握部分可直接理解记忆) 本章历年考题及答案解析 32、2019 年上半年第 23 题 云计算通过网络提供可动态伸缩的廉价计算能力&#xff0c;(23)不属于云计算的特点。 A.虚拟化 B.高可扩展性 C.按需服务 D.优化本地存储 【参考…

Docker快速上手及常用命令速查

Docker快速上手 安装 在ubuntu上安装docker: sudo apt-get install docker docker -v #查看版本在centos7上安装docker&#xff1a;(docker在YUM源的Extras仓库中) yum install docker systemctl start dockerdocker常用命令速查 #查看docker信息 docker info #查看本地镜…

hive 数据库表常用操作及相关函数讲解

创建数据库并指定hdfs存储位置 create database myhive2 location ‘/myhive2’; 使用location关键字&#xff0c;可以指定数据库在HDFS的存储路径。 Hive的库在HDFS上就是一个以.db结尾的目录 默认存储在&#xff1a; /user/hive/warehouse内 当你为Hive表指定一个LOCATION时…

NumPy入门(一)

NumPy入门(一) 工具: jupyter notebook jupyter notebook 功能 : 数据处理 &#xff08;python 处理数据功能&#xff09; coding文字型的描述 富文本 word可视化支持 官网: https://jupyter.org/ 启动命令 jupyter notebook 1.1 numpy简介 Python的拓展库, 提供数据对象 nda…

【数据下载】SODA数据更新至2022并教学下载

【数据下载】SODA数据更新至2022并教学下载 我为什么那么喜欢使用SODA数据&#xff1f; 就是三维网格化的数据&#xff0c;好用。 但是需要高分辨率还是需要找别的。 以前分享过SODA数据下载&#xff0c;但上次版本过于凌乱。因此重新借助更新再分享一次&#xff0c;不为过。…

人脸识别业务(基于腾讯人脸识别接口)

使用腾讯云人脸识别接口&#xff0c;基于优图祖母模型。 一、准备工作 人脸识别账号 申请腾讯云服务器账号&#xff0c;生成自己的秘钥。记录秘钥和秘钥ID。 创建人员库 记下人员库id 在配置文件application.yml中添加配置。 plateocr:SecretId: 秘钥IDSecretKey: 秘钥ser…

Day1 省选衔接题 思路总结

Day1 省选题 思路 取数 可反悔的贪心。我们开一个双向链表记录此时每个数的前/后一个数是什么。一个简单但不一定正确的贪心策略即为&#xff1a;每次都取走当前值最大的且可取的数&#xff0c;并更新列表。考虑如何使这个贪心思路正确。 设 p r e x pre_x prex​ 表示 x x …