Rack-based applications

YARN不是调度器,而是分布式操作系统内核 YARN是Hadoop生态中首个将计算资源抽象为可编程内核的分布式系统,其本质超越传统资源调度器,提供进程隔离、内存管控、故障自愈等操作系统级能力。它基于双层调度模型解耦全局资源仲裁(ResourceManager)与应用自治逻辑(ApplicationMaster),通过CGroups、Timeline Server、ZKRMStateStore等机制实现多租户安全与可观测性。在PB级数据平台实践中,YARN的配置偏差、内核参数冲突、版本契约断裂常导致Container OOM、AM注册失败、Timeli 阅读详情

1.什么是rack

     rack是基于ruby的web服务器接口,它将http协议以非常简单的方式包裹起来,为web服务器和应用提供一致性的接口。rack被用于几乎所有的ruby web应用开发框架中。这是维基百科上给出的一个基于rack的ruby应用:
app = lambda do |env|
  body = "Hello, World!"
  [200, {"Content-Type" => "text/plain", "Content-Length" => body.length.to_s}, [body]]
end
 
run app

     重点是第三行,一个基于rack的ruby应用只需要一个包含call方法的对象,在调用call方法后该对象会返回形如第三行的一个列表,该列表包含三个元素:第一个元素是这次http请求的返回状态码200,第二个元素是一个返回的http响应headers的hash表,第三个元素是http响应体的列表,所以该列表的形式为:
[ status_code, headers, body ]

2.一个简单的rack-based-application

    编写一个最简单的rack based application,ok,需要一个能响应call方法的对象,在该对象上调用call方法能返回[ status_code, headers, body ]列表。在文件夹rack_based下新建simple.ru文件,*.ru被称为rakcup文件,rack使用该文件来启动rack应用。该文件内容为:
run lambda { |env| [200,{'Content-Type'=>'text/plain'},['OK']]}

    That's all.这个基于rack的应用已经编写完成了,在terminal中键入下面命令即可启动这个应用了:
rackup rack_based/simple.ru

    rack使用默认的内置WEBrick服务器,用rackup命令在端口9292启动该应用:
JasondeMacBook-Pro:Projects jason$ rackup rack_based/simple.ru 
Thin web server (v1.6.1 codename Death Proof)
Maximum connections set to 1024
Listening on 0.0.0.0:9292, CTRL+C to stop

     在浏览器中访问http://localhost:9292即可看到页面显示“OK”,说明应用正常工作了。
     Rails也是基于rack的框架,所以,rails的rackup配置文件是位于应用根目录下的config.ru:
# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
run Rails.application

     所以,Rails.application也能响应call方法。
     另外,call方法还带有一个env参数,该参数是一个hash表,包含了请求所有的环境信息,rack应用可以根据env信息给予不同的响应,如下面将simple.ru略作修改,使得它可以返回所有的请求信息:
module Simple
	class Application
		def self.call(env)
			[200,{'Content-Type'=>'text/plain'},[env.to_s]]
		end
	end
end
run Simple::Application

     启动该应用,则可以看到结果:

 3.middleware

   这是一个rack应用的请求栈:

      浏览器发出http请求到web Server,web server 再将请求转交给rack,rack负责将请求转交给应用程序栈。在应用栈中,请求经过一层层的中间层middleware后,最好才传达给rack应用,譬如rails的应用的controller最后来处理请求,当rack应用处理完请求后,又逐层返回,最后由rack上交给web server完成响应。注意,并非每次请求都需要完成从上到下的全部栈层次,比如请求一个存在的静态文件,就可能直接由处理静态文件的middleware发送文件,而根本不会将请求传递到rack应用controller中去。
      由这张图可以看出来,rack是web server和应用之间的桥梁,或者说适配器。另外,rack应用处在请求栈的最后一层,web请求经过了无数的middleware后才真正到达应用这里。middleware所起的作用和java struts中的拦截器概念非常相似,它们都负责将请求逐层包裹最后递交给应用的是一个非常友好的请求包,使得应用可以更方便地处理逻辑。
      下面就来创建一个自定义的middleware,该middleware可以将请求网页内所有<h1>标记内的内容的e改写成大写的X。
       首先新建一个rails app,在新建完成后,实用下面命令可以查看rails已经使用的middleware:
rake middleware

use Rack::Sendfile
use ActionDispatch::Static
......
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run Demo::Application.routes
      现在在应用的lib目录下新建文件link_jumbler.rb,文件app/lib/link_jumbler.rb的内容:
