当前位置: 首页 > news >正文

网站数据展示网站里添加百度地图

网站数据展示,网站里添加百度地图,做电商要注册网站吗,网站建设策划书总结1.全链路压测开展步骤 #xff08;1#xff09;什么是全链路压测 全链路压测是指基于真实业务场景#xff0c;通过模拟海量的用户请求#xff0c;对整个后台服务进行压力测试#xff0c;从而评估整个系统的性能水平。 对应用程序的整个技术栈进行完整的压力和性能测试1什么是全链路压测 全链路压测是指基于真实业务场景通过模拟海量的用户请求对整个后台服务进行压力测试从而评估整个系统的性能水平。 对应用程序的整个技术栈进行完整的压力和性能测试覆盖了整个应用程序的各个部分包括前端、后端、服务、数据库等。在模拟真实用户交互和**系统环境(生产环境)**的情况下评估整个应用在高负载情况下的性能表现和持续调优的过程包括响应时间、吞吐量、资源利用率以及系统的稳定性和可扩展性等。全链路压测可以帮助发现系统的性能瓶颈和故障点并对整个系统的性能进行全面评估和优化。 2全链路压测的实施步骤 确定压测场景 根据实际使用情况和业务需求确定要测试的压测场景包括用户访问路径、操作流程和数据交互等。每个场景包括一系列用户行为和操作流程涉及到多个应用程序的不同组件。区分核心业务和非核心业务主要精力和压测都是对核心业务进行。 流量数据模型准备 根据压测场景构建模拟用户行为的测试脚本。为模拟用户行为提供必要的测试数据可以使用真实或合成的数据进行测试以确保测试的真实性和覆盖性。做好数据隔离不能污染正常的业务数据整理好每个环节的数据流转。 选择工具配置并发 选择合适的流量录制和回放工具根据实际情况和性能需求配置并发用户数、请求频率和负载模型等。可以逐步增加并发负载以模拟系统在峰值和极限负载下的性能表现。 开始运行压测 运行测试脚本模拟并发用户对系统进行访问和交互。观察和记录系统在不同负载情况下的性能指标例如响应时间、吞吐量、CPU和内存利用率等。 数据分析和优化 分析压测结果并识别可能的性能问题和瓶颈点。可以根据分析结果进行调整和优化例如调整配置参数、进行代码优化或增加系统资源等。 结果评估和报告 根据压测结果进行结果评估并生成详细的测试报告报告应包括系统的性能指标、发现的问题和建议的优化方案。 压测现场还原 对相关压测数据进行清理比如缓存队列数据库等避免长期占用相关资源定时维护好相关测试数据。 3全链路压测实施关键技术难点 流量数据模型压测数据不真实达不到生产环境的流量模型最终导致压测不准确比如只是拍脑袋想的用户访问路径。业务探针性能全链路压测涉及到各个方法调用链的监听会有数据采集上报离不开APM调用链路追逐工具需要降低本身的损耗。流量染色流量请求和访问链路长涉及业务多需要多个系统代码改造减少压测代码侵入性。数据隔离避免影响线上正式用户比如数据库MQ缓存外部三方服务等。日志隔离业务日志输出到文件或者到队列避免压测数据采集后加入到正式的报表里面导致运营和产品分析数据不准确。压测时间一般在业务访问低峰进行比如国外的话就是半夜26点国外业务就根据时差进行调整。 2.数据模型准备之流量回放 1什么是流量回放 流量回放就是通过记录线上流量在开发或者测试环境回放来发现系统是否能够正常运行降低代码变动整体系统带来的风险。 2流量回放工具GoReplay 官网https://goreplay.org/ githubhttps://github.com/buger/goreplay GoReplay是GO语言编写的http流量复制工具使用流程简单支持多个系统mac、linux、win。 GoReplay 不是代理而是在后台侦听网络接口上的流量无需更改生产基础架构只需在与服务相同的机器上运行 GoReplay 守护程序。 流量录制重放特点 捕获网络指定端口流量输出到控制台捕获网络指定端口流量将原始流量实时重放到其他环境中捕获网络指定端口流量并保存到文件中捕获网络指定端口流量请求过滤指定路径流量并保存到文件中 3Linux服务器安装Go环境和GoReplay Go语言包下载地址https://studygolang.com/dl # 下载之后解压 tar -C /usr/local -zxvf go1.5.3.linux-amd64.tar.gz配置go语言环境变量 # 打开文件 vim /etc/profile # 添加环境变量 export GOROOT/usr/local/go export PATH$PATH:$GOROOT/bin # 编译生效 source /etc/profile # 测试 go version # go version go1.21.5 linux/386GoReplay下载二进制包地址https://github.com/buger/gor/releases下载1.3.1版本下载之后解压 tar xvzf gor_1.3.1_x64.tar.gz 解压完压缩包后可以从当前目录进行Gor也可以将Gor文件复制到的PATH文件下./gor 为执行文件 4使用方式 参数介绍 输入 --input-raw : 用于捕获 HTTP 流量时应指定 IP 地址或界面以及应用程序端口 --input-file 接收以前使用过的文件记录 --input-tcp 如果决定将多个转发器Gor实例转发流量到它Gor聚合实例使用 输出 --output-http 重播HTTP流量到给定的端点 --output-file 记录传入到文件的流量 --output-tcp 将传入的数据转发到另一个Gor实例 --output-stdout 用于调试输出所有数据。监听本地服务端口 8082 流量保存到本地的文件 ./gor --input-raw :8082 --output-filerequests.gor将流量从文件回放到其他服务 ./gor --input-file requests.gor --output-httphttp://ip:8082将 http 的请求打印到终端 ./gor --input-raw :8082 --output-stdout将 http 的请求实时转发到其他服务 ./gor --input-raw :8082 --output-httphttp://ip:8082将流量放大或减少转发给其他服务端口 ./gor --input-file requests.gor|200% --output-httphttp://ip:8082 ./gor --input-file requests.gor|20% --output-httphttp://ip:8082过滤指定请求 ./gor --input-raw :80 --http-allow-method GET --output-http http://target_server:8080 ./gor --input-raw :8080 --output-http staging.com --http-allow-url /api只收集请求头中符合 api-version 为 1.0x 的请求 ./gor --input-raw :8080 --output-http staging.com --http-allow-headerapi-version:^1\.0\d对指定的header或url请求进行限流或者加速 ./gor --input-tcp :28020 --output-httphttp://staging.com|10# (每秒请求数限制10个以内) ./gor --input-raw :80 --output-tcpreplay.local:28020|10% # (每秒请求数限制10%以内) ./gor --input-raw :80 --output-tcpreplay.local:28020|10% --http-header-limiter X-API-KEY:10% ./gor --input-raw :80 --output-tcpreplay.local:28020|10% --http-param-limiter api_key:10%将流量转发到多个站点 ./gor --input-raw :80 --output-http http://target_server:8080--output-http http://target_server2:8080将相同的流量发送到多个站点并且平分所有流量 ./gor --input-raw :80 --output-http http://staging.com --output-http http://dev.com--split-output true3.全链路压测之流量染色 1什么是流量染色 流量染色就是让压测流量可以被程序代码识别方便做好数据隔离。对压测的请求增加特色的流量标识比如请求里面增加url参数或header增加请求头。区分压测流量和真实流量正常用户不会访问到压测数据压测数据不会影响正式业务。染色后的压测流量产生的数据可以再压测结束后直接清理。 2流量链路改造 数据库隔离 压测产生的数据需要和真实数据库的进行隔离一般采用数据库的影子库、影子表进行隔离。 具体来说影子库是生产环境数据库的一份完整拷贝包含与生产环境相同的表结构和数据。 影子表是在影子库中创建的与生产环境表相对应的测试表压测的数据进入影子表。 生产和压测环境的隔离通过在压测环境中使用影子库和影子表可以避免对生产环境数据的直接修改和干扰。 完整的数据环境通过生成影子库和影子表的完整拷贝全链路压测的时候可以在准确、真实的数据环境中进行工作。 线上问题还原当线上出现问题时可以使用影子库和影子表进行问题还原和分析在相同数据环境中重现问题。 消息队列隔离 业务产生消息到MQ后消费者会进行消费压测过程产生的数据不能直接投递到MQ中。 一般是采用队列隔离或者消息隔离隔离策略也是基于消息的生产者封装方法进行投递。 队列隔离创建不同的消息队列压测的队列和正式的队列采用不同的前缀进行区分。 消息隔离消息里面增加参数标记消息是否是压测还是正式的数据。 缓存隔离 缓存里面的数据隔离对key进行区分根据流量标识是否是压测流量增加相关的key前缀标识。 不直接操作redis而是封装redis工具类在工具类里面判断是否是压测流量里面对key的读写进行操作。 3流量标识透传 流量标识透传是一种将请求上下文信息从发起端如客户端传递到目标端如后端服务的方案。可以在测试过程中追踪和识别请求的来源并对不同的请求进行分类和分析。压测流量全部带标识结合拦截器存储在ThreadLocal里面进行不同服务直接传递。 4流量标识透传方案 HTTP Header将请求上下文信息添加到HTTP请求的Header中。常用的Header字段包括 X-Request-ID请求标识ID用于唯一标识每个请求。X-Trace-ID链路追踪ID用于追踪请求在分布式系统中的路径。X-Forwarded-For客户端真实IP地址用于透传客户端IP。其他自定义的Header字段用于传递其他请求上下文信息。 5跨服务器之间流量传递 微服务里面采用了Fegin进行RPC调用在发送请求前可以从ThreadLocal里面的进行获取相关标识符进行Dubbo/GRPC都类似将请求上下文信息绑定到线程上下文以实现在不同服务间的透传 4.全链路混合压测环境搭建 1阿里云docker部署mysql docker run -d -p 3306:3306 --name mysql --privilegedtrue -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORDmysql8test. mysql:8.0.23新建数据库一个正式库一个影子库shadow。 订单库 order、shadow_order CREATE TABLE product_order (id bigint NOT NULL AUTO_INCREMENT,product_id bigint DEFAULT NULL,product_title varchar(255) DEFAULT NULL,amount int DEFAULT NULL,gmt_create datetime DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT41 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;商品库 product、shadow_product CREATE TABLE product (id bigint NOT NULL AUTO_INCREMENT,title varchar(255) DEFAULT NULL,stock int DEFAULT NULL,amount int DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;-- 分别在两个库中加入数据 INSERT INTO product (id, title, stock, amount) VALUES (1, 名称, 200, 10);2阿里云docker部署RabbitMQ docker run -d --name rabbitmq -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSpassword -p 15672:15672 -p 5672:5672 rabbitmq:3.8.9-management3阿里云docker部署Redis docker run -itd --name redis -p 6379:6379 -v /mydata/redis/data:/data redis:7.0.8 --requirepass 1234564阿里云docker部署Nacos docker run -d -e MODEstandalone -e JVM_XMS128m -e JVM_XMX128m -e JVM_XMN128m -p 8848:8848 -p 9848:9848 --restartalways --privilegedtrue --name nacos nacos/nacos-server:v2.2.35.全链路混合压测项目搭建 1需求模块划分 微服务业务划分商品服务、订单服务 2业务逻辑 我们就以蓝色的用户行为链路进行测试。 3流量染色和RPC透传 压测流量全部带标识结合拦截器存储在ThreadLocal里面进行不同服务直接传递。 /*** author lixiang* date 2024/1/6 15:50*/ Slf4j public class RequestInterceptor implements HandlerInterceptor {public static TransmittableThreadLocalInteger threadLocal new TransmittableThreadLocal();Overridepublic boolean preHandle(HttpServletRequest request, NonNull HttpServletResponse response,NonNull Object handler) throws Exception {//前端在header中传入test_flag标识来区分是否为正式流量或者压测流量String testFlag request.getHeader(test_flag);if(StringUtils.isNotBlank(testFlag)){//通过threadLocal传递信息log.info(压测流量,path {},request.getRequestURI());threadLocal.set(1);}else{log.info(正式流量,path {},request.getRequestURI());threadLocal.set(0);}return true;}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {threadLocal.remove();} }RPC调用feign透传参数 /*** author lixiang* date 2024/1/6 15:50*/ Configuration public class FeignConfig implements RequestInterceptor {Overridepublic void apply(RequestTemplate requestTemplate) {ServletRequestAttributes attributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();assert attributes ! null;HttpServletRequest request attributes.getRequest();EnumerationString headerNames request.getHeaderNames();if (headerNames ! null) {while (headerNames.hasMoreElements()) {String name headerNames.nextElement();String values request.getHeader(name);requestTemplate.header(name, values);}}} }4缓存隔离 缓存里面的数据隔离对key进行区分根据流量标识是否是压测流量增加相关的key前缀标识。 /*** 构建 key用于区分压测和正式流量* param key* return*/private String buildFinalKey(String key){Integer testFlag RequestInterceptor.threadLocal.get();String finalKey ;//压测流量if(testFlag !null testFlag 1){finalKey shadow:key;}else {finalKey key;}return finalKey;}5消息队列隔离 采用队列隔离或者消息隔离隔离策略也是基于消息的生产者封装方法进行投递 /*** 构建 routingKey的时候用于区分压测和正式流量* param routingKey* return*/private String buildFinalRoutingKey(String routingKey){Integer testFlag RequestInterceptor.threadLocal.get();String finalKey ;//压测流量if(testFlag !null testFlag 1){finalKey SHADOW.routingKey;}else {finalKey routingKey;}return finalKey;}监听器这块用于区分不同的队列 Slf4j Component public class OrderMQListener {RabbitListener(queuesToDeclare { Queue(ORDER_QUEUE) })public void orderQueue(ProductOrderDO productOrderDO, Message message, Channel channel) throws IOException {log.info(监听到正式消息{},message);long msgTag message.getMessageProperties().getDeliveryTag();handleOrderMsg(productOrderDO);channel.basicAck(msgTag,false);}RabbitListener(queuesToDeclare { Queue(SHADOW_ORDER_QUEUE) })public void shadowOrderQueue( ProductOrderDO productOrderDO,Message message, Channel channel) throws IOException {log.info(监听到影子消息{},message);long msgTag message.getMessageProperties().getDeliveryTag();handleOrderMsg(productOrderDO);channel.basicAck(msgTag,false);}private void handleOrderMsg(ProductOrderDO productOrderDO){String type 1.equals(productOrderDO.getType())?正式逻辑:压测逻辑;log.info({}-处理订单消息,type);} }6数据源隔离 双数据源配置类 /*** author lixiang* date 2024/1/6 15:50*/ Configuration public class DynamicDataSourceConfig {public static final String MASTER MASTER;public static final String SHADOW SHADOW;Bean(masterDataSourceProperties)ConfigurationProperties(spring.datasource.master)public DataSourceProperties masterDataSourceProperties() {return new DataSourceProperties();}Bean(masterDataSource)ConfigurationProperties(prefix spring.datasource.master.hikari)public HikariDataSource primaryDataSource() {return masterDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();}Bean(shadowDataSourceProperties)ConfigurationProperties(spring.datasource.shadow)public DataSourceProperties shadowDataSourceProperties() {return new DataSourceProperties();}Bean(shadowDataSource)ConfigurationProperties(prefix spring.datasource.shadow.hikari)public HikariDataSource secondaryDataSource() {return shadowDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();}}数据源路由配置 /*** author lixiang* date 2024/1/6 15:50*/ public class DynamicDataSource extends AbstractRoutingDataSource {private static final TransmittableThreadLocalString dataSourceContextHolder new TransmittableThreadLocal();/*** 配置DataSource, defaultDataSource为主数据库*/public DynamicDataSource(DataSource defaultDataSource, MapObject,Object targetDataSourceMap) {super.setDefaultTargetDataSource(defaultDataSource);super.setTargetDataSources(targetDataSourceMap);super.afterPropertiesSet();}Overrideprotected Object determineCurrentLookupKey() {return getDataSource();}public static void setDataSource(String dataSource) {dataSourceContextHolder.set(dataSource);}public static String getDataSource() {return dataSourceContextHolder.get();}public static void clearDataSource() {dataSourceContextHolder.remove();} }数据源切面区分正式库和测试库 Slf4j Aspect Component public class DataSourceAspect {Pointcut(execution(public * com.lixiang.controller..*.*(..)))public void controllerPointcut() {}Before(value controllerPointcut())public void methodBefore(JoinPoint joinPoint) {ServletRequestAttributes requestAttributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();assert requestAttributes ! null;HttpServletRequest request requestAttributes.getRequest();// 获取请求头String testFlag request.getHeader(test_flag);// 通过 testFlag 判断if (StringUtils.isNotBlank(testFlag)) {System.out.println(压测流量,影子库,path request.getRequestURI());DynamicDataSource.setDataSource(DynamicDataSourceConfig.SHADOW);} else {System.out.println(正式流量,正式库,path request.getRequestURI());DynamicDataSource.setDataSource(DynamicDataSourceConfig.MASTER);}} }启动主类配置数据源路由 /*** 创建多个数据源对象* param masterDataSource* param shadowDataSource* return*/BeanPrimarypublic DynamicDataSource dataSource(DataSource masterDataSource, DataSource shadowDataSource) {MapObject, Object targetDataSources new HashMap();targetDataSources.put(SHADOW, shadowDataSource);targetDataSources.put(MASTER, masterDataSource);return new DynamicDataSource(masterDataSource, targetDataSources);}6.Jmeter全链路混合压测 项目的代码我会传到资源文件中哦大家记得去找【案例实战】业务稳定性运行之全链路混合压测这个标题的资源文件。 1启动项目查看服务情况 2接口准备 ip:8082/api/product/v1/findById 查看商品详情 ip:8082/api/product/v1/list 查看商品列表 ip:8082/api/product/v1/lock 扣件商品库存 ip:8081/api/order/v1/add 下单我们以这个链路进行测试。 3配置jmeter 配置100个用户持续60s 配置请求头添加压测标识 配置用户变量 添加压测接口 查看报告 OK至此全链路压测就已经完成啦大家可以根据公司自己的业务去实施。记得给博主三连哦
http://www.pierceye.com/news/549584/

