关于SpringCloud,你了解多少?

news2024/11/26 8:38:30

Why SpringCloud?

Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。

图片

SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven的解决方案,旨在快速搭建单个微服务,SpringCloud是依赖于SpringBoot的,而SpringBoot并不是依赖与SpringCloud,甚至还可以和Dubbo进行优秀的整合开发。

MartinFlower 提出的微服务之间是通过RestFulApi进行通信,具体实现:

  • RestTemplate:基于HTTP协议;

  • Feign:封装了ribbon和Hystrix 、RestTemplate 简化了客户端开发工作量;

  • RPC:基于TCP协议,序列化和传输效率提升明显;

  • MQ:异步解耦微服务之间的调用;

图片

Spring Boot

Spring Boot 通过简单的步骤就可以创建一个 Spring 应用。

Spring Boot 为 Spring 整合第三方框架提供了开箱即用功能

Spring Boot 的核心思想是约定大于配置

Spring Boot 解决的问题

  • 搭建后端框架时需要手动添加 Maven 配置,涉及很多 XML 配置文件,增加了搭建难度和时间成本。

  • 将项目编译成 war 包,部署到 Tomcat 中,项目部署依赖 Tomcat,这样非常不方便。

  • 应用监控做的比较简单,通常都是通过一个没有任何逻辑的接口来判断应用的存活状态。

Spring Boot 优点

自动装配:Spring Boot 会根据某些规则对所有配置的 Bean 进行初始化。可以减少了很多重复性的工作。

比如使用 MongoDB 时,只需加入 MongoDB 的 Starter 包,然后配置 的连接信息,就可以直接使用 MongoTemplate 自动装配来操作数据库了。简化了 Maven Jar 包的依赖,降低了烦琐配置的出错几率。

内嵌容器:Spring Boot 应用程序可以不用部署到外部容器中,比如 Tomcat。

应用程序可以直接通过 Maven 命令编译成可执行的 jar 包,通过 java-jar 命令启动即可,非常方便。

应用监控:Spring Boot 中自带监控功能 Actuator,可以实现对程序内部运行情况进行监控。

比如 Bean 加载情况、环境变量、日志信息、线程信息等。当然也可以自定义跟业务相关的监控,通过Actuator 的端点信息进行暴露。

spring-boot-starter-web          //用于快速构建基于 Spring MVC 的 Web 项目。spring-boot-starter-data-redis   //用于快速整合并操作 Redis。spring-boot-starter-data-mongodb //用于对 MongoDB 的集成。spring-boot-starter-data-jpa     //用于操作 MySQL。
 

自定义一个Starter

  1. 创建 Starter 项目,定义 Starter 需要的配置(Properties)类,比如数据库的连接信息;

  2. 编写自动配置类,自动配置类就是获取配置,根据配置来自动装配 Bean;

  3. 编写 spring.factories 文件加载自动配置类,Spring 启动的时候会扫描 spring.factories 文件;

  4. 编写配置提示文件 spring-configuration-metadata.json(不是必须的),在添加配置的时候,我们想要知道具体的配置项是什么作用,可以通过编写提示文件来提示;

  5. 在项目中引入自定义 Starter 的 Maven 依赖,增加配置值后即可使用。

Spring Boot Admin(将 actuator 提供的数据进行可视化)

  • 显示应用程序的监控状态、查看 JVM 和线程信息

  • 应用程序上下线监控 

  • 可视化的查看日志、动态切换日志级别

  • HTTP 请求信息跟踪等实用功能

GateWay / Zuul

GateWay⽬标是取代Netflflix Zuul,它基于Spring5.0+SpringBoot2.0+WebFlux等技术开发,提供统⼀的路由⽅式(反向代理)并且基于 Filter(定义过滤器对请求过滤,完成⼀些功能) 链的⽅式提供了⽹关基本的功能,例如:鉴权、流量控制、熔断、路径重写、⽇志监控。