require 'nokogiri'

class LinkJumbler
	def initialize(app,letters)
		@app=app
		@letters=letters
	end

	def call(env)
		status, headers, response = @app.call(env)
		body=Nokogiri::HTML(response.body)
		body.css("h1").each do |a|
			@letters.each do |f,r|
				a.content=a.content.gsub f.to_s,r.to_s
			end
		end

		[status,headers,[body.to_s]]
	end
end

      首先,在initialize方法中,接受了两个参数,一个是app参数,它会在各个middleware中传递,需要对它调用call方法。另一个参数letters是我们这个middleware需要的参数,这个参数来源是挂载middleware时产生的。不同middleware的传递的这个参数不同,也可能根本没有这个额外的参数。在call方法中,先对@app调用了call方法获得了一个rack风格的响应结果,这里利用nokogiri解析结果,并做出修改,最后返回结果。在java struts中有个前拦截器和后拦截器,从这里也可以看出middleware也可以有相同的功能,比如这里就是对结果作处理,属于一个后处理的middleware。
      然后将这个middleware添加到该应用的middleware栈中(看到letters哪儿来的了吧),在app/config/application.rb中添加
config.middleware.use LinkJumbler,{"e"=>"X"}
     添加完成后app/config/application.rb文件内容为:
require File.expand_path('../boot', __FILE__)

require 'rails/all'
require File.expand_path('../../lib/link_jumbler', __FILE__)

Bundler.require(:default, Rails.env)

module Demo
  class Application < Rails::Application
    config.middleware.use LinkJumbler,{"e"=>"X"}
  end
end

    再次执行rake middleware命令,可以看到LinkJumbler被添加到最后一层middleware:
use Rack::Sendfile
use ActionDispatch::Static
......
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use LinkJumbler
run Demo::Application.routes
     启动该rails应用,可以看到和标准rails欢迎界面的区别了吗?



【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04 编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017) 阅读详情

相关推荐

【信息科学与工程学】【通信工程】第八十六篇 通信网络设备及通信网络组网的所有学科知识01

编号001类型网络虚拟化与覆盖技术网络领域数据中心网络子领域大二层网络 / 网络虚拟化核心数学方程式/算法模型核心算法:VXLAN封装与解封装。关键在于24位VNI(虚拟网络标识符)到物理网络的三层IP地址的映射。封装:收到原始以太帧后,为其添加 VXLAN 头部(含 VNI)、外层 UDP 头(目的端口 4789)、外层 IP 头(源 IP 为本地 VTEP IP,目的 IP 为对端 VTEP IP)以及外层 MAC 头。解封装:对端 收到报文后,剥离外层头部,根据内层帧的目的 MAC 和 VNI 进行二

weixin_49199313的博客 839

理解 Rack 应用及其中间件

大多数 web 开发者都是基于高度抽象出来的接口基础上编码,很多时候我们知其然但不知其所以然,特别是使用 Rails 框架开发时。 你是否研究过 Rails 内部对请求/响应周期是如何运作的?近期我意识到对于 Rack 和 middlewares 内部机制知之甚少,所以我花了一点时间来研究它。在这篇文章中分享了我的研究成果。 什么是 Rack 你知道 R...

weixin_33847182的博客 1631

【信息科学与工程学】计算机科学与自动化 第二百三十三篇 凤凰架构01

编号类型领域系统软件/硬件或系统集成方案及系统架构模块子模块函数名称/算法名称算法的数学分析及计算机体系架构及数据结构与算法详细设计及参数列表及数值范围设计关联知识1共识算法分布式基石状态机复制架构:Proposer/Acceptor/Learner 多节点角色模型,基于操作转移(Operation Transfer)分布式共识PaxosPaxos 协议(Prepare/Promise/Accept/Accepted 两阶段)数学基础:多数派(Quorum)投票,基于鸽巢原理保证 W+R>N 时读写集合必有

weixin_49199313的博客 264

express 中文文档

