为了账号安全,请及时绑定邮箱和手机立即绑定
3.1 打包为微信小程序

注册微信小程序账号,获取到 AppID,我们后面配置的时候会用到。在 HBuilderX 工具栏,点击发行,选择小程序-微信。输入小程序名称和 AppID,单击发行就可以了。这样我们就会获得一个微信小程序的打包文件,接下来我们来发布微信小程序项目,打开微信小程序开发者工具,导入刚刚生成的微信小程序项目的打包文件,在微信小程序开发者工具中先测试一下,项目运行是否正常,项目测试没有问题后,点击右上角>>按钮,上传代码就可以发布微信小程序了,最后等待微信团队审核通过,别人就可以在线上访问到你的项目了。

3.1 微信小程序 API

uni-app 的 API 与微信小程序 API 基本一致。掌握微信小程序 API 对后面的开发很有帮助。微信小程序 API 文档:https://developers.weixin.qq.com/miniprogram/dev/api/

3.4 电源

事件日志中包含屏幕电源状态,其中 0 表示屏幕关闭,1 表示屏幕打开,2 表示已锁屏。日志范例如下:grep screen_toggled bugreport-2015-10-18-16-52-22.txt10-18 15:05:04.383 992 992 I screen_toggled: 110-18 15:05:07.010 992 992 I screen_toggled: 010-18 15:23:15.063 992 992 I screen_toggled: 110-18 15:23:25.684 992 992 I screen_toggled: 010-18 15:36:31.623 992 992 I screen_toggled: 110-18 15:36:37.660 3283 3283 I screen_toggled: 2错误报告中还包含关于唤醒锁的统计信息,唤醒锁是应用开发者采用的一种机制,用于表明其应用需要设备保持开启状态。唤醒锁总时长统计信息仅跟踪唤醒锁实际负责使设备保持唤醒状态的时间,不包括屏幕处于开启状态的时间。此外,如果同时持有多个唤醒锁,系统会在它们之间分配唤醒锁时长。

3.2 电话和短信

Phone 设置项中可以模拟来电和短信:From:选择或输入电话号码;CALL DEVICE:点击来电;HOLD CALL:点击保持通话;END CALL:点击结束通话;SMS message:输入模拟消息的正文内容;SEND MESSAGE:点击发送短信。

2. 消息适配器基础概念概述

基础概念:消息适配器,可能一说这个名词,大家就感觉有点陌生,我们可以把消息适配器拆开来进行理解。首先,消息这一名词就不用多说了,消息在我们的应用程序中指的就是应用程序中的数据,在 RabbitMQ 中,指的就是在 RabbitMQ 中流转的消息,也就是说,我们应用程序中的数据在 RabbitMQ 中就被称为消息。最后,我们再来看适配器。和之前一样,我们先从日常生活中举个例子,比如我们的笔记本电脑,在笔记本电脑上存在不同的对外暴露的类似USB形式的端口,这些端口不仅仅只有USB这一种类型,还有Type-C,以及Light端口等,根据我们的需要来连接这些端口所用的工具就可以看做是一个适配器。当我们需要将自己的电脑与大屏或投影仪设备相连接时,此时,我们需要一根连接在电脑和大屏或投影仪设备之间的连线,这根线我们通常称为数据线,在有了这根数据线之后,我们就可以建立起一个在电脑和大屏或投影仪设备之间的连接,就可以将电脑的屏幕投影到大屏或投影仪设备上,这个过程就是我们的电脑适配大屏或投影仪设备的一个过程,而这中间的数据线就被可以被称为适配器。如果我们没有这个数据线来作为电脑与大屏或投影仪设备之间的适配器,那么通常情况下我们就不能将电脑屏幕来进行投影了(Wifi投影的情况除外)。在这一例子中,我们也可以这样说:即需要一根数据线来将我们的电脑屏幕与大屏或投影仪设备进行适配,以达到投影电脑屏幕的目的。说白了,适配器其实就是为了适配两种不同物品,来达到两种或多种物品之间的协同工作的目的的一种技术手段,而这种技术手段可以是技术实物(比如数据线),也可以是一种可以在空气中进行传播的介质(Wifi投屏)。消息适配器亦是如此,在 Spring-AMQP 中,消息适配器指的就是,为了监听 RabbitMQ 中的消息,从而将消息与具体的业务逻辑相结合,达到消息适配业务逻辑的目的的一种技术手段。在介绍完消息适配器的基础概念之后,下面让我们来看一下如何对消息适配器进行简单的配置吧。