组成:

  • 路由route: ⽹关最基础的⼯作单元。路由由⼀个ID、⼀个⽬标URL、⼀系列的断⾔(匹配条件判断)和Filter过滤器组成。如果断⾔为true,则匹配该路由。

  • 断⾔predicates:参考了Java8中的断⾔Predicate,匹配Http请求中的所有内容(类似于nginx中的location匹配⼀样),如果断⾔与请求相匹配则路由。

  • 过滤器filter:标准的Spring webFilter,使⽤过滤器在请求之前或者之后执⾏业务逻辑。

    请求前pre类型过滤器:做参数校验、权限校验、流量监控、⽇志输出、协议转换等;

    请求前post类型的过滤器:做响应内容、响应头的修改、⽇志的输出、流量监控等。

图片

GateWayFilter 应⽤到单个路由路由上 、GlobalFilter 应⽤到所有的路由上。

Eureka / Zookeeper

服务注册中⼼本质上是为了解耦服务提供者和服务消费者,为了⽀持弹性扩缩容特性,⼀个微服务的提供者的数量和分布往往是动态变化的。

图片

图片

Eureka通过⼼跳检测、健康检查客户端缓存等机制,提⾼系统的灵活性、可伸缩性和可⽤性。

图片

  1. us-east-1c、us-east-1d,us-east-1e代表不同的机房,每⼀个Eureka Server都是⼀个集群;

  2. Service作为服务提供者向Eureka中注册服务,Eureka接受到注册事件会在集群和分区中进⾏数据同步,Client作为消费端(服务消费者)可以从Eureka中获取到服务注册信息,进⾏服务调⽤;

  3. 微服务启动后,会周期性地向Eureka发送⼼跳(默认周期为30秒)以续约⾃⼰的信息;

  4. Eureka在⼀定时间内(默认90秒)没有接收到某个微服务节点的⼼跳,Eureka将会注销该微服务节点;

  5. Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使⽤缓存中的信息找到服务提供者;

Eureka缓存

新服务上线后,服务消费者不能立即访问到刚上线的新服务,需要过⼀段时间后才能访问?或是将服务下线后,服务还是会被调⽤到,⼀段时候后才彻底停⽌服务,访问前期会导致频繁报错!

图片

服务注册到注册中⼼后,服务实例信息是存储在Registry表中的,也就是内存中。但Eureka为了提⾼响应速度,在内部做了优化,加⼊了两层的缓存结构,将Client需要的实例信息,直接缓存起来,获取的时候直接从缓存中拿数据然后响应给 Client。 

  • 第⼀层缓存是readOnlyCacheMap,采⽤ConcurrentHashMap来存储数据的,主要负责定时与readWriteCacheMap进⾏数据同步,默认同步时间为 30 秒⼀次。

  • 第⼆层缓存是readWriteCacheMap,采⽤Guava来实现缓存。缓存过期时间默认为180秒,当服务下线、过期、注册、状态变更等操作都会清除此缓存中的数据。

  • 如果两级缓存都无法查询,会触发缓存的加载,从存储层拉取数据到缓存中,然后再返回给 Client。

    Eureka之所以设计⼆级缓存机制,也是为了提⾼ Eureka Server 的响应速度,缺点是缓存会导致 Client获取不到最新的服务实例信息,然后导致⽆法快速发现新的服务和已下线的服务。

解决方案

  • 我们可以缩短读缓存的更新时间让服务发现变得更加及时,或者直接将只读缓存关闭,同时可以缩短客户端如ribbon服务的定时刷新间隔,多级缓存也导致C层⾯(数据⼀致性)很薄弱。

  • Eureka Server 中会有定时任务去检测失效的服务,将服务实例信息从注册表中移除,也可以将这个失效检测的时间缩短,这样服务下线后就能够及时从注册表中清除。

自我保护机制开启条件

  • 期望最小每分钟能够续租的次数(实例* 频率 * 比例==10* 2 *0.85)

  • 期望的服务实例数量(10)

健康检查

  • Eureka Client 会定时发送心跳给 Eureka Server 来证明自己处于健康的状态;

  • 集成SBA以后可以把所有健康状态信息一并返回给eureka;