express() 创建一个express应用程序 var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send('hello world'); }); app.listen(3000); Application app.set(na...

weixin_30576859的博客 321

【信息科学与工程学】【数据科学】数据科学领域——第三篇 数学08 几何学00总篇

编号英文名称中文名称简要说明/归属1Foundations of Geometry几何基础公理化方法, Hilbert《几何基础》2Euclidean Geometry (Synthetic)欧几里得几何(综合法)《几何原本》传统3Analytic Geometry解析几何坐标方法, Descartes, Fermat4Plane Geometry平面几何三角形、圆、共点共线等经典问题5Solid Geometry立体几何三维空间中的图形与度量6Non-Euclidean Geometry非欧几何平行公设不

weixin_49199313的博客 197

【信息科学与工程学】计算机科学与自动化——第三百零五篇 数据中心 Scale-Up、Scale-Out、Scale-Across 01

临界带宽B_critical满足:V_orig/B_critical = V_orig/(r·B_critical) + V_orig/R_compress + r·V_orig/R_decompress ⇒ 1/B_critical = 1/(r·B_critical) + 1/R_compress + r/R_decompress ⇒ B_critical = (1 - 1/r) / (1/R_compress + r/R_decompress)。T_original中所有数据均经内存总线传输。

weixin_49199313的博客 475

Rebuttal to the KCC v1.0 Code Audit(Rebuttal Page No.2)

The auditor claims that KCC’s AND-gate fluid model assumes a “vacuum” (no cross-traffic) and that the DRAIN timeout “推翻严格最优性证明” (overturns the strict optimality proof). Both claims are incorrect.

liulilittle的博客 629

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

Ubuntu 18.04 手动部署 SNMP 服务实战指南

SNMP(简单网络管理协议)是实现服务器与网络设备统一监控的核心协议,其服务端 snmpd 进程构成可观测性基础设施的底层探针。理解 SNMP 工作原理需掌握 MIB 树结构、community string 权限模型及 UDP 161 端口通信机制;技术价值在于轻量、跨平台、与 Zabbix/Prometheus 等主流监控系统深度集成;典型应用场景包括 Linux 主机资源采集(CPU/内存/磁盘)、网络设备流量监控、UPS 状态上报及 Docker 容器指标导出。本文聚焦 Ubuntu 18.04 这

weixin_30275415的博客 451

[Ethernet in CANoe]4--CANoe工程中SOME/IP报文的详细介绍(二)

介绍了SOME/IP报文的SD报文(ServiceDiscovery),本片文章开始继续介绍SOME/IP报文。

汽车ECU自动化测试 1113

Ollama运行DeepSeek大模型调优指南:GPU与CPU协同实现性能最大化

Ollama运行DeepSeek大模型调优指南

qq_32358423的博客 3996

【Linux公有云网站配置实战|企业网络管理课程溯源、完整实训、例题解析与故障排错】

文末整理配套学习网站、网课、专业书籍。早期网络依靠人工经验维护,没有标准化流程、统一配置规范,网络故障频繁,于是各大高校开设企业网络管理相关课程,目的是培养能够维护企业内网、服务器、对外业务网站的专业运维人员。本次实训基于公有云服务器,以Linux操作系统为基础,完整完成云服务器初始化、远程连接、Web服务安装、网站源码部署、防火墙与云安全组放行,最终实现公网用户通过IP访问企业网站。Linux系统凭借稳定、开源、免费的优势成为企业服务器首选,课程新增Linux命令、用户管理、服务部署、防火墙配置内容。

2501_92125808的博客 337

星空组网 vs 蒲公英 vs Tailscale:2024年国内免费异地组网工具横评(含实测数据)

本文对2024年国内主流免费异地组网工具星空组网、蒲公英和Tailscale进行了深度横向评测。基于实测数据,重点分析了三者在P2P成功率、中继延迟、传输速度及稳定性方面的表现,为中小企业、远程办公及个人开发者提供了清晰的选择指南。星空组网在国内网络环境下展现出优秀的平衡性。

weixin_29217235的博客 1439

技术文章配图自动生成:DALL·E 2提示词工程实战方法论

技术图像生成本质上是将抽象技术语义转化为精准视觉语义的过程,其核心在于构建可复现的视觉语法体系。不同于通用AI绘图,技术配图需严格满足精确性(如GPU带宽、协议名称)、一致性(色彩系统、图标规范)与前瞻性(未量产但已验证的架构),这要求提示词必须分层设计:语义层锚定技术事实,结构层定义信息拓扑,呈现层服务可读性而非装饰性。DALL·E 2在此场景的价值,不在于‘画得像’,而在于通过结构化提示词实现技术意图的零失真传达——尤其适用于LLM推理流程、RAG系统数据流等高专业度可视化需求,已成为工程师提升技术传播

weixin_34268169的博客 396

angular中访问本地json文件

先在assets文件夹下写一个json文件,这样在打完包之后也可以手动修改json文件内容 1、在需要访问本地json文件的ts文件里面引入 import{HttpClient}from'@angular/common/http'; 2、用ajax请求调用,我这里是用已经封装好的ajax请求调用 gethttp = ()=>{ var self = this self.ajax.getAjax("../../assets/server.json","g...

蜗牛~~ 1829

动态时间规整(Dynamic Time Warping,DTW):让时间序列分析不再枯燥和代码全分析

动态时间规整(DTW)是一种用于比较时间序列相似性的算法,特别适用于处理长度不同或时间轴不对齐的序列。本文介绍了DTW的核心概念,包括其通过非线性对齐解决时间扭曲问题的能力,以及在语音识别、金融分析等领域的应用。通过Python代码示例,演示了如何计算两个模拟时间序列的DTW距离,并可视化最优对齐路径。结果显示,DTW能够有效捕捉序列间的相似模式,即使它们在时间轴上存在偏移或伸缩。该算法通过最小化累积距离来评估相似性,得分越低表明序列间相似度越高。

此星光明博客 162

rake- Ruby Make

Rake,顾名思义,就是Ruby的Make工具。的

压碎起重机 4162

大模型——AI对话四象限

{ "摘要": "文章揭示了90%的人不会有效与AI沟通的问题,指出简单粗暴的提问只能得到标准答案。作者提出'AI对话四象限'模型:1)双方都懂时提效;2)AI懂但需学会分层提问;3)共同探索未知领域;4)向AI传授独家知识。强调沟通技巧的重要性,认为会提问的人不会被AI替代。最后呼吁读者尝试四象限思维,与AI碰撞火花。" }

311

axlsx报表工具(一)——安装及入门

安装       axlsx是一个基于ruby的Office Open XML Spreadsheet报表生成工具,下图是它生成的一个报表截图(图片来源:https://raw.github.com/randym/axlsx/master/examples/sample.png)。         安装axlsx和安装其他gem一样: $ gem install axlsx 创

压碎起重机 3259

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版)

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版),OpenCode技能安装与使用指南,分为四个步骤:1)准备Windows服务器环境并确认OpenCode可用;2)通过Git或直接下载方式获取Skill;3)配置技能路径至.opencode/config.json;4)运行测试技能。关键点包括路径配置必须使用双反斜杠、确保Python环境正确安装、管理员权限运行等。文中提供了文本总结技能的完整案例,从创建skill.yaml和main.py到注册运行的全流程,并针