1. 数据转成电信号

数据转换成电信号还是比较简单的,将字符根据指定的编码转换成唯一的二进制编码,然后将二进制的 01 映射成高低电平就可以传输出去了。

2.3 电源状态命令

命令说明power display显示电池和充电器状态。power ac {on\off}将交流电充电状态设为 on 或 off。power status {unknown\charging\discharging\not-charging\full}按照说明更改电池状态。power present {true\false}设置电池存在状态。power health {unknown\good\overheat\dead\overvoltage\failure}设置电池运行状况。power capacity percent将电池剩余电量状态设为 0 到 100 之间的百分比。

3.1 星投影的定义

星投影是一种特殊的星号投影,它一般用来表示不知道关于泛型实参的任何信息,换句话说就是它表示一种特定的类型,但是只是这个类型不知道或者不能被确定而已。

3.1 电量

Battery 设置中共用4项参数可以调节,模拟设备的电池属性,了解应用在不同条件下的运行情况:Charge level:设置当前电量值,百分比;Charger connection:设置充电器连接状态,是否连接充电器;battery health:设置电池监控状态,正常或者损坏等;Battery status:设置电池状态,正在充电或者已经充满等。

5. 小结

本节内容概览本小节从服务资源隔离的前提概念开始介绍,采用图文并茂的方式,详细介绍了进程和线程、Web 项目中的进程与线程、服务资源隔离产生的原因,以及服务资源隔离的概念;接着,我们采用代码实现的方式,对 Hystrix 中的线程池隔离和信号量隔离这两种实现服务资源隔离的措施进行了介绍,并对其中需要注意的地方做了补充。服务资源隔离是微服务项目治理中的最后一关,同时也是至关重要的一关,微服务项目经常由于服务没有响应而导致后续服务瘫痪,所以,掌握服务资源隔离是保证微服务项目正常运行的关键所在。

3.2 信号量隔离实现服务资源隔离

信号量隔离和线程池隔离的方式很相似,只不过把分配线程池的方式改为了分配信号量(至于什么是信号量,请同学们自行查阅)。在处理请求时,Hystrix 会分配一个信号量的阀值,当服务接收到一个请求后,信号量的阀值减 1 ,当请求处理完毕后,信号量的阀值加 1,当信号量的阀值减为 0 时,则不再接收请求,即该请求会被拒绝处理。@RequestMapping(value = "hello", method = RequestMethod.GET)@HystrixCommand(fallbackMethod="helloFail", commandProperties = {@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "SEMAPHORE"),@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS, value = "100")})@ResponseBodypublic String hello() throws InterruptedException { return "helloWorld";}public String helloFail() { return "helloFailed";}代码解释:第 4 行,通过指定 HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY 参数的值为 SEMAPHORE ,来声明该接口使用信号量隔离。第 7 行,通过指定 HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS 参数的值为 100 ,可以理解为设置信号量的阀值为 100 。通过添加上述配置参数,我们就可以通过信号量隔离的方式来实现服务资源隔离。Tips: 一定要合理设置信号量的阀值,不要随意设定,如果阀值设置过大,则请求不会停止,如果阀值设置过小,则不能满足业务需要。

4.6 配置数据源信息

我们只需要通过配置文件指定数据源信息, Spring Boot 就可以识别配置,并加载到数据源组件中。 JdbcTemplate 也可以自动识别该数据源,从而实现对数据库的操作。配置文件信息如下:实例:# 配置数据库驱动spring.datasource.driver-class-name=com.mysql.jdbc.Driver# 配置数据库urlspring.datasource.url=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8# 配置数据库用户名spring.datasource.username=root# 配置数据库密码spring.datasource.password=123456需要注意的是,我们在 URL 配置中指定了编码方式,这样可以防止出现数据库中文乱码情况。同时指定了时区为北京时间所在的东八区(GMT%2B8),避免因时区问题导致错误。此时再次启动 Spring Boot 应用,正常运行,说明我们的数据源配置生效了。

