计算机语言中send power offsend nop commandd是什么意思

net_百度百科
声明:百科词条人人可编辑,词条创建和修改均免费,绝不存在官方及代理商付费代编,请勿上当受骗。
.NET是微软下一代的操作平台,它允许人们在其上构建各种应用方式,使人们尽可能通过简单的方式,多样化地、最大限度地从网站获取信息,解决网站之间的协同工作,并打破计算机、设备、网站、各大机构和工业界间的障碍--即所谓的“数字孤岛”,从而实现因特网的全部潜能,搭建起平台。后缀为net是公司,为个人或商业提供服务。
net相关书籍
C#程序设计
C# Primer中文版
.NET框架程序设计(修订版)
c#Windows程序设计
.NET程序设计技术内幕
.NET本质论--第1卷:公共语言运行库(中文版)[1]
net发展历程
NET的正式诞生:日微软正式推出.NET的开发工具--Visual 2002。
.NET的未来:微软下一代的Windows--Longhorn,第一个基于.NET环境的操作系统,它表明微软彻底转向.NET的坚定决心和强大力量。
.NET Compact Frameweork是.NET战略向移动领域扩展的体现。
过去的以Windows为中心的应用程序将革新为以Web为中心的应用程序,革新为Smart Client的应用程序。
通过提供更多的服务,不仅仅是语言、工具,还有和实际案例,甚至更多的教程和教材,微软在帮助开发者实现从传统Windows到.NET,或者从J2EE到.NET的转换,从而使.NET全方面的、缓慢的渗透到学校、开发者和客户中。
.NET的使命是要改变开发模式,并使应用程序的性能和使用方式发生一次飞跃。
微软把.NET称为是一个XML Web Services的平台,其实.NET和Web Services两者之间没有非常本质的联系。XML已经深入人心,但Web Services的应用却迟迟没有推广起来,但是只要微软相信它会火……,所以……
运行在.NET上的WinForm(或)将带来B/S的回归,C/S仍然有自己的应用领域,比如简单的浏览和信息发布,但企业应用将更适合C/S结构……
总结:ESRI公司的ArcIMS只是过渡产品,与.NET结合更好的ArcGIS Server将全面取代它,而ArcGIS Engine则是更有前途的技术!
netDOS命令
netNET的基本用法
NET [ ACCOUNTS | COMPUTER | CONFIG | CONTINUE | FILE | GROUP | HELP |
HELPMSG | LOCALGROUP | NAME | PAUSE | PRINT | SEND | SESSION |
SHARE | START | STATISTICS | STOP | TIME | USE | USER | VIEW ]
netNet Accounts
更新用户帐号数据库、更改密码及所有帐号的登录要求。
命令格式:net accounts [/forcelogoff:{minutes | no}] [/minpwlen:length] [/maxpwage:{days | unlimited}] [/minpwage:days] [/uniquepw:number] [/domain]
参数介绍:
(1)、键入不带参数的net accounts显示当前密码设置、登录时限及域信息。
(2)、/forcelogoff:{minutes | no}设置帐号或有效登录时间过期时,被强制退出系统之前所拥有的分钟数。
(3)、/minpwlen:length设置用户帐号密码的最少字符数。
(4)、/maxpwage:{days | unlimited}设置用户帐号密码有效的最大天数。
(5)、/minpwage:days设置用户必须保持原密码的最小天数。
(6)、/uniquepw:number要求用户更改密码时,必须在经过number次后才能重复使用 与之相同的密码。
(7)、/domain在当前域的主域控制器上执行该操作。
(8)、/sync当用于主域控制器时,该命令使域中所有备份域控制器同步
net accounts /minpwlen:7 将用户帐号密码的最少字符数设置为7
net accounts /forcelogoff:no 禁止强制退出系统,默认。
netNet Computer
从域数据库中添加或删除计算机。
命令格式:net computer \computername {/add | /del}
参数介绍:
(1)、\computername指定要添加到域或从域中删除的计算机。
(2)、/add将指定计算机添加到域。
(3)、/del将指定计算机从域中删除。
net computer \abc /add 将计算机abc添加到登录域
netNet Config
显示当前运行的可配置服务,或显示并更改某项服务的设置。
命令格式:net config [service [options]]
参数介绍:
(1)、键入不带参数的net config显示可配置服务的列表。
(2)、service通过net config命令进行配置的服务(server或workstation)
(3)、options服务的特定选项。
net config
显示当前运行的可配置服务
net config server 显示server当前的设置
net config workstation 显示workstation当前的设置
netNet Continue
用于重新激活一个被 net pause 命令挂起的Windows服务。
命令格式:net continue service
参数介绍:
(1)、service 需要恢复执行的服务
net pause workstation #挂起workstation服务
net continue workstation #重新继续运行workstation服务
netNet File
用于关闭一个共享的文件并且删除文件锁。不带选项会列出服务器上打开的文件。
命令格式:net file [id [/close]]
参数介绍:
(1)、id 文件标识号。
(2)、/close 关闭打开的文件并删除文件锁。请从共享文件的服务器中键入该命令。
netNet Group
用于添加、显示或修改服务器上的全局组。无参数时显示服务器上的组名。
命令格式:net group [groupname [/comment:&text &]] [/domain]
net group groupname {/add [/comment:&text &] | /delete} [/domain]
net group groupname username [ ...] {/add | /delete} [/domain]
参数介绍:
(1)、groupname 要添加、扩展或删除的组。仅提供某个组名便可查看组中的用户列表。
(2)、/comment:&text & 为新的或已有组添加注释。注释最多可以是 48 个字符,文本应含在引号中。
(3)、/domain  在当前域的主域控制器中执行该操作,否则在本地计算机上执行操作。
(4)、username[ ...] 列表显示需要从组中添加或删除的用户。使用空格分隔多个用户名称。
(5)、/add 添加组或在组中添加用户名。必须使用该命令为添加到组中的用户建立帐号。
(6)、/delete 删除组或从组中删除用户名。
net group users #实际上group 命令只能用于Windows域控制器。
netNet Help
提供网络命令列表及帮助主题,或提供指定命令、主题的帮助。
命令格式: net help [command] 或 net command {/help | /?}
参数介绍:
(1)、键入不带参数的 net help 显示能够获得帮助的命令列表和帮助主题。
(2)、command 需要其帮助的命令,不要将 net 作为 command 的一部分。
(3)、/help 提供显示帮助文本方式选择。
(4)、/? 显示命令的正确语法。
net help accounts #显示net accounts的使用语法
net accounts help #显示net accounts的使用语法
netNet Helpmsg
提供 Windows NT 错误信息的帮助。
命令格式:net helpmsg message#
参数介绍:
(1)、message# 需要其帮助的 Windows NT 消息的四位代码。
net helpmsg 3506 #用户需要帮助时的4位windows消息号3506(指定的选项无效)。
netNet Localgroup
添加、显示或更改本地组。
命令格式:net localgroup [groupname [/comment:&text &]] [/domain]
net localgroup groupname {/add [/comment:&text &] | /delete} [/domain]
net localgroup groupname name [ ...] {/add | /delete} [/domain]
参数介绍:
(1)、无参时将显示服务器名称和计算机的本地组名称。
(2)、groupname 添加、扩充或删除的本地组名。提供组名即可查看用户列表或本地组中的全局组。
(3)、/comment: &text& 为新建或现有组添加注释。注释文字的最大长度是 48 个字符,并用引号引住。
(4)、/domain 在当前域的主域控制器中执行操作,否则仅在本地计算机上执行操作。
(5)、name [ ...]列出要从本地组添加或删除的一个或多个用户名或组名,多个用户名或组名之间
以空格分隔。可以是本地用户、其他域用户或全局组,但不能是其他本地组。如果是其他用户,要在
用户名前加域名(例如,SALESRALPHR)。
(6)、/add 将全局组名或用户名添加到本地组中。在使用该命令将用户或全局组添加到本地组之前,必
须为其建立帐号。
(7)、/delete 从本地组中删除组名或用户名。
net localgroup users #查看用户组users的用户列表
netNet Name
添加或删除消息名(别名),或显示计算机接收消息的名称列表。要使用 net nam
e 命令,计算机中必须运行信使服务(messenger服务)。
命令格式:net name [name [/add | /delete]]
参数介绍:
(1)、无参 将列出当前使用的名称。
(2)、name 指定接收消息的名称。名称最多为 15 个字符。
(3)、/add 将名称添加到计算机中。/add 是可选项,net name name = net name name /add 。
(4)、/delete 从计算机中删除名称。
net name abc #添加消息名称abc。
netNet Pause
暂停正在运行的服务。参考第4项Net Continue。
命令格式:net pause service
netNet Print
显示或控制打印作业及打印队列。
命令格式:net print \computername sharename
net print [\computername ] job# [/hold | /release | /delete]
参数介绍:
(1)、computername 共享打印机队列的计算机名。
(2)、sharename 打印队列名称。当包含 computername 与 sharename 时,使用反斜杠将它们分开。
(3)、job# 在打印机队列中分配给打印作业的标识号。有一个或多个打印机队列的计算机为每个打印作
业分配唯一标识号。如果某个作业号用于共享打印机队列中,则不能指定给其他作业,也不能分配给其他
打印机队列中的作业。
(4)、/hold 使用 job# 时,在打印机队列中使打印作业等待。打印作业停留在打印机队列中,并且其他
打印作业只能等到释放该作业之后才能进入。
(5)、/release 释放保留的打印作业。
(6)、/delete 从打印机队列中删除打印作业。
net print \\abcd\lp #显示当前计算机abcd的lp打印队列中的打印作业。
netNet Send
向网络的其他用户、计算机或通信名发送消息。要接收消息必须运行信使服务。
命令格式:net send {name | * | /domain[:name] | /users} message
参数介绍:
(1)、name 要接收发送消息的用户名、计算机名或通信名。如果计算机名包含空字符,则要将其用引号
(& &) 引住。
(2)、* 将消息发送到组中所有名称。
(3)、/domain[:name] 将消息发送到计算机域中的所有名称。如果指定 name,则消息将发送到指定域
或组中的所有名称。
(4)、/users 将消息发送到与服务器连接的所有用户。
(5)、message 作为消息发送的文本。
net send abcd 中国 #将“中国”发送到消息名“abcd”。
netNet Session
列出或断开本地计算机和与之连接的客户端的会话。
命令格式:net session [\computername] [/delete]
参数介绍:
(1)、无参 显示所有与本地计算机的会话的信息。
(2)、\computername 标识要列出或断开会话的计算机。
(3)、/delete 结束与 \computername 计算机会话并关闭本次会话期间计算机的所有打开文件。如果省略
\computername 参数,将取消与本地计算机的所有会话。
net session #显示所有与本地计算机的会话。
netNet Share
创建、删除或显示共享资源。
命令格式:net share sharename
net share sharename=drive:path [/users:number | /unlimited] [/remark:&text&]
net share sharename [/users:number | unlimited] [/remark:&text&]
net share {sharename | drive:path} /delete
参数介绍:
(1)、无参 键入不带参数的 net share 将显示本地计算机上所有共享资源的信息。
(2)、sharename 共享资源的网络名称。键入带 sharename 的 net share 命令,只显示该共享信息。
(3)、drive:path 指定共享目录的绝对路径。
(4)、/users:number 设置可同时访问共享资源的最大用户数。
(5)、/unlimited 不限制同时访问共享资源的用户数。
(6)、/remark:&text & 添加关于资源的注释,注释文字用引号引住。
(7)、/delete 停止共享资源。
net share print$ /delete #停止print$的共享
netNet Start
启动服务,或显示已启动服务的列表。参考第4项Net Continue。
命令格式:net start service
netNet Statistics
显示本地工作站或服务器服务的统计记录。
命令格式:net statistics [workstation | server]
参数介绍:
(1)、无参 列出其统计信息可用的运行服务。
(2)、workstation 显示本地工作站服务的统计信息。
(3)、server 显示本地服务器服务的统计信息。
net statistics workstion #显示本地工作站服务的统计信息
netNet Stop
停止 Windows NT 网络服务。参考第4项Net Continue。
命令格式:net stop service
参数介绍:
(1)、service 包括下列服务:alerter(警报)、client service for netware(Netware 客户
端服务)、clipbook server(剪贴簿服务器)、computer browser(计算机浏览器)、directory
replicator(目录复制器)、ftp publishing service (ftp )(ftp 发行服务)、lpdsvc、messe
nger(信使)、net logon(网络登录)、network dde(网络 dde)、network dde dsdm(网络 d
de dsdm)、network monitor agent(网络监控代理)、nt lm security support provider(NT L
M 安全性支持提供)、ole(对象链接与嵌入)、remote access connection manager(远程访问连
接管理器)、remote access isnsap service(远程访问 isnsap 服务)、remote access server
(远程访问服务器)、remote procedure call (rpc) locator(远程过程调用定位器)、remote p
rocedure call (rpc) service(远程过程调用服务)、schedule(调度)、server(服务器)、si
mple tcp/ip services(简单 TCP/IP 服务)、snmp、spooler(后台打印程序)、tcp/ip netbios
helper(TCP/IP NETBIOS 辅助工具)、ups 及 workstation(工作站)。
netNet Time
使计算机的时钟与另一台计算机或域的时间同步。
命令格式:net time [\computername | /domain[:name]] [/set]
参数介绍:
(1)、\computername要检查或同步的服务器名。
(2)、/domain[:name]指定要与其时间同步的域。
(3)、/set使本计算机时钟与指定计算机或域的时钟同步。
net time \\abcd /set #使本地计算机的时间与计算机abcd系统时间一致。
netNet Use
连接计算机或断开计算机与共享资源的连接,或显示计算机的连接信息。
命令格式:net use [devicename | *] [\computername\sharename[\volume]] [password | *]]
[/user:[domainname\]username] [[/delete] | [/persistent:{yes | no}]]
参数介绍:
(1)、无参 列出网络连接。
(2)、devicename 指定要连接到的资源名称或要断开的设备名称。
(3)、\computername\sharename 服务器及共享资源的名称。
(4)、password 访问共享资源的密码。
(5)、* 提示键入密码。
(6)、/user 指定进行连接的另外一个用户。
(7)、domainname 指定另一个域。
(8)、username 指定登录的用户名。
(9)、/home 将用户连接到其宿主目录。
(10)、/delete 取消指定网络连接。
(11)、/persistent 控制永久网络连接的使用。
net use e: \\abcd\temp #将计算机abcd下共享的temp目录建为网络E盘显示在本地
net use e: \\abcd\temp /delete #断开连接
netNet User
添加或更改用户帐号或显示用户帐号信息。=net users。
命令格式:net user [username [password | *] [options]] [/domain]
参数介绍:
(1)、无参 查看计算机上的用户帐号列表。
(2)、username 添加、删除、更改或查看用户帐号名。
(3)、password 为用户帐号分配或更改密码。
(4)、* 提示输入密码。
(5)、/domain 在计算机主域的主域控制器中执行操作。
net user administrator #查看用户administrator的信息
net user administrator 123456 #将administrator的密码改为123456
netNet View
显示域列表、计算机列表或指定计算机的共享资源列表。
命令格式:net view [\\computername | /domain[:domainname]]
参数介绍:
(1)、无参 显示当前域的计算机列表。
(2)、\\computername 指定要查看其共享资源的计算机。
(3)、/domain[:domainname] 指定要查看其可用计算机的域。
net view \\abcd #查看计算机abcd的共享资源列表。
net view /domain:LOVE #查看LOVE域中的机器列表。
1、在COMMAND下可以用字符方式,NET /?或NET或NET HELP得到一些方法 相应的方法的帮助NETCOMMAND /HELP或NET HELP COMMAND 或NET COMMAND /? 另对于错误NET HELPMSG MESSAGE#是4位数
2、强制参数 所有接受选项/yes和/no(可缩写为/y和/n)。[简单的说就是预先给系统的 提问一个答案]
3、有一些命令是马上产生作用并永久保存的,使用的时候要慎重
4、对于NET命令的功能都可以找到相应的图形工具的解决方案
5、在NT的NET命令中有一些参数是只有在SERVER环境中才能使用的
6、在WIN98的NET命令中有一些参数不能在DOS-WIN中使用,只能在DOS环境中使用
net其他解释
网,网络,网状物,净利,实价
净余的,纯粹的
用网捕,净赚,得到
[域] Nerwork operations and service centers,网络服务商
abbr.(略语)
network provider [in Internet addresses]
network provider[in Internet addresses]
abbr.(略语)
National Educational Television.
国家教育电视台
n.(名词)
An openwork fabric made of threads or cords that are woven or knotted together at regular intervals.
网:用线或绳按有规律的空隙编织或连结而成的透孔织物结构
Something made of openwork fabric,especially:
透孔织物结构的东西,尤指
A device for capturing birds,fish,or insects.
网:捕捉鸟、鱼或昆虫的工具
A barrier against flying insects:
帐:阻挡飞虫的屏障:
a mosquito net.
A mesh for holding the hair in place.
发网:固定头发的圈
So a snare.
罗网,陷阱:用于包裹的东西;罗网
A fine mesh fabric used as curtain or dress material or as the foundation for various laces.
花边布料:用做窗帘或服装材料或做为多种花边基础的优美的网状结构
【体育运动】
A barrier of meshwork cord or rope strung between two posts to divide a court in half,as in tennis and badminton.
球网:连在两个界柱之间平分一个球场的绳索的网状屏障。如乒乓球和网球
A ball that is hit into this meshwork barrier.
触网球:撞在网状屏障上的球
The goal in soccer,hockey,and lacrosse.
球门:足球、和长曲棍球的球门
A meshed network of lines,figures,or fibers.
孔状网:线、图或纤维的孔状网
A radio,television,or telephone network.
网路:收音机、电视或
Computer Science See network
【计算机科学】 参见 network
(及物动词)
net.ted,net.ting,nets
To catch or ensnare in or as if in a net.
捕获:像是在网中捉住或网进
To cover,protect,or surround with or as if with a net.
以网保护:用或象用网盖住、保护或包围
Sports To hit (a ball) into the net.
【体育运动】 击(球)入网
To make into a net.
网住:使进入网里
Middle English
from Old English * see ned-
源自 古英语 *参见 ned-
n.(名词)
adj.(形容词)
Abbr. n.Business
缩写 n.【贸易】
Remaining after all deductions have been made,as for expenses:
纯的:扣除所有开支后剩下的,如开销:
net profit.
Remaining after tare is deducted:
扣除皮重剩下的:
net weight.
最后的;结束的:
the net result.
n.(名词)
Abbr. n.Business A net amount,as of profit or weight.
缩写 n.【贸易】 净量,如利润或重量的
T the essence:
主要点;本质:
the net of our discussion.
我们讨论的要点
(及物动词)
net.ted,net.ting,nets
To bring in or yield as profit.
作为利润带来或产生
To clear as profit.
Middle English [elegant,remaining after deductions]
[消减后上等的,留下的]
from Old French [elegant]
源自 古法语 [优雅的]
and from Old Italian netto [remaining after deductions]
并源自 古意大利语 netto [减少后留下的]
both from Latin nitidus [clean,elegant] * see neat 1
都源自 拉丁语 nitidus [干净,上等的] *参见 neat1
净的; 纯的
无虚价的; 有效的; 基本的; 最后的
a net interest
纯利,净赚
a net loss
a net profit [gain]
纯利润 at 5
dollars net
实价五美元
the net result
net amplitude
合成振幅,净幅度
net attenuation
净[实际]衰减量
net efficiency
net weight
净数; 净重; 净利; 净赚
要点; 要旨
( netting)净赚[得]
The sale netted me a good profit.
这次销售使我获得巨利。
net-income [revenue]
纯收益; 净增长量
核粒,染色质核仁
income net
净收入[收益]
headspace net
product net
net of reverves
扣除准备金后净额
net of tax
network provider [in Internet addresses]
National Educational Television.
An openwork fabric made of threads or cords that are woven or knotted together at regular intervals.
Something made of openwork fabric,especially:
A device for capturing birds,fish,or insects.
A barrier against flying insects:
a mosquito net.
A mesh for holding the hair in place.
So a snare.
A fine mesh fabric used as curtain or dress material or as the foundation for various laces.
A barrier of meshwork cord or rope strung between two posts to divide a court in half,as in tennis and badminton.
A ball that is hit into this meshwork barrier.
The goal in soccer,hockey,and lacrosse.
A meshed network of lines,figures,or fibers.
A radio,television,or telephone network.
Computer Science See network
net.ted,net.ting,nets
To catch or ensnare in or as if in a net.
To cover,protect,or surround with or as if with a net.
Sports To hit (a ball) into the net.
To make into a net.
Middle English
from Old English * see ned-
Abbr. n.Business
Remaining after all deductions have been made,as for expenses:
net profit.
Remaining after tare is deducted:
net weight.
the net result.
Abbr. n.Business A net amount,as of profit or weight.
T the essence:
the net of our discussion.
net.ted,net.ting,nets
To bring in or yield as profit.
To clear as profit.
Middle English [elegant,remaining after deductions]
from Old French [elegant]
and from Old Italian netto [remaining after deductions]
both from Latin nitidus [clean,elegant] * see neat 1
来自古英语nett. 印欧语系的词根ned-扭在一起
acquireearngaingetmeshobtainsecuresnaretrapwebgross
.百度知道.[引用日期]&img src=&/50/v2-bfa43856acfc_b.png& data-rawwidth=&1568& data-rawheight=&950& class=&origin_image zh-lightbox-thumb& width=&1568& data-original=&/50/v2-bfa43856acfc_r.png&&&blockquote&&h2&前言&/h2&&p&在《&a href=&/p/& class=&internal&&如何用几行代码打造应用程序热补丁?(一)&/a&》中,我们介绍了应用程序热补丁技术的基本原理,同时实现了一个简单的热补丁。但是无法对本地函数打热补丁,同时手动编写热补丁比较麻烦、可能非常复杂容易出错。&/p&&p&为了解决这些问题,本文将会介绍一种自动生成应用程序热补丁技术,可以生成应用程序和动态链接库中任意函数的热补丁。&/p&&/blockquote&&br&&h2&自动生成热补丁综述&/h2&&p&自动生成热补丁是利用热补丁生成工具,对现有的源代码和补丁文件进行处理,自动输出热补丁的技术。&/p&&p&我们知道,热补丁的基本原理是新函数替换旧函数,也就是完整的函数的替换。补丁中可能包含一个或多个函数的修改,这些被修改的函数都会被替换掉。上一篇文章介绍过,热补丁首先把新函数放入目标进程的内存中,然后修改旧函数的入口,使之跳转到新函数。&/p&&p&自动生成热补丁中最主要的部分是自动生成新函数的二进制代码,也称为是替换代码。在生成替换代码时,主要由以下部分组成:&/p&&blockquote&&ol&&li&自动生成替换代码。&br&&/li&&li&解析替换代码中使用的符号。&/li&&/ol&&/blockquote&&p&接下来会对以上部分进行详细的介绍。在介绍之前,必须假设系统环境是Linux X86/X86_64,应用程序是C语言编译链接的ELF格式可执行文件,并且拥有原始程序的源代码。&/p&&br&&br&&h2&前后代码比较生成替换代码&/h2&&p&&b&1. 动机与挑战&/b&&br&&/p&&p&为了生成替换代码,首先需要知道代码修复之后,哪些函数发生了改变,然后根据这些改变,生成替换代码。使用一种二进制比较的方法,通过比较原始程序的二进制和修复后程序的二进制,提取出生成替换代码所需的全部信息。&/p&&p&我们选择在目标文件(object file)的级别,进行前后比较。这样做的好处是显而易见的:&/p&&ul&&li&首先,任何源代码的改变都会在目标文件的二进制代码中显示出来。举个例子,头文件.h文件中函数的参数如果从int变成了long long,调用这个函数的.c文件由于隐含的类型转换,并不发生改变。如果在前后代码对比发生在源代码级别,甚至预处理之后,也不能发现前后.c文件发生了改变。&/li&&li&其次,我们不需要处理语言级别的特性,比如inline关键字、隐含类型转换、宏等等。这些语言相关的特性可能随着语言的发展会愈发复杂,并且我们也不希望热补丁局限于某种语言。C语言、C++、汇编都是我们希望可以处理的语言。&/li&&li&最后,我们只关心代码的二进制表达。在目标文件的级别,二进制代码和代码组成信息是最完整的,在此进行前后代码比较也是最合理的。&/li&&/ul&&br&&p&所以,生成替换代码的思路是,通过比较前后编译的目标文件,提取出差异部分,组成替换代码。&/p&&br&&p&比较目标文件也面临很多挑战,主要在于如何从提取出发生改变的函数。举个例子,由于目标文件中默认所有的函数代码都会放在.text段,同时.text段中的相对地址跳转都是相对于.text段的。也就是说,如果某个函数发生了改变,就算是一行代码的改变,后面的相对地址跳转也很可能会发生改变(由于符号位置发生了改变)。&/p&&br&&br&&p&&b&2. 解决办法&/b&&/p&&br&&p&我们对目标应用程序代码和修复后代码分别编译,逐一比较两次编译产生的若干个目标文件。如图所示: &/p&&img src=&/50/v2-bfa43856acfc_b.jpg& data-rawwidth=&1568& data-rawheight=&950& class=&origin_image zh-lightbox-thumb& width=&1568& data-original=&/50/v2-bfa43856acfc_r.jpg&&&ul&&li&首先,我们编译原始源代码,保留所有中间过程中产生的目标文件。&br&&/li&&li&然后,我们对原始源代码打上修复补丁,再次编译,构建系统(make)一般只会编译改变的源文件,保留新生成的目标文件。如果没有构建系统或者构建系统不如期工作,可以保留所有的目标文件。&br&&/li&&li&最后,我们比较新生成的目标文件和对应的原始代码编译出来的目标文件,提取出差异部分,组成替换代码,生成热补丁。&/li&&/ul&&br&在比较过程中,我们希望做到可以在函数级别上进行比较,这样可以只提取出发生改变的函数,并且我们也希望生成的替换代码是地址无关的,因为替换代码可能被加载到任意的内存地址。&br&&p&GCC编译器提供了-ffunciton-sections和-fdata-section的编译选项,作用是把函数和变量放入目标文件中独立的段(每个函数代码都由独立的段来表示)。这样编译出的函数代码都是地址无关的、更加通用的二进制,可以提取到替换代码中被加载到内存的任意位置运行。&/p&&br&&p&在对前后目标文件比较的时候,我们在ELF段的级别进行比较(也就是函数的级别,因为函数都在自己独立的段中)。因为目标文件是ELF文件,遵守通用的标准。我们可以解析目标文件的ELF Header,找到段的开头(Section Header),由此找到所有的段。这里我们建议使用一些ELF解析库,如libelf、libbfd等。&/p&&br&&p&逐一比较前后目标文件中的表示代码的段,段的内容就是函数的代码,找到发生改变的函数:&/p&&br&&ul&&li&首先,比较段的大小,如果大小不同,说明函数发生了改变。&br&&/li&&li&接着,对段的内容进行比较,如果某个字节不同,而且字节不属于重定向的一部分,说明函数发生了改变。如果是重定向,检查重定向计算之后的指令内容是否相同,如果不同,说明函数发生了改变(引用了与之前不同的函数或者变量)。&/li&&li&最后,如果段的大小和段的内容都没有改变,说明函数没有改变。&/li&&/ul&&br&&p&需要注意的是,如果补丁中修改的是宏或inline函数,我们无法做到只提取宏或者inline函数的差异,因为宏和inline函数会在编译过程中被放置在其调用函数中,所有调用函数都会改变,所以提取的是所有调用的函数。&/p&&p&此时的替换代码还不能直接运行,因为替换代码中还可能包含对其他符号的引用,我们需要在运行替换代码之前解析这些符号。&/p&&br&&br&&h2&替换代码中的符号解析&/h2&&p&&b&1. 动机与挑战&/b&&/p&&br&&p&我们的替换代码中只包含改变的函数代码,这些函数中可能会引用其他没有改变的符号(函数或变量),所以我们需要根据符号引用的规则(一般为相对PC地址的相对地址),对引用符号手动重定向。&/p&&br&&p&解析符号地址面临的挑战主要有两个:&/p&&br&&ul&&li&找到运行中的程序的符号所在的地址。&br&&/li&&li&如果存在两个或者以上相同名字的符号,找到正确符号。&br&&/li&&/ul&&br&&br&&p&&b&2. 解决方法&/b&&/p&&br&&p&符号的地址是在最终链接的时候决定的,如果可执行文件是pie(position independent executable)或者是动态链接库,符号的地址是一个相对地址,是相对于可执行文件或者动态链接库的代码段在内存中地址的偏移,计算公式Addr = Base + Offset。其他情况,符号的地址是一个绝对地址,无需计算。&/p&&br&&p&同样名称的符号在可执行文件中可能出现多次(例如两个文件中定义了名字相同的static变量),我们需要从中找到正确的符号。在链接之后,可执行文件中的符号表会遵守一些固定的规则,相同源文件中符号会一起连续地记录,并且在记录的开头会有类型为STT_FILE的符号,名字为源文件的名字。&/p&&br&&p&举个例子,我们在1.c和2.c中同时定义了static int a,最终可执行文件中的符号表如下所示:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# readelf -s exe
Symbol table '.symtab' contains 73 entries:
&/code&&/pre&&/div&&p&因此我们可以通过file+sym规则找到正确的符号位置。假设函数引用变量a,并且函数在2.c源文件中,我们首先找到类型为STT_FILE的2.c这个符号,然后找到符号a就可以了。&/p&&p&我们知道符号的地址后可以对替换代码中的引用进行手动重定向编写,将编译时符号引用的重定向转换为我们自己在运行时可以识别的重定向(self relocation)。&/p&&br&&ul&&li&首先,根据重定向类型和计算公式,计算出引用的符号,记录符号的信息,其中符号的地址在运行时可以得到。&br&&/li&&li&然后,记录原有的重定向信息,其中重定向的地址在运行时可以得到。&/li&&li&最后,在替换代码(热补丁)被加载到目标程序的内存中时,通过之前记录的重定向内容,修改替换代码符号引用位置的内容,内容由重定向的类型、重定向的地址、符号的地址计算得到。&/li&&/ul&&br&&br&举个例子,替换代码中包含函数x,函数x会在地址P引用正在运行的程序中的函数y。当替换代码被加载到程序的地址空间时,地址P可以被确定,函数y的符号地址S可以被确定,根据替换代码中记录的重定向信息(假设重定向类型是R_X86_64_PC32,Addend是A),那么地址P的内容需要被修改为S+A-P。这样当函数x执行时才能引用到函数y的位置。&br&&br&&h2&POC:生成替换代码、符号解析&/h2&&p&本章节利用objdump等工具,对生成替换代码中的关键步骤进行POC验证。&/p&&br&&p&假设我们有目标程序T(修复后名为T-patched),包含如下代码:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&void print(int i)
while (i) {
printf(&%d &, i--);
printf(&\n&);
void func()
&/code&&/pre&&/div&&p&patch文件如下:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&void func()
&/code&&/pre&&/div&&p&分别将源代码和修复后的源代码编译,生成T.o和T-patched.o。&/p&&br&&p&通过objdump我们可以发现func函数前后发生了改变,地址0x4的指令不同。(其他函数不变,省略)。如下所示:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# objdump -hdr -j .text.func T.o
Disassembly of section .text.func:
0000 &func&:
bf 04 00 00 00
e8 00 00 00 00
e &func+0xe&
a: R_X86_64_PLT32
&/code&&/pre&&/div&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# objdump -hdr -j .text.func T-patched.o
Disassembly of section .text.func:
0000 &func&:
bf 06 00 00 00
e8 00 00 00 00
e &func+0xe&
a: R_X86_64_PLT32
&/code&&/pre&&/div&&p&所以提取出T-patched.o中的.text.func段。这就完成了替换代码的提取。&/p&&br&&p&因为T-patched.o中的func函数在0xa的位置上引用了print函数,我们需要对print符号进行解析,在替换代码(热补丁)被加载到目标进程内存时,对0xa-0xd的四个字节重定向。&/p&&br&&p&我们记录下这个重定向,类型R_X86_64_PLT32,Addend -4,符号print。&/p&&br&&p&在替换代码被加载到目标进程中时,我们可以确定替换代码加载的地址。假设替换代码中func地址为0x7fa357ed79b0,原程序中print地址为0x7fa358a9979c。那么我们根据之前记录的重定向信息进行计算(V = S + A - P),将func偏移0xa的位置(4字节)写入0xbc1dde,计算方法如下:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&0x7fa358a9979c + (-4) - 0x7fa357ed79ba = 0xbc1dde
&/code&&/pre&&/div&&p&这样重定向之后,替换代码中的func函数就能正确引用到原程序中的print函数。&/p&&br&&p&最后,我们通过GDB观察T程序打入热补丁之后的行为:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&(gdb) disas func
Dump of assembler code for function func:
0x07d8 &+0&:
movabs $0x7fa357ed79b0,%rax
0x07e2 &+10&:
&/code&&/pre&&/div&&p&以上可以看出原程序的func函数会跳转到0x7fa357ed79b0执行。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&(gdb) disas 0x7fa357ed79b0
Dump of assembler code for function func:
0x0ed79b0 &+0&:
0x0ed79b1 &+1&:
0x0ed79b4 &+4&:
0x0ed79b9 &+9&:
0x7fa358a9979c &print&
0x0ed79be &+14&:
0x0ed79bf &+15&:
End of assembler dump.
&/code&&/pre&&/div&&p&以上可以看出0x7fa357ed79b0是热补丁中func函数的入口,也能看出0x0ed79b9地址的指令中引用了正确的print符号。&br&&/p&&br&&p&我们通过objdump、gdb验证了替换代码的静态和动态形式,展示了自动生成热补丁的具体细节,希望可以借此让读者对此有更清晰的理解。&/p&&br&&br&&h2& 其他注意事项&/h2&&p&这种前后目标文件比较生成替换代码的方法,要求我们必须拥有正在运行的目标程序的源代码。同时,在编译目标文件时强烈建议使用和目标程序相同版本的gcc和编译选项,使用不同的gcc和不同的选项可能会导致目标文件和原始程序的二进制不匹配,导致不能生成正确的替换代码。不正确的替换代码可能会导致符号解析错误,进而是程序崩溃,这里需要特别注意。&/p&&br&&br&&h2& 写在最后&/h2&&p&本文介绍了二进制比较方式的自动生成热补丁技术,相比于上一篇文章中介绍的简单热补丁技术,优势在于:&/p&&br&&ol&&li&通过工具自动生成热补丁,无需手动编写热补丁,减少了人为出错的可能。&br&&/li&&li&可以修复本地函数和全局函数,并且不需要引入函数的依赖链。&br&&/li&&li&兼容多种编译型语言(C语言、C++、汇编等,具体实现不同,但是思路一致)。&br&&/li&&/ol&&br&&p&使用这种热补丁生成技术,可以解决应用程序几乎所有的安全漏洞。例如最近出现的QEMU
CVE-(cirrus驱动内存越界访问),我们对有bug的函数都打上了热补丁,通过替换bug函数,实现了在线热修复。&/p&&br&&p&生成热补丁是应用程序热补丁技术框架中非常关键的一个组件,本文介绍了一种自动生成热补丁的技术,但是完整、成熟的热补丁框架还包含了其他技术,例如多线程、管理多个热补丁、多版本管理、热补丁与程序之间的一致性检查等等。接下来,在最后一篇文章中,我们会对这些问题进行解答,并介绍UCloud应用程序热补丁技术的完整框架,对框架中各个组件进行解析。&/p&&br&&br&&p&——————&br&&/p&&h2&相关阅读推荐:&/h2&&a href=&/p/& class=&internal&&如何用几行代码打造应用程序热补丁?(一)&/a&&br&&a href=&/p/& class=&internal&&机器学习进阶笔记之十 | 那些TensorFlow上好玩的黑科技&/a&&br&&a href=&/p/& class=&internal&&机器学习进阶笔记之九 | 利用TensorFlow搞定「倒字验证码」&/a&&br&&a href=&/p/& class=&internal&&机器学习进阶笔记之八 | TensorFlow与中文手写汉字识别&/a&&br&&br&&br&&p&&b&本文由『UCloud内核团队』提供。作者:王超&/b&&/p&&br&&br&&blockquote&&h2&福利时间&/h2&&p&如果你想亲自上手,在云上部署体验以上技术实践过程,大U为大家争取到了&b&100元 UCloud云服务代金券&/b&,够大家免费使用1个月的1核/2G/20G数据盘云主机。&/p&&p&立即 &a href=&/?target=https%3A///cas/register& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&注册UCloud&i class=&icon-external&&&/i&&/a&,在活动/邀请码一栏填入:&b&zhihu-ucloud&/b&,即可获得代金券。&/p&&p&有需求的同学快去领代金券吧,有问题请添加UCloud运营小妹个人微信号:Surdur进行咨询。&/p&&/blockquote&&br&&p&「UCloud机构号」将独家分享云计算领域的技术洞见、行业资讯以及一切你想知道的相关讯息。欢迎提问&求关注 o(*////▽////*)q~&br&&/p&&br&&p&以上。&/p&
前言在《》中,我们介绍了应用程序热补丁技术的基本原理,同时实现了一个简单的热补丁。但是无法对本地函数打热补丁,同时手动编写热补丁比较麻烦、可能非常复杂容易出错。为了解决这些问题,本文将会介绍一种自动…
&p&对于Spring Boot的Actuator模块相信大家已经不陌生了,尤其对于其中的/health、/metrics等强大端点已经不陌生(如您还不了解Actuator模块,建议先阅读&a href=&/?target=http%3A///spring-boot-actuator-1/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《Spring Boot Actuator监控端点小结》&i class=&icon-external&&&/i&&/a&)。但是,其中还有一个比较特殊的端点/info经常被大家所忽视,因为从最初的理解,它主要用来输出application.properties配置文件中通过info前缀来定义的一些属性,由于乍看之下可能想不到太多应用场景,只是被用来暴露一些应用的基本信息,而基本信息本身也可以在与Spring Cloud结合时作为服务治理的注册信息统一管理,所以这个端点的用处并不是很大。&/p&&p&然而实际上,该端点除了描述应用信息之外,也还可以用来描述Git版本信息,并且整合方法非常简单,下面我们就来看看如何使用/info端点暴露当前应用的Git版本信息。 &/p&&br&&h3&&b&POM配置&/b&&/h3&&p&首先,我们可以挑选任意一个Spring Boot项目,修改它的pom.xml:&/p&&ul&&li&引入spring-boot-starter-actuator,提供/info端点&/li&&/ul&&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&o&&&&/span&&span class=&n&&dependency&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&groupId&/span&&span class=&o&&&&/span&&span class=&n&&org&/span&&span class=&o&&.&/span&&span class=&na&&springframework&/span&&span class=&o&&.&/span&&span class=&na&&boot&/span&&span class=&o&&&/&/span&&span class=&n&&groupId&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&artifactId&/span&&span class=&o&&&&/span&&span class=&n&&spring&/span&&span class=&o&&-&/span&&span class=&n&&boot&/span&&span class=&o&&-&/span&&span class=&n&&starter&/span&&span class=&o&&-&/span&&span class=&n&&actuator&/span&&span class=&o&&&/&/span&&span class=&n&&artifactId&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&dependency&/span&&span class=&o&&&&/span&
&/code&&/pre&&/div&&ul&&li&添加git-commit-id-plugin插件,该插件用来产生git的版本信息&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&o&&&&/span&&span class=&n&&plugin&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&groupId&/span&&span class=&o&&&&/span&&span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&&/&/span&&span class=&n&&groupId&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&artifactId&/span&&span class=&o&&&&/span&&span class=&n&&git&/span&&span class=&o&&-&/span&&span class=&n&&commit&/span&&span class=&o&&-&/span&&span class=&n&&id&/span&&span class=&o&&-&/span&&span class=&n&&plugin&/span&&span class=&o&&&/&/span&&span class=&n&&artifactId&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&version&/span&&span class=&o&&&&/span&&span class=&mf&&2.1.15&/span&&span class=&o&&&/&/span&&span class=&n&&version&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&executions&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&execution&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&goals&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&goal&/span&&span class=&o&&&&/span&&span class=&n&&revision&/span&&span class=&o&&&/&/span&&span class=&n&&goal&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&goals&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&execution&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&executions&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&configuration&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&dotGitDirectory&/span&&span class=&o&&&&/span&&span class=&n&&$&/span&&span class=&o&&{&/span&&span class=&n&&project&/span&&span class=&o&&.&/span&&span class=&na&&basedir&/span&&span class=&o&&}/.&/span&&span class=&na&&git&/span&&span class=&o&&&/&/span&&span class=&n&&dotGitDirectory&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&configuration&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&plugin&/span&&span class=&o&&&&/span&
&/code&&/pre&&/div&&h3&&b&产生git版本信息&/b&&/h3&&ul&&li&在完成了上面的配置之后,执行git-commit-id-plugin插件&/li&&/ul&&br&&img src=&/v2-dcb24ead09fc_b.png& data-rawwidth=&586& data-rawheight=&366& class=&origin_image zh-lightbox-thumb& width=&586& data-original=&/v2-dcb24ead09fc_r.png&&&p&运行完成后,我们可以在控台中看到类似下面的信息:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&dotGitDirectory&/span& &span class=&n&&E&/span&&span class=&o&&:&/span&&span class=&err&&\&/span&&span class=&n&&git_project&/span&&span class=&err&&\&/span&&span class=&n&&oschina&/span&&span class=&err&&\&/span&&span class=&n&&SpringBoot&/span&&span class=&o&&-&/span&&span class=&n&&Learning&/span&&span class=&err&&\&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&build&/span&&span class=&o&&.&/span&&span class=&na&&user&/span&&span class=&o&&.&/span&&span class=&na&&name&/span& &span class=&n&&didi&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&build&/span&&span class=&o&&.&/span&&span class=&na&&user&/span&&span class=&o&&.&/span&&span class=&na&&email&/span& &span class=&n&&dyc87112&/span&&span class=&nd&&@qq.com&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&branch&/span& &span class=&n&&master&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&o&&--&/span&&span class=&n&&always&/span& &span class=&o&&=&/span& &span class=&kc&&true&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&o&&--&/span&&span class=&n&&dirty&/span& &span class=&o&&=&/span& &span class=&o&&-&/span&&span class=&n&&dirty&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&o&&--&/span&&span class=&n&&abbrev&/span& &span class=&o&&=&/span& &span class=&mi&&7&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&Tag&/span& &span class=&n&&refs&/span& &span class=&o&&[&/span& &span class=&o&&[&/span&&span class=&n&&Ref&/span&&span class=&o&&[&/span&&span class=&n&&refs&/span&&span class=&o&&/&/span&&span class=&n&&tags&/span&&span class=&o&&/&/span&&span class=&n&&chapter1&/span&&span class=&o&&=&/span&&span class=&n&&ecadea02c8ef0a112&/span&&span class=&o&&]]&/span& &span class=&o&&]&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&Created&/span& &span class=&n&&map&/span&&span class=&o&&:&/span& &span class=&o&&[&/span& &span class=&o&&{}&/span& &span class=&o&&]&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&HEAD&/span& &span class=&n&&is&/span& &span class=&o&&[&/span& &span class=&n&&ede9b5df75ec016fa5e5&/span& &span class=&o&&]&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&Repo&/span& &span class=&n&&is&/span& &span class=&n&&in&/span& &span class=&n&&dirty&/span& &span class=&n&&state&/span& &span class=&o&&[&/span& &span class=&kc&&true&/span& &span class=&o&&]&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&id&/span&&span class=&o&&.&/span&&span class=&na&&describe&/span& &span class=&n&&e0540b3&/span&&span class=&o&&-&/span&&span class=&n&&dirty&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&id&/span& &span class=&n&&ede9b5df75ec016fa5e5&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&id&/span&&span class=&o&&.&/span&&span class=&na&&abbrev&/span& &span class=&n&&e0540b3&/span&
&span class=&o&&[&/span&&span class=&n&&INFO&/span&&span class=&o&&]&/span& &span class=&n&&pl&/span&&span class=&o&&.&/span&&span class=&na&&project13&/span&&span class=&o&&.&/span&&span class=&na&&maven&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&.&/span&&span class=&na&&MavenLoggerBridge&/span& &span class=&o&&-&/span& &span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&dirty&/span& &span class=&kc&&true&/span&
&span class=&o&&...&/span&
&/code&&/pre&&/div&&p&同时,在target/classes目录下,我们可以发现产生了一个git.properties配置信息:&/p&&p&&img src=&/v2-99b0e70bb070a4ea4e32709eccdc54f4_b.png& data-rawwidth=&409& data-rawheight=&191& class=&content_image& width=&409&&这个文件就是当前项目的git信息,它的内容如下:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&err&&#&/span&&span class=&n&&Generated&/span& &span class=&n&&by&/span& &span class=&n&&Git&/span&&span class=&o&&-&/span&&span class=&n&&Commit&/span&&span class=&o&&-&/span&&span class=&n&&Id&/span&&span class=&o&&-&/span&&span class=&n&&Plugin&/span&
&span class=&err&&#&/span&&span class=&n&&Thu&/span& &span class=&n&&Jun&/span& &span class=&mo&&01&/span& &span class=&mi&&17&/span&&span class=&o&&:&/span&&span class=&mi&&57&/span&&span class=&o&&:&/span&&span class=&mi&&53&/span& &span class=&n&&CST&/span& &span class=&mi&&2017&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&build&/span&&span class=&o&&.&/span&&span class=&na&&user&/span&&span class=&o&&.&/span&&span class=&na&&email&/span&&span class=&o&&=&/span&&span class=&n&&dyc87112&/span&&span class=&nd&&@qq.com&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&build&/span&&span class=&o&&.&/span&&span class=&na&&host&/span&&span class=&o&&=&/span&&span class=&n&&Lenovo&/span&&span class=&o&&-&/span&&span class=&n&&zhaiyc&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&dirty&/span&&span class=&o&&=&/span&&span class=&kc&&true&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&remote&/span&&span class=&o&&.&/span&&span class=&na&&origin&/span&&span class=&o&&.&/span&&span class=&na&&url&/span&&span class=&o&&=&/span&&span class=&n&&https&/span&&span class=&err&&\&/span&&span class=&o&&:&/span&&span class=&c1&&//git.oschina.net/didispace/SpringBoot-Learning.git&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&closest&/span&&span class=&o&&.&/span&&span class=&na&&tag&/span&&span class=&o&&.&/span&&span class=&na&&name&/span&&span class=&o&&=&/span&&span class=&n&&chapter1&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&id&/span&&span class=&o&&.&/span&&span class=&na&&describe&/span&&span class=&o&&-&/span&&span class=&kt&&short&/span&&span class=&o&&=&/span&&span class=&n&&e0540b3&/span&&span class=&o&&-&/span&&span class=&n&&dirty&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&user&/span&&span class=&o&&.&/span&&span class=&na&&email&/span&&span class=&o&&=&/span&&span class=&n&&dyc87112&/span&&span class=&nd&&@qq.com&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&time&/span&&span class=&o&&=&/span&&span class=&mi&&2017&/span&&span class=&o&&-&/span&&span class=&mo&&06&/span&&span class=&o&&-&/span&&span class=&mo&&01&/span&&span class=&n&&T17&/span&&span class=&err&&\&/span&&span class=&o&&:&/span&&span class=&mi&&57&/span&&span class=&err&&\&/span&&span class=&o&&:&/span&&span class=&mi&&10&/span&&span class=&o&&+&/span&&span class=&mi&&0800&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&message&/span&&span class=&o&&.&/span&&span class=&na&&full&/span&&span class=&o&&=&/span&&span class=&n&&update&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&build&/span&&span class=&o&&.&/span&&span class=&na&&version&/span&&span class=&o&&=&/span&&span class=&mf&&1.0.0&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&message&/span&&span class=&o&&.&/span&&span class=&na&&short&/span&&span class=&o&&=&/span&&span class=&n&&update&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&id&/span&&span class=&o&&.&/span&&span class=&na&&abbrev&/span&&span class=&o&&=&/span&&span class=&n&&e0540b3&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&branch&/span&&span class=&o&&=&/span&&span class=&n&&master&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&build&/span&&span class=&o&&.&/span&&span class=&na&&user&/span&&span class=&o&&.&/span&&span class=&na&&name&/span&&span class=&o&&=&/span&&span class=&n&&didi&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&closest&/span&&span class=&o&&.&/span&&span class=&na&&tag&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&count&/span&&span class=&o&&=&/span&&span class=&mi&&240&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&id&/span&&span class=&o&&.&/span&&span class=&na&&describe&/span&&span class=&o&&=&/span&&span class=&n&&e0540b3&/span&&span class=&o&&-&/span&&span class=&n&&dirty&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&id&/span&&span class=&o&&=&/span&&span class=&n&&ede9b5df75ec016fa5e5&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&tags&/span&&span class=&o&&=&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&build&/span&&span class=&o&&.&/span&&span class=&na&&time&/span&&span class=&o&&=&/span&&span class=&mi&&2017&/span&&span class=&o&&-&/span&&span class=&mo&&06&/span&&span class=&o&&-&/span&&span class=&mo&&01&/span&&span class=&n&&T17&/span&&span class=&err&&\&/span&&span class=&o&&:&/span&&span class=&mi&&57&/span&&span class=&err&&\&/span&&span class=&o&&:&/span&&span class=&mi&&53&/span&&span class=&o&&+&/span&&span class=&mi&&0800&/span&
&span class=&n&&git&/span&&span class=&o&&.&/span&&span class=&na&&commit&/span&&span class=&o&&.&/span&&span class=&na&&user&/span&&span class=&o&&.&/span&&span class=&na&&name&/span&&span class=&o&&=&/span&&span class=&n&&didi&/span&
&/code&&/pre&&/div&&h3&&b&启动测试&/b&&/h3&&p&完成了上述配置之后,启动应用并访问端点,比如:curl localhost:8080/info,我们可以获得如下输出:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&o&&{&/span&
&span class=&s&&&git&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&commit&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&time&&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&o&&,&/span&
&span class=&s&&&id&&/span&&span class=&o&&:&/span& &span class=&s&&&e0540b3&&/span&
&span class=&o&&},&/span&
&span class=&s&&&branch&&/span&&span class=&o&&:&/span& &span class=&s&&&master&&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&其中包含了关于branch和commit的基础信息。而这个信息格式是最简模式,我们也可以通过配置下面的参数来获取更全面的git信息:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&management&/span&&span class=&o&&.&/span&&span class=&na&&info&/span&&span class=&o&&.&/span&&span class=&na&&git&/span&&span class=&o&&.&/span&&span class=&na&&mode&/span&&span class=&o&&=&/span&&span class=&n&&full&/span&
&/code&&/pre&&/div&&p&重启应用后再访问/info端点,可以获得类似下面更为详细的版本信息了。 &/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&o&&{&/span&
&span class=&s&&&git&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&build&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&host&&/span&&span class=&o&&:&/span& &span class=&s&&&Lenovo-zhaiyc&&/span&&span class=&o&&,&/span&
&span class=&s&&&version&&/span&&span class=&o&&:&/span& &span class=&s&&&1.0.0&&/span&&span class=&o&&,&/span&
&span class=&s&&&time&&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&o&&,&/span&
&span class=&s&&&user&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&name&&/span&&span class=&o&&:&/span& &span class=&s&&&didi&&/span&&span class=&o&&,&/span&
&span class=&s&&&email&&/span&&span class=&o&&:&/span& &span class=&s&&&&&/span&
&span class=&o&&}&/span&
&span class=&o&&},&/span&
&span class=&s&&&branch&&/span&&span class=&o&&:&/span& &span class=&s&&&master&&/span&&span class=&o&&,&/span&
&span class=&s&&&commit&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&message&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&short&&/span&&span class=&o&&:&/span& &span class=&s&&&update&&/span&&span class=&o&&,&/span&
&span class=&s&&&full&&/span&&span class=&o&&:&/span& &span class=&s&&&update&&/span&
&span class=&o&&},&/span&
&span class=&s&&&id&&/span&&span class=&o&&:&/span& &span class=&s&&&ede9b5df75ec016fa5e5&&/span&&span class=&o&&,&/span&
&span class=&s&&&id.describe-short&&/span&&span class=&o&&:&/span& &span class=&s&&&e0540b3-dirty&&/span&&span class=&o&&,&/span&
&span class=&s&&&id.abbrev&&/span&&span class=&o&&:&/span& &span class=&s&&&e0540b3&&/span&&span class=&o&&,&/span&
&span class=&s&&&id.describe&&/span&&span class=&o&&:&/span& &span class=&s&&&e0540b3-dirty&&/span&&span class=&o&&,&/span&
&span class=&s&&&time&&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&o&&,&/span&
&span class=&s&&&user&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&email&&/span&&span class=&o&&:&/span& &span class=&s&&&&&/span&&span class=&o&&,&/span&
&span class=&s&&&name&&/span&&span class=&o&&:&/span& &span class=&s&&&didi&&/span&
&span class=&o&&}&/span&
&span class=&o&&},&/span&
&span class=&s&&&closest&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&tag&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&name&&/span&&span class=&o&&:&/span& &span class=&s&&&chapter1&&/span&&span class=&o&&,&/span&
&span class=&s&&&commit&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&count&&/span&&span class=&o&&:&/span& &span class=&s&&&240&&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&span class=&o&&},&/span&
&span class=&s&&&dirty&&/span&&span class=&o&&:&/span& &span class=&s&&&true&&/span&&span class=&o&&,&/span&
&span class=&s&&&remote&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&origin&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&url&&/span&&span class=&o&&:&/span& &span class=&s&&&https://git.oschina.net/didispace/SpringBoot-Learning.git&&/span&
&span class=&o&&}&/span&
&span class=&o&&},&/span&
&span class=&s&&&tags&&/span&&span class=&o&&:&/span& &span class=&s&&&&&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&br&&p&&strong&代码示例:Chapter6-2-1&/strong&&/p&&ul&&li&Github:&a href=&/?target=https%3A///dyc87112& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&dyc87112 (程序猿DD-翟永超)&i class=&icon-external&&&/i&&/a&&/li&&li&码云:&a href=&/?target=http%3A//git.oschina.net/didispace/SpringBoot-Learning& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&didispace/SpringBoot-Learning - 码云 - 开源中国&i class=&icon-external&&&/i&&/a&&/li&&/ul&&br&&br&&br&&a href=&/?target=http%3A///spring-for-all-goodluck/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Spring4All (Spring纯技术交流社区)&i class=&icon-external&&&/i&&/a&&br&&p&&br&&br&&br&&br&&/p&
对于Spring Boot的Actuator模块相信大家已经不陌生了,尤其对于其中的/health、/metrics等强大端点已经不陌生(如您还不了解Actuator模块,建议先阅读)。但是,其中还有一个比较特殊的端点/info经常被大家所忽视,因…
&p&&strong&运行环境&/strong&:JDK 7 或 8,Maven 3.0+&br&&strong&技术栈&/strong&:SpringBoot 1.5+,ElasticSearch 2.3.2&/p&&p&&strong&本文提纲&/strong&&br&一、ES 的使用场景&br&二、运行 springboot-elasticsearch 工程&br&三、springboot-elasticsearch 工程代码详解&/p&&br&&h3&&b&一、ES 的使用场景&/b&&/h3&&p&简单说,ElasticSearch(简称 ES)是搜索引擎,是结构化数据的分布式搜索引擎。在《&a href=&/?target=http%3A///%3Fp%3D1744& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Elasticsearch 和插件 elasticsearch-head 安装详解&i class=&icon-external&&&/i&&/a&》
和 《&a href=&/?target=http%3A///%3Fp%3D1798& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Elasticsearch 默认配置 IK 及 Java AnalyzeRequestBuilder 使用&i class=&icon-external&&&/i&&/a&》 我详细的介绍了如何安装,初步使用了 IK 分词器。这里,我主要讲下 SpringBoot 工程中如何使用 ElasticSearch。&/p&&p&ES 的使用场景大致分为两块&br&1. 全文检索。加上分词(IK 是其中一个)、拼音插件等可以成为强大的全文搜索引擎。&br&2. 日志统计分析。可以实时动态分析海量日志数据。&/p&&h3&&b&二、运行 springboot-elasticsearch 工程&/b&&/h3&&p&注意的是这里使用的是 ElasticSearch 2.3.2。是因为&a href=&/?target=https%3A///spring-projects/spring-data-elasticsearch/wiki/Spring-Data-Elasticsearch---Spring-Boot---version-matrix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&版本对应关系&i class=&icon-external&&&/i&&/a& : &br&&/p&&br&&h3&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&Spring&/span& &span class=&n&&Boot&/span& &span class=&nf&&Version&/span& &span class=&o&&(&/span&&span class=&n&&x&/span&&span class=&o&&)&/span& &span class=&n&&Spring&/span& &span class=&n&&Data&/span& &span class=&n&&Elasticsearch&/span& &span class=&nf&&Version&/span& &span class=&o&&(&/span&&span class=&n&&y&/span&&span class=&o&&)&/span& &span class=&n&&Elasticsearch&/span& &span class=&nf&&Version&/span& &span class=&o&&(&/span&&span class=&n&&z&/span&&span class=&o&&)&/span&
&span class=&n&&x&/span& &span class=&o&&&=&/span& &span class=&mf&&1.3.5&/span& &span class=&n&&y&/span& &span class=&o&&&=&/span& &span class=&mf&&1.3.4&/span& &span class=&n&&z&/span& &span class=&o&&&=&/span& &span class=&mf&&1.7.2&/span&&span class=&o&&*&/span& &span class=&n&&x&/span& &span class=&o&&&=&/span& &span class=&mf&&1.4&/span&&span class=&o&&.&/span&&span class=&na&&x&/span& &span class=&mf&&2.0.0&/span& &span class=&o&&&=&/span&&span class=&n&&y&/span& &span class=&o&&&&/span& &span class=&mf&&5.0.0&/span&&span class=&o&&**&/span& &span class=&mf&&2.0.0&/span& &span class=&o&&&=&/span& &span class=&n&&z&/span& &span class=&o&&&&/span& &span class=&mf&&5.0.0&/span&&span class=&o&&**&/span&
&span class=&o&&*&/span& &span class=&o&&-&/span& &span class=&n&&只需要你修改下对应的&/span& &span class=&n&&pom&/span& &span class=&n&&文件版本号&/span&
&span class=&o&&**&/span& &span class=&o&&-&/span& &span class=&n&&下一个&/span& &span class=&n&&ES&/span& &span class=&n&&的版本会有重大的更新&/span&
&/code&&/pre&&/div&&/h3&&p&git clone 下载工程 springboot-elasticsearch ,项目地址见 GitHub – &a href=&/?target=https%3A///JeffLi1993/springboot-learning-example& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JeffLi1993/springboot-learning-example&i class=&icon-external&&&/i&&/a&。&/p&&p&1. 后台起守护线程启动 Elasticsearch &/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&cd&/span& &span class=&n&&elasticsearch&/span&&span class=&o&&-&/span&&span class=&mf&&2.3.2&/span&&span class=&o&&/&/span&
&span class=&o&&./&/span&&span class=&n&&bin&/span&&span class=&o&&/&/span&&span class=&n&&elasticsearch&/span& &span class=&o&&-&/span&&span class=&n&&d&/span&
&/code&&/pre&&/div&&p&下面开始运行工程步骤(Quick Start):&/p&&p&2. 项目结构介绍&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&org&/span&&span class=&o&&.&/span&&span class=&na&&spring&/span&&span class=&o&&.&/span&&span class=&na&&springboot&/span&&span class=&o&&.&/span&&span class=&na&&controller&/span& &span class=&o&&-&/span& &span class=&n&&Controller&/span& &span class=&n&&层&/span&
&span class=&n&&org&/span&&span class=&o&&.&/span&&span class=&na&&spring&/span&&span class=&o&&.&/span&&span class=&na&&springboot&/span&&span class=&o&&.&/span&&span class=&na&&repository&/span& &span class=&o&&-&/span& &span class=&n&&ES&/span& &span class=&n&&数据操作层&/span&
&span class=&n&&org&/span&&span class=&o&&.&/span&&span class=&na&&spring&/span&&span class=&o&&.&/span&&span class=&na&&springboot&/span&&span class=&o&&.&/span&&span class=&na&&domain&/span& &span class=&o&&-&/span& &span class=&n&&实体类&/span&
&span class=&n&&org&/span&&span class=&o&&.&/span&&span class=&na&&spring&/span&&span class=&o&&.&/span&&span class=&na&&springboot&/span&&span class=&o&&.&/span&&span class=&na&&service&/span& &span class=&o&&-&/span& &span class=&n&&ES&/span& &span class=&n&&业务逻辑层&/span&
&span class=&n&&Application&/span& &span class=&o&&-&/span& &span class=&n&&应用启动类&/span&
&span class=&n&&application&/span&&span class=&o&&.&/span&&span class=&na&&properties&/span& &span class=&o&&-&/span& &span class=&n&&应用配置文件&/span&&span class=&err&&,&/span&&span class=&n&&应用启动会自动读取配置&/span&
&/code&&/pre&&/div&&p&本地启动的 ES ,就不需要改配置文件了。如果连测试 ES 服务地址,需要修改相应配置&/p&&p&3.编译工程&br&在项目根目录 springboot-elasticsearch,运行 maven 指令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&mvn clean install
&/code&&/pre&&/div&&p&&br&4.运行工程&br&右键运行 Application 应用启动类(位置:/springboot-learning-example/springboot-elasticsearch/src/main/java/org/spring/springboot/Application.java)的 main 函数,这样就成功启动了 springboot-elasticsearch 案例。&/p&&p&用 Postman 工具新增两个城市&br&新增城市信息 &/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&POST&/span& &span class=&n&&http&/span&&span class=&o&&:&/span&&span class=&c1&&//127.0.0.1:8080/api/city&/span&
&span class=&o&&{&/span&
&span class=&s&&&id&&/span&&span class=&o&&:&/span&&span class=&s&&&1&&/span&&span class=&o&&,&/span&
&span class=&s&&&provinceid&&/span&&span class=&o&&:&/span&&span class=&s&&&1&&/span&&span class=&o&&,&/span&
&span class=&s&&&cityname&&/span&&span class=&o&&:&/span&&span class=&s&&&温岭&&/span&&span class=&o&&,&/span&
&span class=&s&&&description&&/span&&span class=&o&&:&/span&&span class=&s&&&温岭是个好城市&&/span&
&span class=&o&&}&/span&
&span class=&n&&POST&/span& &span class=&n&&http&/span&&span class=&o&&:&/span&&span class=&c1&&//127.0.0.1:8080/api/city&/span&
&span class=&o&&{&/span&
&span class=&s&&&id&&/span&&span class=&o&&:&/span&&span class=&s&&&2&&/span&&span class=&o&&,&/span&
&span class=&s&&&provinceid&&/span&&span class=&o&&:&/span&&span class=&s&&&2&&/span&&span class=&o&&,&/span&
&span class=&s&&&cityname&&/span&&span class=&o&&:&/span&&span class=&s&&&温州&&/span&&span class=&o&&,&/span&
&span class=&s&&&description&&/span&&span class=&o&&:&/span&&span class=&s&&&温州是个热城市&&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&&br&可以打开 ES 可视化工具 head 插件:&a href=&/?target=http%3A//localhost%3A9200/_plugin/head/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&localhost:9200/_plugin/&/span&&span class=&invisible&&head/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&:(&br& 如果不知道怎么安装,请查阅 《&a href=&/?target=http%3A///%3Fp%3D1744& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Elasticsearch 和插件 elasticsearch-head 安装详解&i class=&icon-external&&&/i&&/a&》&br&在「数据浏览」tab,可以查阅到 ES 中数据是否被插入,插入后的数据格式如下:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&o&&{&/span&
&span class=&s&&&_index&&/span&&span class=&o&&:&/span& &span class=&s&&&cityindex&&/span&&span class=&o&&,&/span&
&span class=&s&&&_type&&/span&&span class=&o&&:&/span& &span class=&s&&&city&&/span&&span class=&o&&,&/span&
&span class=&s&&&_id&&/span&&span class=&o&&:&/span& &span class=&s&&&1&&/span&&span class=&o&&,&/span&
&span class=&s&&&_version&&/span&&span class=&o&&:&/span& &span class=&mi&&1&/span&&span class=&o&&,&/span&
&span class=&s&&&_score&&/span&&span class=&o&&:&/span& &span class=&mi&&1&/span&&span class=&o&&,&/span&
&span class=&s&&&_source&&/span&&span class=&o&&:&/span& &span class=&o&&{&/span&
&span class=&s&&&id&&/span&&span class=&o&&:&/span& &span class=&mi&&1&/span&&span class=&o&&,&/span&
&span class=&s&&&provinceid&&/span&&span class=&o&&:&/span& &span class=&mi&&1&/span&&span class=&o&&,&/span&
&span class=&s&&&cityname&&/span&&span class=&o&&:&/span& &span class=&s&&&温岭&&/span&&span class=&o&&,&/span&
&span class=&s&&&description&&/span&&span class=&o&&:&/span& &span class=&s&&&温岭是个好城市&&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&下面验证下权重分查询搜索接口的实现:&br&GET &a href=&/?target=http%3A//localhost%3A8080/api/city/search%3FpageNumber%3D0%26pageSize%3D10%26searchContent%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&localhost:8080/api/city&/span&&span class=&invisible&&/search?pageNumber=0&pageSize=10&searchContent=&/span&&span class

我要回帖

更多关于 sendcommandfeedback 的文章

 

随机推荐