专注于编程、AI、人工智能等多个领域内容研究和分析 1080

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ruby之 周期性任务

1.前言      无论是用ruby做系统管理,还是用rails做web开发,都可能遇到周期性任务,它们按照一定时间周期(1小时,2天......)继续地触发。在ruby中,我认为一次性任务使用sidekiq来完成是非常方便的,而周期性的任务就需要用到whenever,sidetiq,clockwork等等gem了。 2.whenever     首先,whenever是基于linux的cr

压碎起重机 2733

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

axlsx报表工具(二)——格式化为美观的表格

基础知识       axlsx的格式化使用Aslsx::Styles类来处理,通常使用Axlsx::Styles#add_style 帮助方法来添加格式,该方法定义: (Integer) add_style(options = {})       所有的格式设置操作都在options这个hash中指定,该hash的键名非常好记,下面是常见的键值列表: Options Hash (opti

压碎起重机 2693

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

初识jruby之 安装配置jruby on rails

1. prerequesite       假设你已经安装好了jruby,并且使用的jdk最好是1.7。 2. 安装rails     安装rails4.0.0: C:\>jruby -S gem install rails -V    查看安装的rails版本: C:\>jruby -S rails -v Rails 4.0.0 3. 新建一个rails Apps C:\>j

压碎起重机 2372

axlsx报表工具(三)——创建图表

饼图       axlsx创建饼状图非常简单,上图: wb.add_worksheet(:name => "Pie Chart") do |sheet| sheet.add_row ["First", "Second", "Third", "Fourth"] sheet.add_row [1, 2, 3, 4] sheet.add_chart(Axlsx::Pie3DCh

压碎起重机 1853

在Rails外单独使用ActiveRecord

单独使用ActiveRecord      需要在应用根目录demo/下的app.rb文件中写入: require 'active_record' require 'sqlite3' ActiveRecord::Base.establish_connection( :adapter=>'sqlite3', :database=>'data.sqlite3'

压碎起重机 1834
上一篇: 天道酬勤——在追逐梦想的路上
下一篇: Rspec简介
qjpcpu
博客等级 码龄15年 59粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值