Feign / Ribbon

  • Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡;

  • Feign 可以与 Hystrix 组合使用,支持熔断回退;

  • Feign 可以与ProtoBuf实现快速的RPC调用;

图片

  • InvocationHandlerFactory 代理

    采用 JDK 的动态代理方式生成代理对象,当我们调用这个接口,实际上是要去调用远程的 HTTP API;

  • Contract 契约组件

    比如请求类型是 GET 还是 POST,请求的 URI 是什么;

  • Encoder 编码组件 \ Decoder 解码组件

    通过该组件我们可以将请求信息采用指定的编码方式进行编解码后传输;

  • Logger 日志记录

    负责 Feign 中记录日志的,可以指定 Logger 的级别以及自定义日志的输出;

  • Client 请求执行组件

    负责 HTTP 请求执行的组件,Feign 中默认的 Client 是通过 JDK 的 HttpURLConnection 来发起请求的,在每次发送请求的时候,都会创建新的 HttpURLConnection 链接,Feign 的性能会很差,可以通过扩展该接口,使用 Apache HttpClient 等基于连接池的高性能 HTTP 客户端。

  • Retryer 重试组件

    负责重试的组件,Feign 内置了重试器,当 HTTP 请求出现 IO 异常时,Feign 会限定一个最大重试次数来进行重试操作。

  • RequestInterceptor 请求拦截器

    可以为 Feign 添加多个拦截器,在请求执行前设置一些扩展的参数信息。

Feign最佳使用技巧

  • 继承特性

  • 拦截器

    比如添加指定的请求头信息,这个可以用在服务间传递某些信息的时候。

  • GET 请求多参数传递

  • 日志配置

    FULL 会输出全部完整的请求信息。

  • 异常解码器

    异常解码器中可以获取异常信息,而不是简单的一个code,然后转换成对应的异常对象返回。

  • 源码查看是如何继承Hystrix

    HystrixFeign.builder 中可以看到继承了 Feign 的 Builder,增加了 Hystrix的SetterFactory, build 方法里,对 invocationHandlerFactory 进行了重写, create 的时候返回HystrixInvocationHandler, 在 invoke 的时候会将请求包装成 HystrixCommand 去执行,这里就自然的集成了 Hystrix。

Ribbon

图片

使用方式

  • 原生 API,Ribbon 是 Netflix 开源的,没有使用 Spring Cloud,需要使用 Ribbon 的原生 API;

  • Ribbon + RestTemplate,整合Spring Cloud 后,可以基于 RestTemplate 提供负载均衡的服务;

  • Ribbon + Feign

图片

负载均衡算法

  • RoundRobinRule 是轮询的算法,A和B轮流选择。

  • RandomRule 是随机算法,这个就比较简单了,在服务列表中随机选取。

  • BestAvailableRule 选择一个最小的并发请求 server。

自定义负载均衡算法

  • 实现 Irule 接口

  • 继承 AbstractLoadBalancerRule 类

自定义负载均衡使用场景(核心)

  • 灰度发布

    灰度发布是能够平滑过渡的一种发布方式,在发布过程中,先发布一部分应用,让指定的用户使用刚发布的应用,等到测试没有问题后,再将其他的全部应用发布。如果新发布的有问题,只需要将这部分恢复即可,不用恢复所有的应用。

  • 多版本隔离

    多版本隔离跟灰度发布类似,为了兼容或者过度,某些应用会有多个版本,这个时候如何保证 1.0 版本的客户端不会调用到 1.1 版本的服务,就是我们需要考虑的问题。

  • 故障隔离

    当线上某个实例发生故障后,为了不影响用户,我们一般都会先留存证据,比如:线程信息、JVM 信息等,然后将这个实例重启或直接停止。然后线下根据一些信息分析故障原因,如果我能做到故障隔离,就可以直接将出问题的实例隔离,不让正常的用户请求访问到这个出问题的实例,只让指定的用户访问,这样就可以单独用特定的用户来对这个出问题的实例进行测试、故障分析等。