相关文章:

  • 有关图书网站建设策划书电脑公司网站系统源码
  • 西班牙网站后缀360收录提交入口网址
  • 济宁网站建设工程教育网官网学员登录
  • html5导航网站源码下载wordpress 调用 discuz
  • 住房和城乡建设部网站 投诉有哪些网站可以学做糕点的
  • 电商购物网站m3u8插件 wordpress
  • 河北手机网站制作多少钱wordpress文章头部
  • 悠悠我心的个人网站素材网站建设教育培训
  • 网站建设定金做什么会计分录湘潭有实力的关键词优化公司
  • 网站备案 网站建设方案书云搜索app
  • 青岛网络推广建站民营医院建设网站
  • 罗湖住房和建设局网站wordpress调用内容代码
  • 网络logo设计优化设计七年级下册语文答案
  • 贵港网站seo安新网站建设
  • 网站怎么自己编辑模块创意网名大全
  • php的网站架构建设框架wordpress如何运行
  • 广州seo网站排名优化数码设计网站
  • 免费做视频相册的网站网站建设的功能描述
  • 网站建设方案浩森宇特alexa排名是什么意思
  • 网上手机网站建设计划书百度小说风云榜排名
  • 用js来做网站帝国cms这么做网站
  • 网站建设需求分析班级网站备案服务类型
  • 网站备案幕布照片怎么算合格北京专业网站开发
  • 浙江建设职业技术学院塘栖校区网站网络推广方法有几种
  • 呢图网站场建设封面长安镇做网站
  • 搜索关键词的网站黄山做网站
  • 网络建站系统去除wordpress主题头部作者信息
  • 鼓楼微网站开发番禺有经验的网站建设
  • 对网站建设心得进入公众号继续阅读怎么弄
  • 网站建设公司投诉电话可以先做网站后备案吗