一、微服务架构概念(Martin Fowler关于微服务论文)

微服务架构是使用一套小服务来开发单个应用的方式或途径,每个服务基于单一业务能力构建,运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,并能够通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。

马丁福勒:

 

二、微服务

微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。

1、SpringCloud微服务结构图

 

2、微服务的特点

技术维度理解:

 

三、微服务技术栈

微服务条目    落地技术    
服务开发    Springboot、Spring、SpringMVC    
服务配置与管理    Netflix公司的Archaius、阿里的Diamond等    
服务注册与发现    Eureka、Consul、Zookeeper等    
服务调用    Rest、RPC、gRPC    
服务熔断器    Hystrix、Envoy等    
负载均衡    Ribbon、Nginx等    
服务接口调用(客户端调用服务的简化工具)    Feign等    
消息队列    Kafka、RabbitMQ、ActiveMQ等    
服务配置中心管理    SpringCloudConfig、Chef等    
服务路由(API网关)    Zuul等    
服务监控    Zabbix、Nagios、Metrics、Spectator等    
全链路追踪    Zipkin,Brave、Dapper等    
服务部署    Docker、OpenStack、Kubernetes等    
数据流操作开发包    SpringCloud Stream(封装与Redis,Rabbit、Kafka等发送接收消息)    
事件消息总线    Spring Cloud Bus    

四、SpringCloud入门概述

1、SpringCloud是什么

2、SpringCloud和SpringBoot是什么关系

SpringBoot专注于快速方便的开发单个个体微服务。

SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,
为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务

SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖的关系.

SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

3、RestTemplate

  • RestTemplate提供了多种便捷访问远程Http服务的方法, 是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集。
  • 使用restTemplate访问restful接口非常的简单粗暴无脑。(url, requestMap, ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。

四、Eureka服务注册与发现

1. Eureka是什么
Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper。

2. Eureka的基本架构 

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper)。

Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心

而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

EurekaClient是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)。

3. Eureka Server

server:port: 7010eureka:instance:hostname: localhost  #eureka服务端的实例名称client:register-with-eureka: false #false表示不向注册中心注册自己fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务service-url: #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

 

假如我们需要引入SpringCloud的一个新技术组件,基本上有两步:

1) 新增一个相关的maven坐标

如:Eureka

<!--eureka-server服务端 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

2) 在SpringBoot主启动类上面,标注启动该新组件技术的相关注解标签

如:@EnableEurekaServer

No instances available(没有服务被发现) ,因为还没有注册服务进来

4. 将已有的部门微服务注册进Eureka服务中心

<!--将微服务provider侧注册进eureka -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--actuator监控信息完善-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
</dependency>
eureka:client: #客户端注册进eureka服务列表内service-url:defaultZone: http://localhost:7010/eureka
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
@SpringBootApplication
public class DeptProvider8001App {public static void main(String[] args) {SpringApplication.run(DeptProvider8001App.class, args);}
}

重新启动服务:

 

5. actuator与注册微服务信息完善

(1)主机名称:服务名称 修改

eureka:client: #客户端注册进eureka服务列表内service-url:defaultZone: http://localhost:7010/eurekainstance:instance-id: microservicecloud-dept8001 # 自定义服务名称信息

6. Eureka自我保护

导致触发原因:某时刻某一微服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存。

什么是自我保护模式?

默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话讲解:好死不如赖活着。

综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。

在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保护模式(不推荐)。

7. 服务发现Discovery

对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息