Hystrix / Sentinel

服务雪崩场景

自己即是服务消费者,同时也是服务提供者,同步调用等待结果导致资源耗尽。

解决方案

服务方:扩容、限流,排查代码问题,增加硬件监控;

消费方:使用Hystrix资源隔离,熔断降级,快速失败;

图片

Hystrix断路保护器的作用

  • 封装请求会将用户的操作进行统一封装,统一封装的目的在于进行统一控制。

  • 资源隔离限流会将对应的资源按照指定的类型进行隔离,比如线程池信号量

    • 计数器限流,例如5秒内技术1000请求,超数后限流,未超数重新计数;

    • 滑动窗口限流,解决计数器不够精确的问题,把一个窗口拆分多滚动窗口;

    • 令牌桶限流,类似景区售票,售票的速度是固定的,拿到令牌才能去处理请求;

    • 漏桶限流,生产者消费者模型,实现了恒定速度处理请求,能够绝对防止突发流量;

  • 失败回退其实是一个备用的方案,就是说当请求失败后,有没有备用方案来满足这个请求的需求。

  • 断路器这个是最核心的,,如果断路器处于打开的状态,那么所有请求都将失败,执行回退逻辑。如果断路器处于关闭状态,那么请求将会被正常执行。有些场景我们需要手动打开断路器强制降级。

  • 指标监控会对请求的生命周期进行监控,请求成功、失败、超时、拒绝等状态,都会被监控起来。

Hystrix使用上遇到的坑

  • 配置可以对接配置中心进行动态调整

    Hystrix 的配置项非常多,如果不对接配置中心,所有的配置只能在代码里修改,在集群部署的难以应对紧急情况,我们项目只设置一个 CommandKey,其他的都在配置中心进行指定,紧急情况如需隔离部分请求时,只需在配置中心进行修改以后,强制更新即可。

  • 回退逻辑中可以手动埋点或者通过输出日志进行告警

    当请求失败或者超时,会执行回退逻辑,如果有大量的回退,则证明某些服务出问题了,这个时候我们可以在回退的逻辑中进行埋点操作,上报数据给监控系统,也可以输出回退的日志,统一由日志收集的程序去进行处理,这些方式都可以将问题暴露出去,然后通过实时数据分析进行告警操作。

  • 用 ThreadLocal配合线程池隔离模式需当心

    当我们用了线程池隔离模式的时候,被隔离的方法会包装成一个 Command 丢入到独立的线程池中进行执行,这个时候就是从 A 线程切换到了 B 线程,ThreadLocal 的数据就会丢失。

  • Gateway中多用信号量隔离

    网关是所有请求的入口,路由的服务数量会很多,几十个到上百个都有可能,如果用线程池隔离,那么需要创建上百个独立的线程池,开销太大,用信号量隔离开销就小很多,还能起到限流的作用。

[^常见问题]: Hystrix的超时时间要⼤于Ribbon的超时时间,因为Hystrix将请求包装了起来,特别需要注意的是,如果Ribbon开启了重试机制,⽐如重试3 次,Ribbon 的超时为 1 秒,那么Hystrix 的超时时间应该⼤于 3 秒,否则就会出现 Ribbon 还在重试中,⽽ Hystrix 已经超时的现象。

Sentinel

Sentinel是⼀个⾯向云原⽣微服务的流量控制、熔断降级组件。

替代Hystrix,针对问题:服务雪崩、服务降级、服务熔断、服务限流

Hystrix区别:

  • 独⽴可部署Dashboard(基于 Spring Boot 开发)控制台组件;

  • 不依赖任何框架/库,减少代码开发,通过UI界⾯配置即可完成细粒度控制;

图片

丰富的应⽤场景:Sentinel 承接了阿⾥巴巴近 10 年的双⼗⼀⼤促流量的核⼼场景,例如秒杀、消息削峰填⾕、集群流量控制、实时熔断下游不可⽤应⽤等。

