• Jmeter系列(23)- 详解 HTTP 信息头管理器
    HTTP 信息头管理器这个比较简单啦,要啥信息头就加啥如果信息头管理器放到线程组下,那么线程组下所有 HTTP 请求都会共享这些 HTTP 信息头如果信息头管理器放到 HTTP 请求下,那么只有该请求拥有这些 HTTP 信息头这里和 HTTP 请求默认值一样,也有优先级的,而且优先级也一样如果有多个信息头管理器,名称重名的话,会按优先级高的先取 光理论很难理解,我们来看个栗子 测试计划树结构 第一个 HTTP 信息头管理器三个请求共享两个信息头:content-type、Accept 第二个 HTTP 信息头管理器Flask-json 接口独享的信息头:content-type、Accept-Charset、Accept-Encoding 获取最近会员登录列表的接口请求体直接用的就是【1--信息头管理器】的两个信息头 Flask-json的接口请求体这个请求有自己的信息头管理器,包含了 content-type,会覆盖【1--信息头管理器】content-type 的值 图片文件上传接口的请求体 总结HTTP 请求下的信息头管理器的优先级高于线程组下的信息头管理器若有重名的信息头名称,则优先取 HTTP 请求下的信息头管理器
  • Jmeter系列(22)- 详解 HTTP 请求默认值
    HTTP 请求默认值界面介绍乍眼一看,其实跟 HTTP Request 的界面基本一样,少了一点点东西而已,所以这里就不介绍每个字段的含义了,来说下注意事项 重点HTTP 请求默认值可以直接添加到线程组下面,也可以添加到某个 HTTP 请求下面如果是在线程组下的 HTTP 请求默认值,那么它的作用域就是该线程组下的所有 HTTP 请求,包括子级、孙子级、孙孙子级的 HTTP 请求如果实在某个 HTTP 请求下的 HTTP 请求默认值,那么它的作用域就只针对这个 HTTP 请求线程组的 HTTP 请求默认值的优先级小于HTTP 请求下的 HTTP请求默认值当然啦,所有 HTTP 请求默认值的优先级都比 HTTP 请求低 光理论很难理解,我们来看个栗子 测试计划树结构一个线程组下的 HTTP 请求默认值(1),两个 HTTP 请求下的HTTP 请求默认值(2、3) 第一个 HTTP 请求默认填写的内容设置了:协议、host、端口、编码、参数 第二个 HTTP 请求默认填写的内容设置了:host、端口、路径 第三个 HTTP 请求默认填写的内容设置了:host、编码、参数列表 看看 Flask-json 的请求体和响应体吧 可以看到【2--请求默认值】里设置的host、端口、路径把【1--请求默认值】设置的覆盖掉了又因为【1--请求默认值】设置了编码和参数列表,而【2--请求默认值】没有设置,所以直接拿了【1--请求默认值】的值但有个问题,HTTP 请求本身有设置请求数据(JSON),请求数据是不会被覆盖的,而会把【1--请求默认值】的参数列表和 JSON 数据拼接在一起,拼接后的数据结构是错误的,所以请求会报错即使 HTTP 请求默认值里面设置的是 JSON 数据,也不会合二为一,仍然会报错(如下图) 看看图片文件上传接口的请求体和响应体吧 可以看到【2--请求默认值】里设置的host、编码把【1--请求默认值】设置的覆盖掉了而这个 HTTP请求的请求数据是也是参数列表形式传参的,这样就可以拼接成功了最终会把两个请求默认值的参数列表拼接起来再传递,即使参数名一样,仍然会分开传,而不是覆盖参数值(可见下面的扩展小栗子) 总结HTTP 请求所需的各种字段值(host、端口、编码、请求数据等等),取值的顺序(优先级)是:HTTP 请求本身设置的值HTTP 请求下的 HTTP 请求默认值设置的值线程组下的 HTTP 请求默认值设置的值
  • Jmeter系列 - 详解 HTTP Request
    HTTP Request 介绍用来发送 HTTP、HTTPS 协议请求 HTTP Request 界面字段名作用名称不多介绍啦,建议自定义一个识别度高的名称注释对于测试没有任何影响,仅记录作用协议http或https,大小写不敏感默认:http服务器名称或IP服务器 host 或者 ip,不包括协议比如:www.baidu.com、192.168.196.128端口号目标服务器的端口号,默认:80方法发送 http 请求的方法路径目标请求的 URL 路径不包括协议、host、ip、端口内容编码请求的编码方式,默认:iso8859自动重定向发出的请求的响应码是3**,会自动跳转到新目标页面只记录最终页面的返回结果跟随重定向和自动重定向唯一不同的是:会记录重定向过程中的的所有请求的响应结果使用 KeepAlivejmeter 和目标服务器之间使用 Keep-Alive 方式进行 HTTP 通信真正做性能测试强烈建议不勾选对POST使用multipart/form-datapost 请求需要上传文件时勾选与浏览器兼容的头当勾选 multipart/form-data 时,勾选此项http请求头中的 Content-Type 和Content-Transfer-Encoding 被忽略而只发送 Content-Disposition 部分 Parameters 讲解字段描述Name参数名Value参数值URL Encode?是否要 URL 编码?重点:如果参数值包含了中文、特殊字符(非数字字母以外),最好勾上,当然全都勾上最稳妥Content-Type参数值的资源类型默认:text/plainInclude Equals?当你的参数值为空的时候,可以选择不包含=,默认勾选如果参数值不为空,则不可以取消勾选 什么是 URL 编码URL 编码解码,又叫百分号编码,是统一资源定位(URL)的编码方式URL 地址(常说网址)规定了数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用( / , : @  等),剩下的其它所有字符必须通过 %xx 编码处理编码方法很简单,在该字符ascii码的的16进制字符前面加%,如空格字符,ascii码是32,对应16进制是20,那么 urlencode 编码结果是 %20  URL 编码的栗子直接在网上搜在线 URL 编解码 include equals 的栗子参数值为空,且勾选 Include equals 参数值为空,但不勾选  Include equals 其实说的就是等于号而已,一般也不会传空值,即使传了也会带上= Body Data 讲解没啥好说的,传 json 字符串就行了,注意下格式,后面再讲具体栗子不过倒有个重点:如果 Parameters 有参数列表的话,是无法切换到 Body Data 的哦 Files Upload 讲解字段描述File Path文件的本地路径Parameter Name参数名MIME Type资源媒体类型 常见资源媒体类型类型文件后缀格式超文本标记语言文本.htmltext/html普通文本.txttext/plainXML 文件.xmltext/xmlPNG 图片.pngimage/pngGIF.gifimage/gifJPEG 图片.jpeg、jpg image/jpeg 类型文件后缀格式表单中进行文件上传 multipart/form-data表单默认提交数据的格式 application/x-www-form-urlencodedXML 数据格式 application/xmlJSON 数据格式 application/jsonPDF 文件.pdfapplication/pdfRTF 文本.rtfapplication/rtfGZIP 文件 .gzapplication/x-gzipTAR 文件.tarapplication/x-tarAVI 文件.avi video/x-msvideoMPEG 文件.mpg、.mpegvideo/mpeg 不同的content-type在jmeter中如何输入参数前提因为是需要真实接口进行测试的,这里提供两种方案自己用 Flask 框架开发了本地的接口进行测试, 如果有需要的同学进群领取哦:870155189或者进入 http://open.yesapi.cn/?r=user/registration&from=wx_837493986,直接注册个账号,弄个免费会员,有在线免费的接口提供测试哦 application/x-www-form-urlencoded 的栗子备注:也是表单提交最常见的栗子 Parameters 方式传参 总结最终表单的参数列表会拼接到 URL 中,所以如果包含了中文、特殊字符就要勾选编码?哦这里不可以通过 Body Data 传递参数哦,会无法识别到参数,已实践过(即使加了 HTTP请求头也不行),乖乖用 Parameters 的方式传参 content-type:application/json 的栗子Body Data 方式传参 添加 HTTP请求头 请求体 请求头 结论重点就是添加 HTTP请求头,指明 Content-type 是 json 格式 content-type:multipart/form-data重点:用于 post 请求,需要文件上传的场景;记住不是 get 请求 请求参数列表如果选了 get 方法的话,文件参数是不会生效哦 文件参数 请求体 重点如果添加了 HTTP请求头,请务必不要添加 content-type : multipart/form-data 如果加了的话:那么所有的请求参数都会被当成文件以二进制形式传输,我们 parameters 里的文本格式参数就不会被识别,接口会提示参数为空 HTTP Request Advance说实话我还没用过这部分的内容,不过还是得了解下每个配置项是什么意思哦 Client implemention 和 Timeouts字段描述implementation发送http请求的方式,可选项为 java、HttpClient4(默认)Connect连接超时时间,单位毫秒Respones响应等待超时时间,单位毫秒 Embedded Resources from HTML Files从HTML文件获取所有内含的资源jmeter 在发出的  HTTP请求获得响应的 HTML文件内容后,对 HTML进行解析并获取HTML中包含的所有资源(图片、flash等)字段描述Retrieve All Embedded Resources发送http请求的方式,可选项为 java、HttpClient4(默认)Parallel downloadds. Number是否使用自设资源处。启用后可以设置资源池大小,默认为6URLs must matchURL 匹配过滤,填写此项则只会下载与此内容项匹配的 url 的资源 Source address只用于 HTTP协议且 implemention = HttpClient4 时字段描述IP/HostnameIP /主机名以使用特定的IP地址或(本地)主机名Device选择设备以选择该接口的第一个可用地址,该设备可以是IPv4或IPv6Device IPv4选择IPv4设备来选择名称设备的IPv4地址(如eth0, lo, em0)Device IPv6选择IPv6设备来选择名称设备的IPv6地址(如eth0, lo, em0) Proxy Server代理服务器字段描述Server Name or IP代理服务器的名称或者IP地址Port Number代理服务器的端口号Username代理服务器的用户名Password代理服务器的密码__EOF__
  • Jmeter系列 - Samplers
    Samplers 简介取样器指示Jmeter向服务器发送请求并等待响应多个取样器按照它们在树中出现的顺序运行取样器 + 控制器可以修改取样器的执行次数 Jmeter自带的取样器FTP RequestHTTP Request (can be used for SOAP or REST Webservice also)JDBC RequestJava object requestJMS requestJUnit Test requestLDAP RequestMail requestOS Process requestTCP request Samplers 的特性每个取样器都有几个可以设置的属性也可以向测试计划或线程组中添加多个Config Element(配置元件)来更进一步自定义取样器最后,要在测试计划中添加一个Listener(监听器),以便查看请求结果,或存储结果到磁盘备注:上面说到的配置元件和监听器,在后面文章都会详解哦!这里就提一下栗子一:添加HTTP请求默认值配置元件如果要发送多个相同类型的请求(如:HTTP请求)到同一服务器,可以考虑抽取公共HTTP信息栗子二:添加断言在对Web应用程序进行压力测试时,服务器可能返回成功的响应代码,也可能返回失败的响应代码;添加断言可以检查请求的响应是否符合预期 
  • [网络安全] 常见web漏洞——HTTP报头追踪漏洞
    HTTP/1.1(RFC2616)规范定义了HTTP TRACE方法,主要是用于客户端通过向Web服务器提交TRACE请求来进行测试或获得诊断信息。当Web服务器启用TRACE时,提交的请求头会在服务器响应的内容(Body)中完整的返回,其中HTTP头很可能包括Session Token、Cookies或其它认证信息。攻击者可以利用此漏洞来欺骗合法用户并得到他们的私人信息。该漏洞往往与其它方式配合来进行有效攻击,由于HTTP TRACE请求可以通过客户浏览器脚本发起(如XMLHttpRequest),并可以通过DOM接口来访问,因此很容易被攻击者利用。防御HTTP报头追踪漏洞的方法通常禁用HTTP TRACE方法。
  • Cypress - 命令大全
    查找页面元素的基本方法命令get()find()contains() 查找页面元素的辅助方法命令children()parents()parent()siblings()first()last()next()nextAll()nextUntil(selector)prev()prevUntil()each()eq()closest() 点击命令命令作用click()单击dbclick()双击rightclick()右键点击 操作页面元素的命令命令作用type()输入框输入文本元素focus()聚焦DOM元素blur()DOM元素失去焦点clear()清空DOM元素submit()提交表单check()选中单选框、复选框uncheck()取消选中复选框select()select options选项框scrollIntoView()将DOM元素滑动到可视区域trigger()DOM元素上触发事件scrollTo()滑动滚动条 获取页面全局对象的命令命令作用window()获取当前页面的窗口对象title()获取当前页面的titleurl()获取当前页面的URLlocation()获取当前页面的全局window.location对象document()获取当前页面的全局windowd.ocument对象hash()获取当前页面的URL 哈希值root()获取根DOM元素 操作浏览器的命令命令作用go()浏览器前进、后退reload()刷新页面viewport()控制浏览器窗口的大小和方向 visit()访问指定的 urlwait()强制等待 操作上一条命令返回结果的命令命令作用then()将上一条命令返回的结果注入到下一个命令中and()创建一个断言。断言将自动重试,直到它们通过或超时should()and() 的别名invoke()对上一条命令的结果执行调用方法操作its()获取对象的属性值as()取别名 within()限定命令作用域each()遍历当前元素spread()将数组内容作为单独的参数传回到回调函数 操作文件相关命令命令作用fixture()加载数据文件readFile()读取文件数据writeFile()写入数据到文件 网络相关命令命令作用request()发送 HTTP 请求route()路由server()mock 服务器intercept()管理所有HTTP请求 操作 Cookie 相关命令命令作用getCookies()获取所有 CookiessetCookie()设置一个 CookieclearCookie()清除指定名称的 CookieclearCookies()清除所有 Cookie 其他命令命令作用wrap()返回一个传递给它的对象,从而得到一个 Promise 对象end()结束命令链exec()执行系统命令screenshot()截取被测应用程序的屏幕快照,以及 Cypress 命令日志的屏幕快照  Cypress API 命令大全命令Cypress.CommandsCypress.CookiesCypress.configCypress.envCypress.domCypress.platformCypress.versionCypress.archCypress.specCypress.browserCypress.log 插件引入的新命令命令作用cy.xpath可以通过 xpath 去定位元素cy.downloadFile下载文件.attachFile()上传文件   __EOF__
  • [技术干货] 小熊派+Mpu6050:获取三轴加速度、三轴陀螺仪数据
    >前文:通过[自制小熊派扩展板——六轴传感器扩展板](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=121171),我们在小熊派上搭建了六轴传感器模块。 本文从C语言程序出发,获取三轴加速度数据、三轴陀螺仪数据。并根据原始数据求得真实数据 # 一、实验准备 ## 1.实验环境 - 小熊派开发板,以及MicroUSB数据线 - 已经安装STM32CubeMX - 已经安装KeilMDK,并导入stm32开发板对应的芯片包(小熊派使用的是STM32L431RCT6) - 如果不使用DMP,可以用杜邦线连接MPU6050 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/15/152352svynhwyvszors1ca.png) ---- ## 2.目标效果 - 通过CubeMX创建工程并配置参数 - IIC方式通信,配置MPU6050寄存器。 - 小熊派通过IIC,获取陀螺仪、加速度计数据。 - 对获取的原始数据进行分析,获取加速度、陀螺仪值。 - 串口1重定向输出加速度、陀螺仪值。 # 二、通过CubeMX生产MDK工程 ## A.芯片选择 - **打开CubeMX,进入芯片选择:** ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/30/212026gwrodk54oyp4fcl0.png) - **选择自己的stm32芯片(即STM32L431RCT6):** ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/30/212556cpcaurxs79c0xlnq.png) --- ## B.时钟源RCC设置 - **更改系统时钟源** >系统时钟默认使用内部的高速时钟(HSI),选择使用HSE,时钟更精确 - 设置外部时钟对应的端口 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/30/213059x5earvssmihl5hsf.png) - 配置时钟树 >STM32L431RCT6系统时钟最大可以为80MHz,我们配置到最大即可 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/30/213359df4zzbsoimhq2cgg.png) --- ## C.参数配置(对应端口设置) ### **1)配置USART1** 使用USART,模式为异步,波特率为115200,无硬件流控制 ---- ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/113002az5kmov8zzgjmkkd.png) ---- ### **2)硬件IIC配置** ``` IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构 ``` 我们使用小熊派的I2C1,小熊派引出的引脚为**PB7->I2C1_SDA,PB6->I2C1_SCL** 其他选项我们保持默认即可 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202011/23/211758a2wp3eljqb59qb6v.png) ### 3)MPU6050模块 当然,我们还需要了解MPU6050模块的电路,更好的进行配置。当然我们也可以自主制作模块 **如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位);如果AD0脚接V3.3,则IIC地址为0X69(不包含最低位).** ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202011/23/212349tmiaru2tuniste0z.png) **可以看到,AD0引脚已经被拉低,所有默认IIC地址为0x68. ** **最后,生成代码就OK了** ## D.工程设置 一些基础的设置,包括工程名、存储位置、工程环境、工程中各个文件的组成 ---- ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202011/23/212548euc6o7cvi4cot4wz.png) ---- ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/114727qvkul4oarss1pxdq.png) ---- ## E.生成代码 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/115001f5olm8dvgsctxvko.png) ---- # 三、编写相应代码 ## 1. 串口1输出重定向 >我们知道printf是打印函数,原理是根据传入的字符串参数格式化打印输出到stdout中。我们需要让printf打印到串口之中,只需要在usart.c文件中模仿printf写一个输出函数即可 - 在添加头文件 ```c /* USER CODE BEGIN 0 */ #include <stdarg.h> #include <string.h> #include <stdio.h> /* USER CODE END 0 */ ``` - 写输出函数 ```c /* USER CODE BEGIN 1 */ void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...) { unsigned char UsartPrintfBuf[296]; va_list ap; unsigned char *pStr = UsartPrintfBuf; va_start(ap, fmt); vsprintf((char *)UsartPrintfBuf, fmt, ap); //格式化 va_end(ap); while(*pStr != 0) { USART1->TDR = *pStr++; while((USART1->ISR & 0x40) == 0); } } //注意:在usart.h中添加void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...); //使用方法:UsartPrintf(&huart1;,"hello world\r\n"); /* USER CODE END 1 */ ``` >注意:自己添加的代码,需要在begin和end之间 ## 2.写MPU6050驱动 >我们创建两个文件,分别是mpu6050.h和mpu6050.c ### a).首先我们在mpu6050.h中宏定义相应的寄存器,方便后续使用。 >因为寄存器实在太多,就没有一一列出,可以在附件中查看哦~ ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202011/23/212837k0bqvm1dck0bwsmk.png) ### b).配置各个寄存器 >主要的函数为:IIC读写、初始化MPU6050、设置陀螺仪和加速度计满量程、设置采样率、读取数据 代码附件中有,不一一讲解。 **初始化函数** >初始化函数中,我们必须要保证IIC读写的正确,因此可以通过读某一个有确定值的寄出去,大致判断IIC通信的准确。此方法同样在SPI等通信协议时会使用到 ```c uint8_t MPUInit(void) { uint8_t res; extern I2C_HandleTypeDef hi2c1; HAL_I2C_Init(&hi2c1;); //初始化IIC /*上电后最好有一定延时,保证数据准确*/ HAL_Delay(500); MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x80); //复位MPU6050,写入1000 0000 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x00);//sleep写入0,保持唤醒状态 MPU_Set_Gyro_Fsr(3); //陀螺仪满量程±2000 MPU_Set_Accel_Fsr(1); //加速度计满量程±4g MPU_Set_Rate(50); //设置采样率=50Hz MPU_Write_Byte(MPU_INT_EN_REG,0x00);//关闭所有中断 MPU_Write_Byte(MPU_USER_CTRL_REG,0x00); //关闭从iic MPU_Write_Byte(MPU_FIFO_EN_REG,0x00); //关闭FIFO MPU_Write_Byte(MPU_INTBP_CFG_REG,0x80); //INT引脚低电平有效 res = MPU_Read_Byte(MPU_DEVICE_ID_REG); //读取地址 UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",res); UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",MPU_ADDR); if(res == MPU_ADDR) //判断地址是否正确 { MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x01); //001,pll,x轴为参考系统时钟源 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0x00); //都不使用待机模式 MPU_Set_Rate(50); }else return 1; return 0; } ``` 需要注意到,mpu6050上电后需要有一定延时,保证数据的稳定。重启mpu6050会有睡眠模式,写入关闭睡眠。最后检测并判断IIC地址是否正确 。 我们需要注意,我们设置的**加速度满量程和陀螺仪满量程**,后期数据分析会用到 ## 3.数据处理 ### 3.1 数据处理 - 加速度计的三轴分量ACC_X、ACC_Y和ACC_Z均为16位有符号整数,分别表示器件在三个轴向上的加速度,取负值时加速度沿座标轴负向,取正值时沿正向。 三个加速度分量均以**重力加速度g的倍数为单位**,能够表示的加速度范围,即倍率可以统一设定,有4个可选倍率:2g、4g、8g、16g。 - 以ACC_X为例,若倍率设定为2g(默认),则意味着ACC_X取最小值-32768时,当前加速度为沿X轴正方向2倍的重力加速度;若设定为4g,取-32768时表示沿X轴正方向4倍的重力加速度,以此类推。显然,倍率越低精度越好,倍率越高表示的范围越大,这要根据具体的应用来设定。 从前面初始化中,我们设置的倍率为2g,真实的加速度值ACC_Ture = ACC_X / 32767 / 2(精度),ACC_X为读取的数据。 同时,陀螺仪数据的处理也相同。 ### 3.2 main函数 >注意添加.h文件哦 ```c /* USER CODE BEGIN PV */ short aacx,aacy,aacz; //加速度传感器原始数据 short gyrox,gyroy,gyroz; //陀螺仪原始数据 char Mpu6050Data[40]; /* USER CODE END PV */ ``` ```c /* USER CODE BEGIN 2 */ MPUInit(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据 MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据 memset(Mpu6050Data,0,sizeof(Mpu6050Data)); sprintf(Mpu6050Data,"%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\n",aacx/8200.0,aacy/8200.0,aacz/8200.0,gyrox/16.38,gyroy/16.38,gyroz/16.38); /* USER CODE BEGIN 3 */ } ``` Notes: - Mpu6050Data数据用于保存采集的数据。 - 加速度的满量程初始化设置的为±4g。 因此 实际数据 = 获取的数据 / (32767 / 4) ≈ 获取的数据/ 8200.0 - 陀螺仪的满量程初始化设置的为±2000g. 因此 实际数据 = 获取的数据 / (32767 / 2000) ≈ 获取的数据/ 16.38 # 四、编译+下载 **点击编译后,0 error,0 warning** ---- ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/121955njyncblcptrssxe7.png) **小熊派连接在电脑上,代码下载到开发板** ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/122123balqwmlnq0o1x39m.png) ---- # 五、连接硬件 ## 1.将小熊派串口1和电脑相连,即拨到 AT-MUC,按下复位键 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/163115mub9q4eizoub4uox.png) ## 2.连接MPU6050 将我们的“扩展板”插在小熊派上。 或者使用杜邦线连接mpu6050的SDA\SCL\GND\VCC。 即: - SDA-->PB7 - SCL-->PB6 - GND-->GND - VCC-->5V ---- ## 3.效果 打开串口调试助手,我们手动转动开发板(包括模块),看见陀螺仪和加速度数据不断变化,当静止时数据保持稳定 。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/15/201916qcymitzxnnub1zrn.png) 可以看到,开发板静止时,xy轴的加速度几乎为零。而Z轴受重力加速度影响,加速度为1g. **至此,我们已经可以通过小熊派以IIC获取六轴传感器原始数据信息**
  • [基础组件] 【FusionInsight产品】【HDFS checkpoint同步】为什么使用HTTP
    请大佬答疑一下……active NameNode和standby NameNode在进行fsimage checkpoint同步的过程中为什么使用HTTP而不是RPC?
  • [问题求助] 美术呀美术网站建站程序完成了还是无法访问是什么原因http://msyams.com./
    华为云市场感觉是越来越不好用了哦看看这是什么情况美术呀美术网给我配置是什么模板完全不相符
  • [问题求助] 网站无法访问什么鬼哦http://msyams.com./
    我全按照系统操作完成绑定和备案解析了还是无法访问。这是什么问题,去年都还好用今年不行了哦华为云建站,在不行就还平台了。
  • [问题求助] 【ROMA】【livedata-api】远程调用http服务返回500,但是接口地址是正常的
    【功能模块】ROMA - livedata-api【操作步骤&问题现象】1、新建一个api,然后进入开发,三行代码2、2021-04-07测试api是正常的3,但是今天2021-04-08日测试,就roma内部返回500,感觉出不去了,{"requestId":"dae8f7184ad46bcf2bfb2eaa91e2469798e1846031bed947f2419231941e7aba","retCode":"500","retJSON":{"result":{"errMsg":"java.io.IOException: Cannot handshake with server"}}}, 实际上,这个地址,通过postman测试 一直是正常的【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [虚拟化] Docker个人学习总结
    1 Docker入门基础1.1 容器级虚拟机化技术主机级虚拟化,          Type1:在硬件上安装虚拟机,hyper-v,没有宿主机         Type2:有宿主机及宿主机OS,虚拟机OS与宿主机OS不一样,如Vmware,workstations。容器级虚拟化:实现用户空间和宿主环境空间的隔离,保障了系统安全。在UTS内可以以名称空间互相隔离的,在同一个空间上创建多个名称空间,每个名称空间互相隔离,拥有各自的根文件系统,root用户,PID 和端口范围。       Namespace原生支持UTS、mount、IPC、PID、User、Net。Linux容器化需要内核支持namespace技术。所以容器是Linux内核封装的技术。1.2 Docker和容器关系1.2.1 Linux容器1、隔离与共享一台服务器运行着多个逻辑隔离的服务器进程,谁的运行环境都不希望影响到谁,也就是一个物理机需要虚拟出多个环境或容器,Linux提供一种创建和进入容器的方式,操作系统让应用程序就像在独立的机器上运行一样,但又能共享很多底层的资源。2、实现基础Linux容器功能是基于cgroups和Namespace实现的。(1)cgroups(control groups 控制组)cgroups是将进程分组管理的内核功能,通过cgroups可以隔离进程,同时还可以隔离进程的资源占用(cpu,内存等)情况,在操作系统底层限制物理资源,起到container的作用,进程可用的cpu资源由cpuset指定。(2)NamespaceNamespace让每个进程拥有独立的PID、IPC和网络空间。Namespace是通过clone系统调用来实现的。clone系统调用的第三个参数flags就是通过设置Namespace来划分资源的。Linux一共构建了6种不同的Namespace,用于不同场景下的隔离1.Mount - 隔离文件系统挂载点;2.UTS - 隔离主机名和域名3.IPC - 隔离进程间通信资源4.PID - 隔离PID空间5.Network - 隔离网络接口6.User - 隔离用户/用户组空间1.2.2 LXC基本概念根据Docker布道师Jerome Petazzoni的说法,Docker约等于LXC+AUFS(之前只支持ubuntu时)(作者2015-10-22更新:Docker0.9.0版本开始引入libcontainer,可以视作LXC的替代品)。其中LXC负责资源管理,AUFS负责镜像管理;而LXC包括cgroup、namespace、chroot等组件,并通过cgroup进行资源管理。所以只从资源管理这条线来看的话,Docker、LXC、Cgroup三者的关系是:Cgroup在最底层落实资源管理,LXC在cgroup上封装了一层,Docker又在LXC封装了一层,关系图如图1(b)所示。因此,要想玩转Docker,有必要了解负责资源管理的CGroup和LXC。Jail->vserver(chroot)->LXC, 大规模创建容器很难,管理不方便。1)LXC是什么LinuxContainer容器可以提供轻量级的内核级虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。LXC建立在CGroup基础上,我们可以粗略的认为LXC = Cgroup+ namespace + Chroot + veth +用户态控制脚本。LXC利用内核的新特性(CGroup)来提供用户空间的对象,用来保证资源的隔离和对于应用或者系统的资源控制。根据LXC官网(http://linuxcontainers.org/)的描述,LXC具有以下特性:与虚拟化相比,它的优势在于:a)不需要指令级模拟;b)不需要即时(Just-in-time)编译;c)容器可以在CPU核心的本地运行指令,而不需要任何专门的解释机制;d)避免了准虚拟化和系统调用替换中的复杂性。总结来说,就是LXC更加轻量级,具有更小的性能开销、更快的相应时间。linux contains 的技术是linux 内核的代码,并非Docker 开发出来的,Docker或者其他的虚拟化容器都是基于LXC 的技术,在基础的lxc 上包了一层代码,让LXC 更简单、更友好,更加好推广;下面就看下LXC 的三个技术 •chroot: 创建一个虚拟的根目录文件系统 【实质还是调用底层的文件系统】,不过是建立一个虚拟的,可以跟其他容器的虚拟文件系统相互隔离;但共享底层的文件系统•namespace : 命名空间可以提供一个进程相互隔离的独立网络空间,不同的容器间进程pid可以相同,进程并不冲突影响;但可以共享底层的计算和存储(cpu + mem)•cgroups: 实现了对容器的资源分配和限制,比如给容器1分配10core 30G 内存;那这个容器最多用这么大的资源;如果内存超过30G ,会启动swap,效率降低,也可能会被调度系统给kill掉LXC通过namespace进行资源的隔离,Gust1下的进程与Guset2下的进程是独立的,可以看作运行在两台物理机上一样。Contaniner管理工具就是对Guest进行管理的(创建、销毁)。下图是LXC与KVM技术的比较,KVM的优点是一个物理机上可以跑多个操作系统(Guest-OS),然后在每个操作系统运行应用,通过这种方式实现应用的隔离。而使用LXC技术直接可以在Host-OS的基础上实现隔离的。这就是LXC的优势--运行快。但是,如果有两个应用一个是在windows运行的,一个是在linux上运行的,这时只能使用KVM技术来实现了。1.2.2.1 Cgroups基本概念1)Cgroup是什么Cgroups是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:CPU, Memory, IO等)的机制。最初由Google的工程师提出,后来被整合进Linux内核。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有Cgroups就没有LXC,也就没有Docker。Cgroups最初的目标是为资源管理提供的一个统一的框架,既整合现有的Cpuset等子系统,也为未来开发新的子系统提供接口。现在的Cgroups适用于多种应用场景,从单个进程的资源控制,到实现操作系统层次的虚拟化(OS Level Virtualization)。简单说是把系统级资源分成多个组,每组资源分配到特定用户空间来使用。Cgroups提供以下功能:a)限制进程组可以使用的资源数量(Resource limiting )。比如:Memory子系统可以为进程组设定一个Memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of  memory)。b)进程组的优先级控制(Prioritization)。比如:可以使用CPU子系统为某个进程组分配特定CPUshare。c)进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。d)记录进程组使用的资源数量(Accounting)。比如:可以使用Cpuacct子系统记录某个进程组使用的CPU时间e)进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。2)Cgroup基本概念与术语任务(task):在Cgroups中,任务就是系统的一个进程。控制族群(control group):控制族群就是一组按照某种标准划分的进程,控制族群通常按照应用划分,即与某应用相关的一组进程,被划分为一个进程组,即控制族群(control group)。Cgroups中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也可以从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用Cgroups以控制族群为单位分配的资源,同时受到Cgroups以控制族群为单位设定的限制。层级(hierarchy):控制族群可以组织成hierarchical的形式,既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性。控制族群树的示意图如图2所示。子系统(subsystem):一个子系统就是一个资源控制器,比如CPU子系统就是控制CPU时间分配的一个控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。3)Cgroup子系统介绍a)blkio -- 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB等等)。b)cpu -- 这个子系统使用调度程序提供对CPU 的 Cgroup 任务访问。c)cpuacct -- 这个子系统自动生成Cgroup中任务所使用的 CPU 报告。d)cpuset-- 这个子系统为 Cgroup中的任务分配独立CPU(在多核系统)和内存节点。e)devices -- 这个子系统可允许或者拒绝Cgroup中的任务访问设备。f)freezer -- 这个子系统挂起或者恢复Cgroup中的任务。g)memory -- 这个子系统设定Cgroup中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。h)net_cls -- 这个子系统使用等级识别符(classid)标记网络数据包,可允许Linux 流量控制程序(tc)识别从具体cgroup 中生成的数据包。i)ns -- 名称空间子系统。Cgroup具有不同的挂载方法——“多挂载点”和“单挂载点”。子系统“多挂载点”挂载就是指不同子系统的文件挂载在不同的目录下,每个子系统各有一个挂载点,目录结构如图3(a)所示。cgroup对应服务cgconfig默认使用的就是“多挂载点”的方法。“单挂载点”则是指所有子系统的文件都挂载在同一个目录下,所有子系统都统一挂载在一个挂载点,目录结构如图3(b)所示。  1.2.2.2 NamespaceLinux Namespaces机制提供一种资源隔离方案。PID,IPC,Network等系统资源不再是全局性的(在Linux2.6内核以前是全局的),而是属于特定的Namespace。每个Namespace里面的资源对其他Namespace都是透明的。namespace是container中使用到的重要技术之一,是对系统资源的操作上的隔离。使Guest-OS1的操作对Guest-OS2无法产生影响。当然namespace的实现还在完善中,下面是3.8以上的内核实现的namespace。1. Mount namespace是对挂载的文件系统布局进行隔离。图中显示在Namespace1中的进程看到的文件系统的挂载方式是一致的,但是在Mount Namespace2中看到的是一另一种情况。2.IPC:处于同一namespace下的进程才可以进行进程间通信。3. NET NAMESPACE实现网络协议栈上的隔离,在自己的namespace中对网络的设置只能在本namespace中生效4.PID:我们通过fork来创建进程时可以为每个进程指定命名空间。linux下的进程关系是一棵树,所以有了父命名空间和子名字空间之分。在namespace2创建的P2进程有两个pid。第一个是在父命名空间的下的它的PID号,一个是在自己空间下的PID号。之所以有父pid号是因为P2最终还是在父命名空间下运行的,而为进程指定命名空间是为了让P2和P3实现隔离。5. User namespace中使用到了map转换,由于container并不是真正的虚拟化,所以在Guest-OS中创建的root用户会被映射到Host-OS中的普通用户中去。下图中的例子中,root用户在自己的namespace下创建了一个文件,那这个文件的所有者ID应该是0,当时在磁盘上存的时候文件UID会被转换为kuid,并且所有者ID为1000。想说名一点是在Guest-OS下你是个root用户,但是在Host-OS你只不过被转为一个普通用户而已。因为我们知道在Host-OS下已经有一个root用户了。6.PID namespace:linux下的proc目录是对整个系统状态的描述,用户可以通过查看proc目录来了解当前的系统状态。在proc目录下有很多数字,这些数字对应的是系统创建的进程ID,以前我们说进程是看不见摸不着的,但是通过proc目录我们的确可以看到一些关于进程的信息。每个进程下有个ns目录,在目下记录了该进程使用的到namespace。1.2.2.3 Chroot1.  linux chroot 机制的由来•root 用户启动一个daemon在linux 系统上启动一个daemon 必须用root 用户来启动,比如一个web 服务器(nginx/apapce 80端口)是在操作系统的接口(1-1024),只有root 有这个权限来启动这类接口;用root 户启动daemon 的程序也是一个自然的事情。  •安全问题日益变大随着安全的攻击越来越严重,如果任何一个提供TCP 服务的程序出现漏洞,那攻击者就获取到了root 权限,无疑是灾难性的。为了降低这个问题带来的风险,需要主动放弃root 权限,该用一个普通的用户(比如 admin/nobody) 进行运行。这样一旦攻击者获取到了这个程序的权限,也是此时运行用户的权限,对系统造成的危害相对要小。•chroot 机制的引入为了进一步提高系统的安全性,linux 系统引入了chroot 机制;chroot 是一个系统调用,程序可以通过调用chroot的函数库来 更改一个进程所能看到的跟目录  。比如httpd 软件安装在/usr/local/httpd 这个目录下,那这个进程(httpd) 只可以读、写到这个指定的目录: [ usr/local/httpd] ;这样即使攻击者获取进程的权限,也只能读写这个目录下的文件,这样就变的安全了许多,起码不会影响这个台机器其他的进程,和其他的机器的安全问题 。2. chroot 简介chroot 全程是change to root : 其中root 是根目录的意思,也就是改变(linux 根目录是/,也可以理解为设置)一个程序运行时参考的根目录的位置 # 根目录的参考linux 系统(原始的方案)  | 引入chroot 机制/                                 /lxc/usr                            /lxc/usr/bin                            /lxc/bin/sys                            /lxc/sys如上图我们看的一旦使用了chroot ,用户的春心就不是linux 系统的根目录,而是我们指定的/lxc (这个目录可以任意指定),所以chroot 确实可以修改根目录. 3. chroot 机制的意义•增强系统的安全行•指定程序访问的根目录,防止用攻击者可以通过程序的漏洞获取其他目录的读写权限; 4. chroot 机制在虚拟化中的作用chroot 机制因为安全问题才被引入的,但是在LXC 中却启动了举足轻重的作用,因为chroot 机制可以指定虚拟根目录,让不同的容器在不同的根目录下工作; •不同的容器进程参考的根目录不同,相互直接不影响•不同的容器因为共享linux 底层的文件系统,所以容器集成os的功能,实现轻量级!1.2.2.4 LXC总结通过对ns和Cgroups的介绍,一方面可以实现对系统资源的隔离,但是使用就非常不方便涉及代码实践、底层内核调用以及进程克隆等。通过LXC可以实现对这些工具的封装调用,简化了用户使用。但是LXC使用也不是很方便,比如需要创建出一个虚拟环境,通常会执行一个模板脚本,从指定官网下载对应的软件工具,在本地完成安装后,生产名字空间的运行环境。所以LXC的使用比虚拟机也不是很大方便,隔离性也不比虚拟机好。大规模使用和分发也不友好,后面出现docker。Docker是LXC的加强版,相当于是LXC的前端应用工具。容器是内核技术,docker通过简化容器的使用,得以普及。解决方案为镜像。利用容器管理引擎,通过镜像,来创建出名字空间所需的环境。 1.2.3 LXC与docker的比较:容器技术不是模仿硬件,而是在Linux内核里使用cgroup和namespaces来打造轻便的、将近裸机速度的虚拟技术操作系统环境。因为不是虚拟化存储,所以容器技术不会管底层存储或者文件系统,而是你放哪里,它操作哪里。 这从根本上改变了我们如何虚拟化工作负载和应用程序,因为容器速度比硬件虚拟化技术更快,更加便捷,弹性扩容的更加高效,只是它的工作负载要求操作系统,而不是Linux或特定的Linux内核版本。Docker并不是LXC的替代品,Docker的底层就是使用了LXC来实现的。LXC将Linux进程沙盒化,使得进程之间相互隔离,并且能够控制各进程的资源分配。 在LXC的基础之上,Docker提供了一系列更强的功能。不过现在Docker底层已不使用LXC,先后推出libcontainer和runC. 利用LXC做容器管理引擎,将用户空间需要用到的组件打包封装好,成为镜像文件。极大简化了容器的使用难度,使得容器使用得以推广。容器技术一方面给技术带来极大便利,同时也给维护带来很大挑战。 1.3 Docker基础概念1.3.1 docker是什么Docker是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在本地编译通过的容器可以批量的在生产环境上部署。Docker类似于集装箱,各式各样的货物,经过集装箱的标准化进行托管,而集装箱与集装箱之前没有影响。Docker是一个开放平台,使开发人员和管理员可以在称为容器的松散隔离的环境中构建镜像、交互和运行分布式应用程序,以便在开发、QA和生产环境之间进行高效的应用程序生命周期管理。分层构架和联合挂载虚拟机原理需要在Host OS(内核)之上虚拟出一套虚拟硬件,在虚拟硬件之上重新安装操作系统,即为虚拟机操作系统(内核),在该系统之上安装APP,对外提供服务。可见虚拟化对硬件资源的消耗还是比较大,通常在20~30%。而容器概念在于在Host OS之上,提供一套虚拟隔离环境(内核态),在用户空间隔离出进程环境。1.3.2 Docker三个组件 1.3.2.5 镜像一个特殊的文件系统。操作系统分为内核和用户空间,对于Linux来说,内核启动后会挂载root文件系统为其提供用户控件的支持。而Docker镜像,就相当于是一个root文件系统。除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含一些为运行时准备的配置参数。镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像实际是由多层文件系统联合组成。镜像构建时,会一层一层构建,前一层是后一层的基础。每一层构建完就不会再改变,后一层上的任何改变只发生在当前层。比如:删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅把当前层标记为该文件已删除。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。1.3.2.6 容器镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、暂停、停止、删除等。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行与属于自己独立的命名空间,容器也是分层存储。容器存储层的生命周期跟容器一样,容器消亡时,容器存储层也会消亡,任何保存于容器存储层的信息都会丢失。容器不应该向其存储层内写入任何数据,容器存储层也要保持无状态化。所有的文件写入操作,都应该使用数据卷、或者绑定宿主目录,在这些位置的读写会跳过存储层,直接对宿主发生读写,其性能和稳定性更高。容器消亡后数据卷的数据不会丢失。容器在整个应用程序生命周期工作流中提供以下优点:隔离性、可移植性、灵活性、可伸缩性和可控性。 最重要的优点是可在开发和运营之间提供隔离。1.3.2.7 仓库Docker Registry是一个集中存储、分发镜像的服务。一个Registry可以包含多个仓库(Repository),每个仓库只包含一种软件,但可以包含多个标签(tag,也就是版本),每个标签对应一个镜像。这三个组件的关系如下图,比如有两个仓库,分别是Redis和MySQL。 1.3.3 Docker组成客户端:docker pull build run服务器仓库          镜像image:是个模板,通过模板创建容器服务。通过镜像创建多个容器         容器container:docker通过容器独立运行一个或一组应用,通过镜像来创建的。启动 停止 删除等基本命令                   容器是一个简易的Linux系统         仓库repository:存放镜像的地方1.3.4 Docker架构Client-Server架构:•docker守护进程运行在宿主机上systemctl start docker•daemon进程通过socket从客户端(docker命令)接受命令来运行管理各个容器•容器是一个运行时环境,可以看做是运行中的精简版Linux系统         1.4 docker安装:docker文档:https://docs.docker.com/安装指导:https://docs.docker.com/engine/install/centos/推荐使用阿里云的docker镜像安装:https://blog.csdn.net/lvdingding/article/details/112862396dockerHUB地址: ce社区版,官方推荐ee企业版 hello-world流程底层原理docker是server-client结构的系统,docker的守护进程运行在主机上,通过socketo从客户端访问。dockerserver接受客户端的指令,就会执行docker命令。 1.5 Docker和虚拟机的不同:1.传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,在这个系统之上安装和运行软件。占用资源大,启动慢。2.容器内的应用直接运行在宿主机的内核上,没有自己的内核,也不需要虚拟硬件,因此容器轻便。3.每个容器互相隔离,每个容器内部都有自己的文件系统,互不影响。DevOps开发运维应用更快的交付和部署传统的交付部署:一堆帮助文档,安装程序docker:打包镜像发布测试一键运行         更便捷的升级和扩缩容         更简单的系统运维,测试环境基本一致         更高效的计算资源利用,docker是内核级的虚拟化,一台服务器上可以运行多个docker实例。         内核的作用在于资源的管理和分配,如内存虚拟化,CPU调用,IO的调度,生产服务,如Nginx等都运行在用户应用空间。1.5.1 Virtual MachinesVM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;1.5.2 Containers容器完全在容器主机的应用程序层中运行。在UserLAnd[1]中,OSs有内核空间,操作系统的核心在其中运行。然后是用户空间,所有与用户活动相关的东西都在这里运行。没有安装操作系统。容器共享主机的内核空间,类似于主机中的一个用户,LXC所实现的隔离性主要是来自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace将container的进程, 网络, 消息, 文件系统和hostname 隔离开。但是,cgroup的隔离性要比kvm粒度大,并且很难metric指标。比如,磁盘的IO就很难隔离。导致一个容器的io增大,这个主机都有可能hang。容器实际上就是一个进程。当它在容器内时,感觉就像一台完全独立的机器。我们可以启动新的进程,当监控这些进程时,您将只看到容器内的进程。但是,如果您监控主机进程,仍然能够看到容器中运行的所有内容。 容器共享主机。那么他是如何在同一台机器上运行Ubuntu和CentOS呢? 因为容器实际上共享主机的内核。特定的Linux发行版都构建在同一个内核之上(尽管版本不同)。所有的包管理器、UI之类的东西,以及其他各种软件,都可以在用户空间中运行,这些软件使发行版独一无二,并创造出不同的Linux风格。具有不同发行版的不同容器可以在同一台机器上运行而不会产生冲突。 当涉及到平台设计时,这个内核共享事实还有其他重要的含义。例如,Windows容器将不能在Linux主机上运行。 不可修改 容器本质上是不可变的。 容器操作系统、库、实用程序和应用程序在构建时都是冻结的,在此之后它就不能更改了。所以,不需要以传统的方式更新容器。重新构建和重新部署。虽然有一些缺点,但是在可重复性、简化部署和可靠性方面有很大的提高。 镜像(image) 镜像其实是一个标准的文件包,它表示容器运行时文件系统的状态。这可以发布到注册表,也可以用作父镜像。 大多数镜像将构建在父镜像之上(父镜像通常也构建在另一个镜像像之上)。基本映像没有父镜像的。1.5.3 小结 简而言之,容器化为单个OS上的工作负载隔离提供了标准化的方法,而虚拟化为在一台服务器上安装多个OSs提供了标准化的方法。它们在业界都很突出,在云计算中经常一起使用。 因为容器没有安装完整的操作系统,所以它的重量更轻,因为下载和运行更快,存储更小。下图以尽可能简单的方式说明了上述差异。请注意使用VMs和容器运行相同的两个工作负载的堆栈组合。 如果大家理解了上面描述的容器和vm之间的关键区别,那么第二个图将提供对正在发生的事情的更深入的信息。大家可以清楚地看到这两种技术如何提供工作负载隔离。 记住,堆栈表示逻辑层次结构。我们知道这些容器都在主机操作系统上作为唯一的进程运行,而VM客户操作系统是成熟的操作系统,可以管理它们自己的进程。 现在,让我们看看vm和容器通常是如何一起使用的。假设我们想在云中运行Python Flask应用程序和Java Spring应用程序。下图描述了AWS上可行的状态。  Amazon EC2是Amazon的托管计算服务。这意味着用户不需要担心服务器或管理程序。我们只需选择实例类型(针对不同工作负载的不同特性)并部署VM。(国内的同学们还是使用阿里云吧) 有许多不同的Amazon机器镜像可供选择[3],或者可以创建自己的镜像。因为vm比容器更重。 我们可以在许多不同的服务中共同使用VM镜像。可以将基本操作系统、包更新、一些脚本、监视代理的安装和配置,以及其他操作和安全工具打包到vm中。 通常使用配置管理工具(如Ansible或Chef)来管理工作负载或服务。Chef已经是devops的标准管理工具。 1.6 docker为什么比VM快1.docker的抽象层比虚拟机更少2.docker利用的是宿主机的内核,VM需要guest OSdocker申请容器的时候不需要像虚拟机那样加载一个操作系统内核,避免引导耗时。虚拟机是加载Guest OS,分钟级的docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级。 可见虚拟机对硬件资源的消耗很大,通常在20~30%。 1.7 Docker常用命令docker version版本信息/info 显示docker的系统信息,包括镜像和容器的数量/help 帮助命令官方命令地址:https://docs.docker.com/reference/镜像命令docker imagesdocker searchdocker pulldocker rmidocker rm 容器命令docker inspect 容器IDdocker top 容器ID进入当前运行的容器docker exec -it 容器ID /bin/bash  进入容器后开启一个新终端docker  attach 容器ID             进入容器正在执行的终端,不会执行新进程docker stop/start 容器ID从容器内拷贝内容到宿主机上docker  cp 容器ID:容器内部地址  宿主机地址  思考:在宿主机中提供容器文件的映射地址,实现在宿主机上修改达到容器内部内容的自动修改。---数据卷 docker  run  -it --rm tomcat ##之前都启动是后台启动,容器还可以查到,这个方法为用完就删除容器和镜像1.8 ElasticSearch实验https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-cli-run Docker stats:  1.9 PortainerPortainer是docker图形管理工具,提供一个后台面板供开发者使用。访问测试:登录创建用户后选择local本地仓库点击connect之后进入portainer主页  1.10 Docker持续开发工作流  2 Docker镜像详解2.1 镜像详解2.1.1 镜像是什么将应用和环境打包成一个镜像。镜像是轻量级、可执行的独立软件包,打包了运行某个软件(比如tomcat镜像)所需的所有内容,包括:•代码(tomcat代码)•运行时环境(OS、JDK)•依赖库•环境变量•配置文件等镜像底层基础是Union File System(联合文件系统):UnionFS:一种分层、轻量级且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,也支持将不同目录挂载到同一虚拟文件系统下。镜像由一层层的文件系统组成,通过分层进行继承。基于基础镜像,可以制作出各种具体的应用镜像。镜像运行时,一次联合加载多个文件系统,根据继承关系进行叠加,最终外部只看到一个文件系统,但拥有了完整的文件和目录结构。 2.1.2 Docker镜像加载原理分层构架,联合挂载。 下载镜像时一层一层下载就是这个概念。所以这也是为什么虚拟机是分钟级,容器是秒级的。 镜像实际有一层层的文件系统组成,即UnionFS。文件系统层级中主要关注bootfs和rootfs“”•bootfs包括BootLoader和kernel(操作系统内核),BootLoader主要是引导加载kernel。同Linux,docker镜像最底层是bootfs。Linux系统启动时,会加载bootfs,然后BootLoader加载kernel(Linux内核)至内存,完成之后内存的使用权由bootfs转移给内核,接着卸载掉bootfs。•rootfs包含了我们熟悉的Linux文件目录结构:/dev/ /proc/ /bin/ /etc/ 等。对于不同的Linux发行版(Ubuntu、centos等),bootfs基本一致(内核相同,都是Linux-kernel),而rootfs会有差别。why一个centos的docker镜像只有200M,而VMware的centos系统镜像几个G?对于一个精简的Linux系统,rootfs可以很小,只需要包括最基本的命令、工具和程序库就OK了。docker容器共用了宿主机的系统内核,只需要提供精简的rootfs就OK,所以docker的os镜像体积可以这么小,因此可以把docker容器看做一个精简的Linux系统。why一个tomcat的docker镜像反而比一个centos的docker镜像大得多每个应用级别的docker镜像,都是源于基础镜像(联合文件系统),类比Java中的Object类,一层层继承而来。 2.2 提交镜像Docker commit 提交容器成为一个新的副本实践如下:    3 Docker数据卷3.1 什么是容器数据卷Docker的核心是把应用和环境打包成镜像,那么数据呢?如果数据保存在容器中,那就无法保证数据的持久化。所以希望容器之间有数据共享功能。通过容器数据卷技术可以将容器中产生的数据,同步到本地。简单说,就是目录挂载,将容器内的目录挂载到宿主机。实现容器数据的持久化和同步操作,也实现了容器间的数据共享。Docker  -v 宿主机目录:容器目录 查看容器卷是否挂载成功,执行命令docker inspect 容器ID3.2 具名和匿名挂载如何确认是具名还是匿名,以及指定路径挂载?3.3 Dockerfile创建 这个卷一定是与外部目录有一个同步目录。该挂载方式为匿名挂载。对应容器外的路径3.4 容器数据卷创建容器数据卷创建目标容器 实现了两个容器数据的同步。多个也是可以实现数据的同步。实现数据在两个mysql中的数据共享  4 Docker dockerfile4.1 基础知识Dockerfile就是构建docker镜像的构建文件,命令参数脚本。 4.2 Dockerfile构建过程Dockerfile是面向开发的,以后发布项目,做镜像,就要编写dockerfile文件,这个文件很简单。Docker镜像逐步成为企业交付的标准,必须掌握。Dockerfile是构建文件,定义了一切步骤,源代码;dockerimages通过dockerfile构建生成的镜像,最终发布和运行产品。Docker容器是镜像运行起来提供服务的。4.3 Dockerfile指令 
  • [问题求助] 私有云环境,IOC平台是否支持使用http请求
    项目:福建党校项目问题:我们目前开发环境的ABC和IOC访问方式均为 https, 假如到现场在私有云环境部署项目的话,我们可以改成 http 请求吗,可以改的话,好操作吗?
  • [数据安全] 什么是IPFS
    1 什么是IPFS星际文件系统(InterPlanetary File System). IPFS 是一个分布式的web, 点到点超媒体协议. 可以让我们的互联网速度更快, 更加安全, 并且更加开放. IPFS协议的目标是取代传统的互联网协议HTTP。2 为什么有IPFS众所周知, 互联网是建立在HTTP协议上的. HTTP协议是个伟大的发明, 让我们的互联网得以快速发展.但是互联网发展到了今天HTTP逐渐出来了不足.。HTTP的中心化是低效的, 并且成本很高使用HTTP协议每次需要从中心化的服务器下载完整的文件(网页, 视频, 图片等), 速度慢, 效率低. 如果改用P2P的方式下载, 可以节省近60%的带宽. P2P将文件分割为小的块, 从多个服务器同时下载, 速度非常快。Web文件经常被删除回想一下是不是经常你收藏的某个页面, 在使用的时候浏览器返回404(无法找到页面), http的页面平均生存周期大约只有100天. Web文件经常被删除(由于存储成本太高), 无法永久保存. IPFS提供了文件的历史版本回溯功能(就像git版本控制工具一样), 可以很容易的查看文件的历史版本, 数据可以得到永久保存中心化限制了web的成长我们的现有互联网是一个高度中心化的网络. 互联网是人类的伟**明, 也是科技创新的加速器. 各种管制将对这互联网的功能造成威胁, 例如: 互联网封锁, 管制, 监控等等. 这些都源于互联网的中心化.而分布式的IPFS可以克服这些web的缺点.互联网应用高度依赖主干网主干网受制于诸多因素的影响, 战争, 自然灾害, 互联网管制, 中心化服务器宕机等等, 都可能是我们的互联网应用中断服务. IPFS可以是互联网应用极大的降低互联网应用对主干网的依赖.3 IPFS的目标IPFS不仅仅是为了加速web. 而是为了最终取代HTTP协议, 使互联网更加美好4 IPFS包含哪些内容IPFS是一个协议,类似http协议。定义了基于内容的寻址文件系统内容分发使用的技术分布式哈希、p2p传输、版本管理系统IPFS是一个文件系统,有文件夹和文件可挂载文件系统IPFS是一个web协议可以像http那样查看互联网页面未来浏览器可以直接支持 ipfs:/ 或者 fs:/ 协议IPFS是模块化的协议连接层:通过其他任何网络协议连接路由层:寻找定位文件所在位置数据块交换:采用BitTorrent技术IPFS是一个p2p系统世界范围内的p2p文件传输网络分布式网络结构没有单点失效问题IPFS天生是一个CDN文件添加到IPFS网络,将会在全世界进行CDN加速bittorrent的带宽管理IPFS拥有命名服务IPNS:基于SFS(自认证系统)命
  • [技术干货] 自建开源Cassandra与GaussDB(for Cassandra)性能对比测试报告
    自建开源Cassandra与GaussDB(for Cassandra)性能对比测试报告1 概述本文为自建开源Cassandra与GaussDB(for Cassandra)性能对比测试报告,完整描述了整个测试的环境、测试模型和详细的测试步骤,作为性能的参考。2 环境描述2.1 开源Cassandra测试环境名称Cassandra版本集群节点数操作系统版本ECS规格开源Cassandra集群3.11.53Centos7.4通用增强型4vCPUs | 16GB通用增强型8vCPUs |32GB通用增强型16vCPUs | 64GB通用增强型32vCPUs | 128GB        2.2 GaussDB(for Cassandra)测试环境 名称Region集群节点数可用区ECS规格开源Cassandra集群华东-上海二3可用区三4vCPUs | 16GB8vCPUs |32GB16vCPUs | 64GB32vCPUs | 128GB2.3 压测工具环境2.3.1  压测机器规格名称CPU内存操作系统测试客户端ECS16vCPUs64GCentos7.4          2.3.2  压测工具信息测试工具版本下载地址Ycsb0.12.0https://github.com/brianfrankcooper/YCSB3 测试模型业务模型编号业务模型负载描述S2_read95_update5读95%,更新5%S3_update50_read50更新50%,读50%S4_read65_update25_insert10读65%,更新25%,写10%S5_insert90_read10写90%,读10%4  测试步骤4.1 开源Cassandra测试详细步骤4.1.1  购买机器步骤一:登录弹性云服务器页面,点击右侧的购买弹性云服务器按钮,并按照相关提示,完成ecs服务器购买,其中一些关键参数的取值区域:华东-上海二;可用区:可用区3,规格:通用增强型|c6.xlarge.4,镜像:公共镜像-CentOS-CentOS 7.6 64bit(40GB);数据盘:选择超高IO,大小为200G;网络:选择任意vpc和子网;其他参数:根据提示设置即可,非必选参数可不填。                             步骤二:等待ecs 服务器创建完成之后,我们登录ecs服务器,可以用控制台的远程登录或者通过xshell工具用弹性ip连接;步骤三:登录五台ecs云服务器,安装jre,执行yum install jre,按照提示,完成安装。步骤四:我们把五台ecs分别命名为Cassandra-1(192.168.0.15),Cassandra-2(192.168.0.240),Cassandra-3(192.168.0.153),Cassandra-4(192.168.0.175),ycsb-Cassandra(192.168.0.60),其中,Cassandra-1,Cassandra-2,Cassandra-3,为我们的初始化Cassandra集群,Cassandra-4为我们后面扩容用的扩展服务器,ycsb-Cassandra作为压测服务器;步骤五:登录五台ecs云服务器,安装Cassandra服务,并创建数据目录,按顺序执行下列命令:下载Cassandra安装包,执行命令:wget http://mirror-hk.koddos.net/apache/Cassandra/3.11.5/apache-Cassandra-3.11.5-bin.tar.gz ;解压安装包,tar -zxvf apache-Cassandra-3.11.5-bin.tar.gz -C /root/更改安装目录:mv /root/apache-Cassandra-3.11.5 /usr/local/Cassandra配置环境变量:echo “export PATH=/usr/local/Cassandra/bin:$PATH” >> /etc/profile使环境变量生效:source /etc/profile创建数据目录:mkdir /data执行如下命令,回显如下,则表示安装成功:cqlsh4.1.2  开源Cassandra集群配置操作手册步骤一:配置Cassandra集群,并启动;登录Cassandra-1(192.168.0.15),Cassandra-2(192.168.0.240),Cassandra-3(192.168.0.153),进入/usr/local/Cassandra/conf 目录,修改Cassandra-topology.properties文件,三个节点,这个配置文件,保持一致即可。修改内容如下,注释掉方框中内容,增加圆圈中的内容:修改Cassandra.yaml文件,涉及以下几个参数:data_file_directories:     - /datacommitlog_directory: /usr/local/Cassandra/commitlogsaved_caches_directory: /usr/local/Cassandra/saved_cachesseed_provider:    # Addresses of hosts that are deemed contact points.    # Cassandra nodes use this list of hosts to find each other and learn    # the topology of the ring.  You must change this if you are running    # multiple nodes!    - class_name: org.apache.Cassandra.locator.SimpleSeedProvider      parameters:          # seeds is actually a comma-delimited list of addresses.          # Ex: "<ip1>,<ip2>,<ip3>"          - seeds: "192.168.0.153,192.168.0.240,192.168.0.15"       ##填写集群三个节点的iplisten_address: 192.168.0.153       #各节点的ip地址                   rpc_address: 192.168.0.153                          #各节点的ip地址修改完以上两个配置之后,我们现在可以启动Cassandra集群了,分别在三个节点执行:Cassandra –R &集群的配置和启动,到此就结束了。 4.1.3  开源Cassandra集群扩容节点步骤一:登录Cassandra-4节点,进入/usr/local/cassnadra/conf目录,编辑Cassandra-topology.properties文件,注释方框内容,添加圆圈中内容修改Cassandra.yaml文件,关键参数如下:data_file_directories:     - /datacommitlog_directory: /usr/local/Cassandra/commitlogsaved_caches_directory: /usr/local/Cassandra/saved_cachesseed_provider:    # Addresses of hosts that are deemed contact points.    # Cassandra nodes use this list of hosts to find each other and learn    # the topology of the ring.  You must change this if you are running    # multiple nodes!    - class_name: org.apache.Cassandra.locator.SimpleSeedProvider      parameters:          # seeds is actually a comma-delimited list of addresses.          # Ex: "<ip1>,<ip2>,<ip3>"          - seeds: "192.168.0.153,192.168.0.240,192.168.0.15"       ##填写集群三个seed节点的ip,和步骤一填写的值保持一致listen_address: 192.168.0.175       #各节点的ip地址                   rpc_address: 192.168.0.175                          #各节点的ip地址登录Cassandra-1节点,停止所有节点的压缩,执行命令: nodetool disableautocompaction登录Cassandra-1节点,停止正在执行的压缩,执行命令: nodetool stop COMPACTION登录Cassandra-1节点,限制节点的迁移流量(这里我们设置为32MB/S,避免对业务造成太大的影响),执行命令: nodetool setstreamthroughput 32登录Cassandra-4节点,启动Cassandra服务,执行: Cassandra –R &步骤二:登录Cassandra-1,扩容过程中(这里请记录开始扩容的时间点t1),每30s执行一次nodetool status,当Cassandra-4节点的状态为UJ时,说明还在数据迁移,直到状态为UN时,迁移才算完成。迁移中如下图:4.2  GaussDB(for Cassandra)测试步骤4.2.1  购买Cassandra集群步骤一:创建Cassandra实例,选择上海二区域,云数据库GaussDB(for Cassandra)服务,点击购买数据库实例,按照提示完成Cassandra实例购买,其中一些参数选择如下;       性能规格:4核|16GB       存储空间:200G       节点数量:3       虚拟私有云,内网安全组:和创建的弹性云服务器保持一致步骤二:等待Cassandra实例创建完成,进行性能测试; 4.2.2  GaussDB(for Cassandra)集群扩容节点步骤一:登录GaussDB(for Cassandra)控制台,点开实例详情页面,点击途中的”+”按钮,跳转到添加节点页面,选择添加1个节点,点击提交;       步骤二:等待扩容完成,操作完成,观察在扩容过程中QPS 的浮动情况,可以看到在GaussDB(for Cassandra)场景下,对实例进行节点扩容,仅有十秒左右的qps小幅下降,对业务几乎无影响,扩容操作从下发到扩容完成,大约十分钟左右。在扩容操作完成之后,也可以跳回步骤八九,对测试过程数据进行分析。下面仅提供4.3  ycsb测试详细步骤登录ycsb-Cassandra,下载ycsb工具并安装,curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.12.0/ycsb-0.12.0.tar.gz使用终端工具如xshell通过客户端ECS实例弹性公网IP连接。ycsb具体使用方法: https://github.com/brianfrankcooper/YCSB/tree/master/Cassandra5 测试结果5.1  性能结果5.2 测试结论1. GaussDB(for Cassandra)扩容较快,影响业务的时间较为短暂,为10s,且不涉及参数调整,扩容过程十分钟。2. 社区版根据数据量的大小,参数的设置,整个扩容流程比较长,对性能的影响也参差不齐,50G预置数据,在实验场景中,扩容会超过30分钟。3. 计算公式:最快迁移速度=(nodetool setstreamthroughput 32设置的迁移流量限制,默认为200Mbps)*原节点数。4. 本测试过程中,最快的迁移速度=32Mbps/s*3=12MB/S=720MB/min=0.703GB/min,计算可得50GB数据在此场景下迁移的最快时间是:50/0.703=71.1分钟。各性能模型下,只要有读操作,同规格的GaussDB(for Cassandra)集群性能远高于社区版集群。社区版Cassandra对读非常不友好,GaussDB(for Cassandra)在读时延的性能表现上,要优于社区版数十倍。在写性能表现上,GaussDB(for Cassandra)与社区版基本保持一致。社区版和GaussDB(for Cassandra)在节点扩容过程中,对业务都有轻度的影响。
总条数:327 到第
上滑加载中