3.2 安全可靠的投递性

RabbitMQ 在进行消息传递的时候,会在其容器中进行一些必要的检测,来保证消息间通信的可靠性,具体 RabbitMQ 是怎样进行消息间通信的检测的,我们在本套课程中就不再介绍了,因为这涉及到 RabbitMQ 的底层实现,和课程初衷是不符的。现在我们只需要这样理解就行了:当我们将一条消息放入到 RabbitMQ 中时,RabbitMQ 首先会检测消息所处的环境,然后 RabbitMQ 会将该条消息通过一定的加密算法进行加密,最后,通过 RabbitMQ 的消息通道,将消息投递到它该去的地方。

2.1 微框架

Flask 是一个 Python 实现的 Web 开发微框架,但是这个“微”并不代表着 Flask 功能比较简陋、有所欠缺。微框架中的 “微” 意味着:Flask 旨在保持核心简单而易于扩展;Flask 不会替用户做出太多决策,比如使用何种数据库;Flask 的选项(比如使用何种模板引擎) 通常有多个,用户很容易替换。默认情况下,Flask 不包含数据库抽象层、模板引擎、身份认证或其它任何已有多种库可以胜任的功能,如下图所示。然而,Flask 支持用扩展来给应用添加这些功能,应用程序可以很方便的集成这些扩展。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。

1.1 什么是 Energy Profiler

Energy Profiler 可帮助我们了解应用在哪里耗用了不必要的电量。Energy Profiler 会监控 CPU、网络无线装置和 GPS 传感器的使用情况,并直观地显示其中每个组件消耗的电量。Energy Profiler 还会显示可能会影响耗电量的系统事件(唤醒锁定、闹钟、作业和位置信息请求)的发生次数。Energy Profiler 并不会直接测量耗电量,而是使用一种模型来估算设备上每项资源的耗电量。

2.1 微前端

微前端 尚处在发展时期,其核心概念和 微服务 相似。现阶段较为常用的微前端框架为 single-spa 和 qiankun,后者是基于前者实现的。该技术能做到 技术栈无关,即一个应用,能由多个不同技术的子应用构成,同时做到子应用的相互隔离,这里的隔离就可以选择采用 Web Components 实现。

3.5 配置数据源信息

通过配置文件,设置数据源信息。由于我们不再使用默认数据源,所以此处需要指定数据源类型为 DruidDataSource 。实例:# 指定数据源类型spring.datasource.type=com.alibaba.druid.pool.DruidDataSource# 配置数据库驱动spring.datasource.driver-class-name=com.mysql.jdbc.Driver# 配置数据库urlspring.datasource.url=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC# 配置数据库用户名spring.datasource.username=root# 配置数据库密码spring.datasource.password=Easy@0122

2.2 前置鉴权

Spring Security 的权限判断可以发生在方法被调用前,或者 WEB 请求之前。在请求的开始,由 AccessDecisionManager 对象将判断其是否允许继续执行。AccessDecisionManager 对象由 AbstractSecurityInterceptor 发起调用,其职责是给出资源是否能被访问的最终结果,AccessDecisionManager 包含三个主要方法:判断配置属性是否可被访问;boolean supports(ConfigAttribute attribute);判断安全对象的类型是否支持被访问;boolean supports(Class clazz);通过认证信息、安全对象、权限信息综合判断安全对象是否允许被访问。void decide(Authentication authentication, Object secureObject, Collection<ConfigAttribute> attrs) throws AccessDeniedException;Spring Security 的鉴权策略可以由用户自己实现,在 Spring Security 内部也实现了一套鉴权策略,称为「基于投票的访问决策管理」。在这种策略下,AccessDecisionManager 控制着一系列的 AccessDecisionVoter 实例,判断权限是否满足,如果不满足抛出 AccessDeniedException 异常。AccessDecisionVoter 也包含三个方法:判断配置属性是否支持;boolean supports(ConfigAttribute attribute);判断类型是否支持;boolean supports(Class clazz);根据认证信息对安全资源进行投票。int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attrs);投票鉴权分为三类:基于角色的投票:RoleVoter;基于认证信息的投票:AuthenticatedVoter,主要区分认证用户、匿名用户等;自定义投票策略。

3. Hystrix 实现服务资源隔离