完备的实时监控:可以看到500 台以下规模的集群的汇总也可以看到单机的秒级数据。

⼴泛的开源⽣态:与 SpringCloud、Dubbo的整合。您只需要引⼊相应的依赖并进⾏简单的配置即可快速地接⼊ Sentinel。

区别:

  • Sentinel不会像Hystrix那样放过⼀个请求尝试⾃我修复,就是明明确确按照时间窗⼝来,熔断触发后,时间窗⼝内拒绝请求,时间窗⼝后就恢复。

  • Sentinel Dashboard中添加的规则数据存储在内存,微服务停掉规则数据就消失,在⽣产环境下不合适。可以将Sentinel规则数据持久化到Nacos配置中⼼,让微服务从Nacos获取。

图片

Config / Nacos

Nacos是阿⾥巴巴开源的⼀个针对微服务架构中服务发现、配置管理服务管理平台

Nacos就是注册中⼼+配置中⼼的组合(Nacos=Eureka+Confifig+Bus)

Nacos功能特性

  • 服务发现与健康检查

  • 动态配置管理

  • 动态DNS服务

  • 服务和元数据管理

保护阈值:

当服务A健康实例数/总实例数 < 保护阈值 的时候,说明健康实例真的不多了,这个时候保护阈值会被触发(状态true),nacos将会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,请求失败,但这样也⽐造成雪崩要好,牺牲了⼀些请求,保证了整个系统的⼀个可⽤。

Nacos 数据模型(领域模型)

  • Namespace 代表不同的环境,如开发dev、测试test、⽣产环境prod

  • Group 代表某项⽬,⽐如爪哇云项⽬

  • Service 某个项⽬中具体xxx服务

  • DataId 某个项⽬中具体的xxx配置⽂件

可以通过 Spring Cloud 原⽣注解 @RefreshScope 实现配置⾃动更新。

Bus / Stream

Spring Cloud Stream 消息驱动组件帮助我们更快速,更⽅便的去构建消息驱动微服务的;

本质:屏蔽掉了底层不同MQ消息中间件之间的差异,统⼀了MQ的编程模型,降低了学习、开发、维护MQ的成本,⽬前⽀持Rabbit、Kafka两种消息;

Sleuth / Zipkin

全链路追踪

图片

Trace ID:当请求发送到分布式系统的⼊⼝端点时,Sleuth为该请求创建⼀个唯⼀的跟踪标识Trace ID,在分布式系统内部流转的时候,框架始终保持该唯⼀标识,直到返回给请求⽅;

Span ID:为了统计各处理单元的时间延迟,当请求到达各个服务组件时,也是通过⼀个唯⼀标识SpanID来标记它的开始,具体过程以及结束;

Spring Cloud Sleuth (追踪服务框架)可以追踪服务之间的调⽤,Sleuth可以记录⼀个服务请求经过哪些服务、服务处理时⻓等,根据这些,我们能够理清各微服务间的调⽤关系及进⾏问题追踪分析;

耗时分析:通过 Sleuth 了解采样请求的耗时,分析服务性能问题(哪些服务调⽤⽐较耗时);

链路优化:发现频繁调⽤的服务,针对性优化等;

聚合展示:数据信息发送给 Zipkin 进⾏聚合,利⽤ Zipkin 存储并展示数据。

安全认证

  • Session

    认证中最常用的一种方式,也是最简单的。存在多节点session丢失的情况,可通过nginx粘性Cookie和Redis集中式Session存储解决。

  • HTTP Basic Authentication 

    服务端针对请求头中base64加密的Authorization 和用户名和密码进行校验

  • Token

    Session 只是一个 key,会话信息存储在后端。而 Token 中会存储用户的信息,然后通过加密算法进行加密,只有服务端才能解密,服务端拿到 Token 后进行解密获取用户信息。

  • JWT认证

JWT(JSON Web Token)用户提供用户名和密码给认证服务器,服务器验证用户提交信息的合法性;如果验证成功,会产生并返回一个 Token,用户可以使用这个 Token 访问服务器上受保护的资源。