@Autowiredprivate DiscoveryClient client;@GetMapping(value = "dept/discovery")public Object discovery() {List<String> services = client.getServices(); //eureka中注册的微服务System.out.println("--------" + services);List<ServiceInstance> instances = client.getInstances("microservicecloud-dept8001");for(ServiceInstance s : instances) {System.out.println(s.getServiceId() + "\t" + s.getHost() + "\t" + s.getPort() + "\t" + s.getUri());}return this.client;}
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
@EnableDiscoveryClient
@SpringBootApplication
public class DeptProvider8001App {public static void main(String[] args) {SpringApplication.run(DeptProvider8001App.class, args);}
}
//测试@EnableDiscoveryClient,消费端可以调用服务发现@GetMapping("/consumer/dept/discovery")public Object discovery() {return restTemplate.getForObject(REST_URL_PREFIX + "/dept/discovery", Object.class);}

8. Eureka集群配置

(1)新建microservicecloud-eureka-7020/microservicecloud-eureka-7030

(2)修改域名映射配置

找到C:\Windows\System32\drivers\etc路径下的hosts文件

(3)3台eureka服务器的yml配置

server:port: 7010eureka:instance:hostname: eureka7010.com  #eureka服务端的实例名称client:register-with-eureka: false #false表示不向注册中心注册自己fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务service-url: #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址# 单机配置defaultZone# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/defaultZone: http://eureka7020.com:7020/eureka/, http://eureka7030.com:7030/eureka/

(4)微服务发布到上面3台eureka集群配置中

eureka:client: #客户端注册进eureka服务列表内service-url:defaultZone: http://eureka7010.com:7010/eureka/, http://eureka7020.com:7020/eureka/, http://eureka7030.com:7030/eureka/instance:instance-id: microservicecloud-dept8001 # 自定义服务名称信息prefer-ip-address: true # 访问路径可以显示ip地址

eureka集群配置成功:

 

五、作为注册中心,Eureka比Zookeeper好在哪里

1. Eureka遵守AP原则

CPA原则,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

由于分区容错性P在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。

Zookeeper保证的是CP, Eureka则是AP。

 因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。

 

六、Ribbon负载均衡

Spring Cloud Ribbon 是基于客户端负载均衡工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

1. Rabbon配置初步

1.1 修改microservicecloud-consumer-dept-80工程

(1)修改pom文件

<!-- Ribbon相关 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency>

(2)修改application.yml ,追加eureka的服务注册地址

server:port: 80eureka:client:register-with-eureka: falseservice-url:defaultZone: http://eureka7010.com:7010/eureka/, http://eureka7020.com:7020/eureka, http://eureka7030.com:7030/eureka

完成真正的通过微服务名字从eureka上找到并访问。

@RestController
public class DeptConsumerController {//private static final String REST_URL_PREFIX = "http://localhost:8001";private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-PROVIDER-DEPT";

小总结:Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号。

1.2 启动集群服务

总结:Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。

 

2. Ribbon核心组件IRule

 

七、Feign负载均衡

 Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,只需要创建一个接口,然后在上面添加注解即可。

package com.dhu.springcloud.service;import com.dhu.springcloud.entity.Dept;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import java.util.List;/*** @author zhou* @create 2020/7/7*/
@FeignClient(value = "microservicecloud-provider-dept")
public interface DeptClientService {@RequestMapping(value = "/dept/get/{id}",method = RequestMethod.GET)Dept get(@PathVariable("id") long id);@RequestMapping(value = "/dept/list",method = RequestMethod.GET)List<Dept> list();@RequestMapping(value = "/dept/add",method = RequestMethod.POST)boolean add(Dept dept);}

 

@RestController
public class DeptConsumerController {@Autowiredprivate DeptClientService service;@RequestMapping(value = "/consumer/dept/get/{id}")public Dept get(@PathVariable("id") Long id){return this.service.get(id);}@RequestMapping(value = "/consumer/dept/list")public List<Dept> list(){return this.service.list();}@RequestMapping(value = "/consumer/dept/add")public Object add(Dept dept){return this.service.add(dept);}}
package com.dhu.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(value = "com.dhu.springcloud")
public class ConsumerDept80FeignApp {public static void main(String[] args) {SpringApplication.run(ConsumerDept80FeignApp.class, args);}}

 

八、Hystrix断路器

分布式系统面临的问题
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

1. 服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。

2. 服务熔断

服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand。

package com.dhu.springcloud.controller;import com.dhu.springcloud.entity.Dept;
import com.dhu.springcloud.service.DeptService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** @author zhou* @create 2020/6/9*/
@RestController
public class DeptController {@Autowiredprivate DeptService service;@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)//一旦调用服务方法失败并抛出错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod@HystrixCommand(fallbackMethod = "processHystrix_Get")public Dept get(@PathVariable("id") Long id){Dept dept =  this.service.get(id);if(null == dept){throw new RuntimeException("该ID:"+id+"没有没有对应的信息");}return dept;}public Dept processHystrix_Get(@PathVariable("id") Long id){return new Dept().setDeptno(id).setDname("该ID:"+id+"没有没有对应的信息,null--@HystrixCommand").setDbSource("no this database in MySQL");}
}
package com.dhu.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
@EnableCircuitBreaker
@EnableEurekaClient
@EnableDiscoveryClient
public class DeptHystrix8001App {public static void main(String[] args) {SpringApplication.run(DeptHystrix8001App.class, args);}}

 

3. 服务降级

整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来。

服务降级处理是在客户端实现完成的,与服务端没有关系。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

相关文章

  1. 第十一届蓝桥杯省选 7月场 题解 java实现

    试题 A: 指数计算 本题总分:5 分 【问题描述】 7 月 1 日是建党日,从 1921 年到 2020 年,中国共产党已经带领中国人民 走过了 99 年。 请计算:7 ^ 2020 mod 1921,其中 A mod B 表示 A 除以 B 的余数。 【答案提交】 这是一道结果填空题,你只需要算出结果后提交即可。本题…...

    2024/4/20 16:04:09
  2. Java将给出的链表中的节点每k个一组翻转,返回翻转后的链表

    题目描述将给出的链表中的节点每k个一组翻转,返回翻转后的链表如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。只允许使用常数级的空间例如:给定的链表是1->2->3->4->5对于 k = 2, 你应该返回 2->1->4-…...

    2024/5/2 7:48:40
  3. 力扣日常打卡---面试题04.12 求和路径

    题目描述: 给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量。注意,路径不一定非得从二叉树的根节点或叶节点开始或结束,但是其方向必须向下(只能从父节点指向子节点方向)。 示例:思路及题解…...

    2024/4/16 7:09:10
  4. java从内部类到匿名类到Lambda表达式简化

    从内部类到lambda表达式首先讲一讲内部类匿名类最后就是用Lambda表达式 首先讲一讲内部类 内部类是在一个已有的类里面创建一个新的类。 就比如在一个TalkingClock中间创建一个TimePrinter的类, Time Printer 类我后面会用在 TImer里面当做一个Event。Timer的作用是每过多少毫…...

    2024/4/16 7:09:45
  5. 两种变量、四种存储类以及他们的存储区、生存期与作用域....

    一、两种变量 局部变量:在函数内部定义 全局变量:在函数外部定义 二、 四种存储类 auto (自动类型): 修饰局部变量auto int a; 平时定义的变量都是自动变量,auto可以省略 , 没有赋初值为随机数 ,栈空间存放 ,从定义位置开始,到当前代码块结束,即局部变量用完就释放 ,…...

    2024/4/16 14:42:05
  6. python基础笔记4(函数,可变与不可变对象,局部与全局变量,参数的传递)

    一、函数 又叫方法,是用代码编写的能实现某一功能的代码块 定义: def 函数名(形参列表):函数体return 返回值def my_Sum(a,b):sum = a + breturn sum调用 语法一: 函数名(实参) A= my_Sum(1,2) print(A)语法二:(推荐) 为防止不同类,包中相同函数名造成调用混乱,使…...

    2024/4/1 2:02:16
  7. WPF中Height和ActualHeight的区别

    WPF中的FrameworkElement存在两个属性,Height和ActualHeight。其中ActualHeight表示的是元素重绘制后的尺寸,并且是只读的。也就是说其始终是真实值。而Height属性,是可读写的,并且有如下特性:当Height的值小于MinHeight值时,元素将以MinHeight值进行显示,此时ActualHei…...

    2024/4/27 8:28:59
  8. LeetCode前置课-1-数组,链表,队列,栈

    1、数组 二维数组变稀疏数组://1、数组-》稀疏数组public static void xishuArray() {int array[][] = new int[11][11];array[1][2] =1;array[1][5] =2;array[3][7] =1;array[7][9] =1;System.out.println("数组:");for(int i =0; i<array.length; i++){for(in…...

    2024/4/18 11:52:44
  9. Power OJ 1053合并果子

    Description ** 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆…...

    2024/4/16 7:09:30
  10. Celery

    Celery 无法获得任务结果,状态总是 PENDING 测试环境是windows 64 python 3.7 Celery 3.2 Redis 解决方法 windows 下需要增加 --pool=solo 参数。但是 --pool=solo会把程序变成单线程的。 这时候应该切换模式。 使用-P threads 模式就可以解决这个问题了。 celery.exe -A ta…...

    2024/4/16 7:10:21
  11. 计算两点间的距离 根据经纬度

    CREATE DEFINER=`qxdjadmin`@`%` FUNCTION `calc_distance`(`lons1` VARCHAR(10),`lats1` VARCHAR(10),`lons2` VARCHAR(10),`lats2` VARCHAR(10)) RETURNS double BEGIN#计算地图距离#`lon1` ,`lat1`为列表坐标 lon2`,`lat2为查询坐标DECLARE ew1 double;DECLARE ew2 doub…...

    2024/4/24 17:07:48
  12. Linux简述及常用命令

    Linux 于1991年由芬兰大学生开发,是一个类Unix开源版操作系统。 特点: 强大的硬件支持 安全性高、稳定性强(开源稳定漏洞少) Linux使用范围广(应用服务、效率要比微软高)Shell Linux系统中运行的一种特殊程序 在用户和内核之间充当“翻译官” 用户登录Linux系统时,自动加…...

    2024/3/31 8:24:43
  13. 为什么win7文件夹那里没显示工具栏了,例如,文件,编辑,查看,工具,帮助

    没显示工具栏 本来应该是这样:结果却变成这样了:如果要显示: 1.点击组织, 2.弹出菜单选择点击布局, 3.点击选择菜单栏就可以显示了...

    2024/4/23 21:36:23
  14. Nodejs进行RSA签名(SHA256withRSA)

    最近在做开放平台项目,在编写SDK的时候用到签名验签功能,采用Sha256WithRSA签名,具体流程是使用私钥生成签名,然后公钥进行验签。 现在把私钥签名的代码分享出来。 package.json添加依赖: "dependencies": {// 加密库"jsrsasign": "^8.0.19"…...

    2024/4/16 7:09:40
  15. 实习第三天作业

    一、C语言标准(K&R C/C89/C99/C11)K&R C起初,C语言没有官方标准。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。布莱恩柯林汉(Brian Kernighan) 和 丹尼斯里奇(Dennis Ritchie) 出版了一本书,名叫《The C Programming Language》。这本书被…...

    2024/4/16 7:09:25
  16. 1067 - Invalid default value for ‘value‘ 已解决

    问题描述: 使用数据库MySQL5.5,在导入sql文件插入表时出现错误1067,与网上大部分出现时间的字段不同,出错误的数据格式是int或double类型的。 解决方法 使用网上修改my.ini再改sql_mode的方法不行,后来通过简单设定默认值就解决了。 原SQL语句`Time` double(255, 0) NOT N…...

    2024/4/20 6:08:31
  17. Linux | Ansible

    Ansible是一种自动化的运维工具,基于Python开发,它集合了众多运维工具(比如puppet、chef、func等)的优点,能够实现批量操作。但其实Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架。安装Ansibleyum…...

    2024/4/1 2:02:09
  18. 命令中/bin/sh -c 参数

    /bin/sh -c的必要性 引用: https://blog.csdn.net/qq_34562093/article/details/89948303 用法 一、 比如要向 test.asc 文件中随便写入点内容,可以: $ echo “信息” >> test.csv 如果将 test.asc 权限设置为只有 root 用户才有权限进行写操作: $ sudo chown root.r…...

    2024/4/16 7:10:31
  19. C/C++图像处理4 边缘检测

    目录内容原理代码梯度算子Robert算子Sobel算子Laplace算子结果完 内容 使用梯度、Robert、sobel、laplace算子对图像进行边缘检测 原理 share_noel/图像处理/数字图像处理-夏良正.pdf 提取码:0ooc 数字图像处理-夏良正P194代码 基于前面的博客C/C++图像处理1 灰度图修正添加处…...

    2024/4/16 7:10:21
  20. Docker容器操作

    1.运行容器 运行容器需要定制具体镜像,如果镜像不存在,会直接下载 #简单操作 docker run 镜像的标识|镜像的名称[:tag] #常用的参数 docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag] #-d:代表后台运行容器 #-p 宿主机端口:容器端口:为了映…...

    2024/4/1 2:02:07

最新文章

  1. 可靠的Mac照片恢复解决方案

    当您在搜索引擎搜索中输入“Mac照片恢复”时&#xff0c;您将获得数以万计的结果。有很多Mac照片恢复解决方案声称他们可以在Mac OS下恢复丢失的照片。但是&#xff0c;并非互联网上的所有Mac照片恢复解决方案都可以解决您的照片丢失问题。而且您不应该花太多时间寻找可靠的Mac…...

    2024/5/2 11:36:20
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. 第37篇:分频器<四>

    Q&#xff1a;介绍完计数器分频电路概念原理之后&#xff0c;本期我们设计实现四分频计数器分频电路。 A&#xff1a;使用DE2-115开发板的KEY[1]作为时钟i_clk输入&#xff0c;KEY[0]作为清零复位i_rst输入&#xff0c;LEDR[0]显示分频后的时钟o_clk输出值&#xff0c;LEDR[3:…...

    2024/4/30 16:33:48
  4. MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用

    数据结构 我们知道MySQL的存储引擎Innodb默认底层是使用B树的变种来存储数据的 下面我们来复习一下B树存储 B树存储 哈希存储的区别 哈希存储,只能使用等值查询 B树与B树存储 我们知道B树实际上就是B树的变种 那么为啥使用B树而不是使用B树呢? 我们知道效率的高低主要取决于…...

    2024/5/2 2:42:20
  5. Chrome 浏览器无法保存或自动填充密码

    Chrome 浏览器无法保存或自动填充密码 分类 平时使用 Chrome 浏览器都会对网站的用户名密码自动填充&#xff0c;今天发现突然不行了&#xff0c;找到一个解决办法&#xff1a; 1、退出 Chrome 浏览器。2、打开 Chrome 安装目录下的的 Profile 目录&#xff0c;删除 Login Da…...

    2024/4/30 3:32:50
  6. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

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

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

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

    2024/5/2 9:28:15
  10. 【外汇早评】日本央行会议纪要不改日元强势

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

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

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

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

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

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

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

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

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

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

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

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

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

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

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/5/2 9:07:46
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 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
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,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
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在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