在 Hystrix 中,实现服务资源隔离有两种方式,分别是线程池隔离和信号量隔离。

3.3 近于实时的补偿性

我们都知道,什么事情都不可能是十全十美的。抛开 RabbitMQ 不说,在互联网行业中的其他工具,也不能百分百保证每时每刻都在正常工作,更何况是涉及到消息通信的工具。RabbitMQ 在传递消息时,由于一些客观原因或者是其本身的原因,可能会出现,在有大批量消息传递时,所有的消息不能百分百传递到目的地的问题。RabbitMQ 在设计之初就考虑到了这个问题的出现,所以,RabbitMQ 提供了内置的消息补偿机制,这里我们简单做一下介绍。当存在大批量的消息都需要经过 RabbitMQ 来投递时,RabbitMQ 会将这些消息划分成若干组,然后通过为组设置顺序的方式,来依次投递这些消息。如果在任意一组中,出现了消息未能投递到目的地的现象,那么, RabbitMQ 会将该条消息进行短暂的存储,待其他消息都到达目的地后,RabbitMQ 会重新将该条消息进行投递,然而,这个过程执行的时间是微乎其微的,几乎近于实时。

新浪微博

咱们打开新浪微博,然后随便找个带皇冠的,按下F12键(Mac用户按command+option+i)然后选中控制台的箭头,再点击皇冠:再点开这个图片可以发现:可以看到那些大 V 图标皇冠图标以及各种微博认证等图标,都是放在了一张雪碧图里(即使再牛的大 V,身份标志也是放在雪碧图中的)。

1. 前言

上一小结谈到了操作系统中进程和线程的区别,其中进程之间、线程之间的通信方式不同,进程通信(Inter-Process Communication,简称 IPC)是指不同进程之间交换信息。操作系统中时刻都在进行 IPC,例如微信读取本地的文件,就是微信程序和文件系统进程交互的过程。

2. 数据的封装

试想一下,如果你在电脑上使用聊天工具,跟对方说了一句 你好,对方的电脑如果只收到了 你好的电频信号,是不能直接解析出来信息的。电脑解析电平信号需要解决很多问题:这个电信号我该用什么规则解析出正确的字符?这信息是谁发给我的?我的电脑现在运行着微信/ QQ /邮件服务等,它到底跟哪个应用交互的?对方的地址是什么,我要怎么回复出去?等等问题很多,所以信息的发送不止是简单的电信号转换,还要给我们的数据添加额外的很多标识,让对方机器清楚你是谁,哪里来的,跟我这台电脑的哪个程序交互等信息。网络模型就很详细的说明了里面具体要处理的事情,这里根据标准的 ISO 七层模型讲解。

3.1 模拟电话

模拟10086来电;gsm call 10086模拟接听来电;gsm accept 10086模拟挂断来电;gsm cancel 10086下面是完整会话示例。pt@Win10-Panda:~$ telnet localhost 5554Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.Android Console: Authentication requiredAndroid Console: type 'auth <auth_token>' to authenticateAndroid Console: you can find your <auth_token> in'C:\Users\panda\.emulator_console_auth_token'OKauth KeGgPVHDN7YifXfZAndroid Console: type 'help' for a list of commandsOKgsm call 10086OKgsm accept 10086OKgsm cancel 10086OK

4.1 在线转换

这个网站可以在线将数学公式转换成 mathml 代码

3.1 线程池隔离实现服务资源隔离