图片

  1. 认证服务提供认证的 API,校验用户信息,返回认证结果;

  2. 通过JWTUtils中的RSA算法,生成JWT token,token里封装用户id和有效期;

  3. 服务间参数通过请求头进行传递,服务内部通过 ThreadLocal 进行上下文传递;

  4. Hystrix导致ThreadLocal失效的问题可以通过,重写 Hystrix 的 Callable 方法,传递需要的数据;

Token最佳实践

  • 设置较短(合理)的过期时间。

  • 注销的 Token 及时清除(放入 Redis 中做一层过滤)。

    虽然不能修改 Token 的信息,但是能在验证层面做一层过滤来进行处理。

  • 监控 Token 的使用频率

    为了防止数据被别人爬取,最常见的就是监控使用频率,程序写出来的爬虫程序访问频率是有迹可循的 

  • 核心功能敏感操作可以使用动态验证(验证码)。

    比如提现的功能,要求在提现时再次进行验证码的验证,防止不是本人操作。

  • 网络环境、浏览器信息等识别。

    银行 APP 对环境有很高的要求,使用时如果断网,APP 会自动退出,重新登录,因为网络环境跟之前使用的不一样了,还有一些浏览器的信息之类的判断,这些都是可以用来保证后端 API 的安全。

  • 加密密钥支持动态修改。

    如果 Token 的加密密钥泄露了,也就意味着别人可以伪造你的 Token,可以将密钥存储在配置中心,以支持动态修改刷新,需要注意的是建议在流量低峰的时候去做更换的操作,否则 Token 全部失效,所有在线的请求都会重新申请 Token,并发量会比较大。

灰度发布

痛点:

  • 服务数量多,业务变动频繁,一周一发布;

  • 灰度发布能降低发布失败风险,减少影响范围

    通过灰度发布,先让一部分用户体验新的服务,或者只让测试人员进行测试,等功能正常后再全部发布,这样能降低发布失败带来的影响范围;

  • 当发布出现故障时,可以快速回滚,不影响用户;

    灰度后如果发现这个节点有问题,那么只需回滚这个节点即可,当然不回滚也没关系,通过灰度策略隔离,也不会影响正常用户;

可以通过Ribbon的负载均衡策略进行灰度发布,可以使用更可靠的Discovery。

Discovery

基于Discovery 服务注册发现、Ribbon 负载均衡、Feign 和 RestTemplate 调用等组件的企业级微服务开源解决方案,包括灰度发布、灰度路由、服务隔离等功能。

图片

  1. 首先将需要发布的服务从转发过程中移除,等流量剔除之后再发布。

  2. 部分机器中的版本进行升级,用户默认还是请求老的服务,通过版本来支持测试请求。

  3. 测试完成之后,让新的版本接收正常流量,然后部署下一个节点,以此类推。

 
grayVersions = {"discovery-article-service":["1.01"]}

多版本隔离

图片

本地复用测试服务-Eureka Zone亮点

region 地理上的分区,比如北京、上海等

zone 可以简单理解为 region 内的具体机房

在调用的过程中会优先选择相同的 zone 发起调用,当找不到相同名称的 zone 时会选择其他的 zone 进行调用,我们可以利用这个特性来解决本地需要启动多个服务的问题。

[^]: 当你访问修改的服务 A 时,这个服务依赖了 B、C 两个服务,B 和 C 本地没有启动,B 和 C 找不到相同的 zone 就会选择其他的 zone 进行调用,也就是会调用到测试环境部署的 B 和 C 服务,这样一来就解决了本地部署多个服务的问题。

各组件调优

当你对网关进行压测时,会发现并发量一直上不去,错误率也很高。因为你用的是默认配置,这个时候我们就需要去调整配置以达到最优的效果。

首先我们可以对容器进行调优,最常见的就是内置的 Tomcat 容器了。

server.tomcat.accept-count //请求队列排队数server.tomcat.max-threads //最大线程数server.tomcat.max-connections //最大连接数

Hystrix 的信号量(semaphore)隔离模式,并发量上不去很大的原因都在这里,信号量默认值是 100,也就是最大并发只有 100,超过 100 就得等待。

 
//信号量zuul.semaphore.max-semaphores //信号量:最大并发数//线程池hystrix.threadpool.default.coreSize //最大线程数hystrix.threadpool.default.maximumSize //队列的大hystrix.threadpool.default.maxQueueSize //等参数

配置Gateway并发信息

 
gateway.host.max-per-route-connections //每个路由的连接数 gateway.host.max-total-connections //总连接数

调整Ribbon 的并发配置

 
ribbon.MaxConnectionsPerHost //单服务并发数ribbon.MaxTotalConnections   //总并发数

修改Feign默认的HttpURLConnection 替换成 httpclient 来提高性能

 
feign.httpclient.max-connections-per-route//每个路由的连接数feign.httpclient.max-connections //总连接数

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

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

相关文章

前端js基础知识(八股文大全)

一、js的数据类型 值类型(基本类型)&#xff1a;数字(Number)、字符串&#xff08;String&#xff09;、布尔(Boolean)、对空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;、Symbol,大数值类型(BigInt) 引用数据类型&#xff1a;对象(Object)、数组…

使用Python写接口压测1软件安装

每一个新的东西&#xff0c;学习都是从软件安装开始&#xff0c;第一个章节老生常谈&#xff0c;但不是所有同学都是解除过得&#xff0c;所以从零开始吧&#xff01; 官网 https://www.python.org/下载-我是windows&#xff0c;下载其他根据自己系统; 点击下载 安装 下一步 简…

常用的苹果应用商店上架工具推荐

摘要 移动应用app上架是开发者关注的重要环节&#xff0c;但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作&#xff0c;各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用&#xff0c;最终指出合理使用工具的重要性。 引言 移动应…

OpenHarmony南向开发-Docker编译环境

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境&#xff0c;以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下&#xff1a; 独立Docker环境&#xff1a;适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。 基于HPM的Docker…

书客、月影、欧普护眼大路灯哪款好?三款落地灯真实对比测评

作为在照明电器领域资深的评测员&#xff0c;我对市面上各种新颖的照明家电有着深入的探索和研究。大路灯能够提供舒适健康的照明光线&#xff0c;目前正受到许多用眼人群的广泛欢迎。&#xff0c;当然随着大路灯的普及&#xff0c;市场中也充斥着一些低劣的大路灯产品&#xf…

JetBrains WebStorm 2024.1 发布 - 最智能的 JavaScript IDE

JetBrains WebStorm 2024.1 发布 - 最智能的 JavaScript IDE 请访问原文链接&#xff1a;JetBrains WebStorm 2024.1 (macOS, Linux, Windows) - 最智能的 JavaScript IDE&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org JetBr…

BI数据分析软件:行业趋势与功能特点剖析

随着数据量的爆炸性增长&#xff0c;企业对于数据的需求也日益迫切。BI数据分析软件作为帮助企业实现数据驱动决策的关键工具&#xff0c;在当前的商业环境中扮演着不可或缺的角色。本文将从行业趋势、功能特点以及适用场景等方面&#xff0c;深入剖析BI数据分析软件&#xff0…

Oracle体系结构:聊聊session与process

提前声明&#xff1a;本篇文章讨论的是专用服务器模式下的session和process&#xff1b;不讨论共享服务器模式&#xff0c;因为共享服务器现在真的应用的很少了&#xff0c;独占才是主流。共享服务器往往都是用在资源紧张的场合 &#xff0c;而且独占服务器模式有独立的PGA&…

spring04:注解使用

spring04&#xff1a;注解使用 文章目录 spring04&#xff1a;注解使用前言&#xff1a;一、 Autowired Qualifier和 Resource 和 nullable1. Autowired 2. Resource &#xff1a;使用在类的属性上面&#xff08;和Autowired类似&#xff09;3. nullable 二、 Component 和 Re…