通过对处理项目中的工作线程的隔离,来避免工作线程处理接口时所产生的阻塞行为,从而保证工作线程可以顺利地调用接口来满足业务需要。而隔离工作线程的方式,就是为每个接口分配一个线程池,并在线程池中维护一定数量的线程,这样,当上述的接口 2 发生服务资源等待时,由于每个接口都分配了不同的线程池,所以不会影响到后续的 3 4 5 接口,如下图所示:线程池隔离实现原理可以看到,由于为每个服务接口均分配了不同的线程池,所以在接口 2 出现服务等待时,并不会影响后续接口的调用,从而保证了业务的顺利进行。我们继续以 hello 方法为例,来看如何实现线程池隔离。@RequestMapping(value = "hello", method = RequestMethod.GET)@HystrixCommand(threadPoolKey = "HelloHystrix", threadPoolProperties = { @HystrixProperty(name = "coresize", value = "2"), @HystrixProperty(name = "allowMaximumSizeToDivergeFromCoreSize", value = "true"), @HystrixProperty(name = "maximumSize", value = "2"), @HystrixProperty(name = "maxQueueSize", value = "2")})@ResponseBodypublic String hello() throws InterruptedException { return "helloWorld";}代码解释:第 2 行,我们通过配置 HystrixCommand 注解的 threadPoolKey 属性来为本接口分配一个名称为 HelloHystrix 的线程池。第 3 行,我们通过配置 threadPoolProperties 中的参数属性,来维护 HelloHystrix 线程池中的核心线程数量、最大线程数量。通过添加上述注解并配置其中的属性,我们就可以通过线程池隔离的方式来实现服务资源隔离。Tips: 线程池中的线程数量,一定要根据该接口所实现的业务需求来设置,设置过多,则会浪费资源空间,设置过少,则不能支撑业务需要,所以配置线程数量一定要谨慎。

2. 服务资源隔离真实业务场景描述

业务场景描述有这样一个真实的业务场景:在某大厂的订单与支付模块,当有用户下了订单之后,需要在支付模块进行支付,支付动作完成之后,支付模块会将支付完成的结果返回给订单模块来通知用户,该订单是否支付成功,即商品是否已经成功购买了。在微服务分布式架构模式下,上述业务场景中出现了一种异常现象:当用户下了订单之后,在支付模块进行支付时,系统一直没有响应,无论是否成功支付,用户都收不到任何通知信息。程序员在排查对应的业务实现代码时,证实了业务实现代码没有问题,这就导致无法定位问题所在。最终经过几名同事一起排查,发现是订单模块与支付模块之间进行数据传输时,支付模块收到了订单模块传递过来的数据,但是由于服务器高压工作,导致支付模块始终无法处理该支付请求,这就导致系统一直没有响应。问题原因分析在解决问题之前,我们首先来分析一下这种问题产生的原因。在前面我们介绍什么是 Hystrix 资源隔离小节中,我为大家阐述了在我们的 Web 项目中,进程与线程之间的关系。我们知道,在一般情况下,一个 Web 项目中只有一个工作线程来负责处理用户调用的请求和服务,当该工作线程所负责的请求处理缓慢时,该线程就会一直处理当前的请求,导致后续请求只能等待处理,这就是我们说的雪崩现象。雪崩效应产生原理在微服务分布式架构模式下,由于我们没有对线程进行处理,至此在处理所有业务请求时,扔是只有一个工作线程,这就导致上述业务场出现了我们所说的雪崩现象,不过还好,这种雪崩现象比较轻微,只影响到了一个业务模块。很多时候,当我们的项目架构演变为基于微服务的分布式架构时,服务器也需要同步进行更新,有很多企业为了节约成本,则只更新很少数量的服务器,或者压根就不更新服务器,这就导致经常会出现由于服务器高压工作而出现的请求处理缓慢,或请求无法继续处理的情况。

4.1 主要泄漏信息

IP 地址,物理地址网站后台访问地址,密码信息家庭成员信息,电话信息生日(很多人的秘密是生日日期)公司信息,同事信息

3. 什么是线程死锁

定义:死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的互相等待的现象,在无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去。如上图所示死锁状态,线程 A 己经持有了资源 2,它同时还想申请资源 1,可是此时线程 B 已经持有了资源 1 ,线程 A 只能等待。反观线程 B 持有了资源 1 ,它同时还想申请资源 2,但是资源 2 已经被线程 A 持有,线程 B 只能等待。所以线程 A 和线程 B 就因为相互等待对方已经持有的资源,而进入了死锁状态。

ECharts 折线图

这个小节开始我们开始学习 ECharts 中的各个图形,这些图形都有着自己独特的风格,有着自己更适合的场景,在合理的场景下选择更为合适的图才能让我们的数据更好展示与分析。本节我们就先讲折线图这个稍微简单的图形。折线图用于显示数据在一个连续的时间间隔或者时间跨度上的变化,它的特点是反映事物随另一维度数值变化所产生趋势。

首页上一页1234567下一页尾页
直播
查看课程详情
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号