bugku-web-你从哪里来

这里就这一句话提示&#xff0c;问我是不是谷歌的&#xff1f; 用谷歌浏览器访问 没看见什么变化 抓包查看 没有变化 这时我想到爬虫中的反爬策略中有一种&#xff0c;判断请求的当前界面来判断用户的起始判断位置 这时抓取报文 GET / HTTP/1.1 Host: 114.67.175.224:1516…

C++初阶:反向迭代器

reverse_iterator的封装实现 Reverse_Iterator.h namespace xx {// 所有容器的反向迭代器// 迭代器适配器template<class Iterator, class Ref, class Ptr>struct Reverse_iterator{Iterator _it;typedef Reverse_iterator<Iterator, Ref, Ptr> Self;Reverse_iter…

MySQL索引优化方法(1/16)

索引优化方法 基本概述 MySQL中有几种索引&#xff1a; 主键索引&#xff08;Primary Key Index&#xff09;&#xff1a;每个表都有一个主键&#xff0c;主键索引是自动创建的唯一索引。它通常是聚簇索引&#xff08;在索引树的叶子结点中存储的是需要查找的数据&#xff0…

C++的并发世界(九)——条件变量

0.绪论——单例模型 单例设计模式是一种常见的设计模式&#xff0c;用于确保某个类只能创建一个实例。由于单例实例是全局唯一的。因此在多线程环境中使用单例模式时,需要考虑线程安全的问题。 1.消费者设计模式 2.condition_variable使用步骤 ①准备好信号量 std::conditio…

基于Spring Boot的旅游管理系统设计与实现

基于Spring Boot的旅游管理系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 旅游方案&#xff0c;用户通过旅游方案可以查看方案编号…

护眼台灯对眼睛有危害吗?比较好的台灯推荐

护眼台灯对眼睛有危害吗&#xff1f;我相信这应该是很多家长所关心的一件事&#xff0c;毕竟现在的孩子近视率实在太高了&#xff0c;而台灯作为夜晚学习不可或缺的一盏照明灯具&#xff0c;光源品质的好坏对眼睛的影响是非常大的&#xff01; 尤其是在这鱼龙混杂的台灯市场上…

Linux:Redis7.2.4的简单在线部署(1)

注意&#xff1a;我写的这个文章是以最快速的办法去搭建一个redis的基础环境&#xff0c;作用是为了做实验简单的练习&#xff0c;如果你想搭建一个相对稳定的redis去使用&#xff0c;可以看我下面这个文章 Linux&#xff1a;Redis7.2.4的源码包部署&#xff08;2&#xff09;-…

02—js数据类型及相互转换

一、数据类型 js把数据分为两类 基本类型&#xff1a;string number boolean undefined null 引用类型&#xff1a;object(fuction(可以执行) array&#xff08;数值下标&#xff0c;内部数据是有序的&#xff09;) 1.Number:数值类型&#xff0c;整数和小数 &#xff08…

【C#】 删除首/尾部字符

代码 static void Main(string[] args){string str "123abc";string strdelete "abc";string str1 str.Trim(1);string strc str1.Trim(c);string str11 str1.TrimStart(1);string strcc str1.TrimEnd(c);string strabc str.Trim(strdelete.ToCharA…

mysql8主从配置报错Authentication plugin ‘caching_sha2_password‘ reported error

错误信息&#xff1a; Error connecting to source slave192.168.2.177:3306. This was attempt 2/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin caching_sha2_password reported error: Authentication requires secure connection.…

连续6年!九州未来获评2024中国边缘计算企业20强

4月9日&#xff0c;由国内中立边缘计算领域研究平台——边缘计算社区策划发起的“2024中国边缘计算企业20强”榜单正式揭晓&#xff0c;九州未来凭借在边缘计算领域的深厚积累以及创新实践&#xff0c;从众多参评企业中脱颖而出&#xff0c;连续6年入选中国边缘计算企业20强&am…