Solr服务在Linux上的搭建详细教程

函数式编程与面向对象编程[5]:编程的真面目


之剑 2016.5.6 01:26:31

<div id=”category”></div>


一、系统环境

注:欢迎大家转发,非商业用途请在肯定地点注明本文链接和小编名dijia478即可,商业用途请联系自己dijia478@163.com。

CentOS-6.7-i386-bin-DVD1

jdk-8u151-linux-i586

apache-tomcat-8.5.24.tar

solr-7.1.0

注意:solr6.0以上,官方建议使用jdk8,tomcat8。和solr4安顿流程有略微差距

编程的龙虎山真面目

读到两篇小说,写的不错, 综合摘录一下

二、搭建步骤

复合是编程的原形

函数式程序员在寓目难题方面会依照一个稀奇古怪的路线。他们率先会问一些似有玄机的难题。例如,在设计一个交互式程序时,他们会问:什么是互相?在完结基于元胞自动机的人命游戏时,他们唯恐又去思考生命的意义。秉持那种精神,小编快要问:什么是编程?在最主旨的规模,编程就是告诉总结机去做怎么着,例如『从
内存地址 x 处获取内容,然后将它与寄存器 EAX
中的内容相加』。然则固然大家选取汇编语言去编程,我们向电脑提供的下令也是某种有意义的表达式。如若我们正在解一个难点(即使它简单,就没须要用统计机了),那么大家是如何求解难点的?我们把大标题解释为更小的标题。尽管更小的难题要么仍旧很大,大家再持续展开表明,以此类推。最终,大家写出求解那么些小意思的代码,然后就应运而生了编程的真面目:作者么将那个代码片段复合起来,从而爆发大标题标解。固然大家不或然将代码片段整合起来并复苏回去,那么难点的演讲就
毫无意义。

先是步:上传并解压solr

澳门美高梅手机网站 1

层次化分解与重新复合的长河

以此思维进程,
并非是受总计机的范围而暴发,它反映的是全人类思想的局限性。我们的大脑五遍只好处理很少的概念。生物学中被广为引用的
一篇诗歌提议我们大家的大脑中不得不保留 7± 2
个消息块。大家对人类长时间记念的认识或许会有转变,不过足以一定的是它是个其余。底线就是大家不只怕处理一大堆乱糟糟的对象或像中山臊子面似的代码。大家须要结构化并非是因为结构化的主次看上去有多么美好,而是大家的大脑不只怕有效的拍卖非结构化的东西。大家平常说有的代码片段是优雅的或美观的,实际上那只意味
着它们更便于被人类有限的牵挂所拍卖。优雅的代码创设出规则合理的代码块,它恰恰与我们的『心智消化道』能够接受的数据相符。

那么,对于程序的复合而言,正确的代码块是什么样的?它们的表面积必要求比它们的体积拉长的一发缓慢。作者喜爱这么些比喻,因为几何对象的表面积是以尺寸
的平方的速度增加的,而体积是以尺寸的立方的快慢进步的,由此表面积的增进速度小于体积。代码块的表面积是是大家复合代码块时所要求的音讯。代码块的体积
是我们为了完结它们所需求的音讯。一旦代码块的达成进度截止,大家就足以淡忘它的兑现细节,只关切它与此外代码块的相互影响。在面向对象编程中,类或接口
的声明就是表面。在函数式编程中,函数的宣示就是外表。小编把作业简化了有些,可是要点就是这一个。

第二步:上传并解压tomcat,复制一份出来

自作者那里早已解压过了

澳门美高梅手机网站 2

自个儿先切换下root用户啊,然后创立solr目录,将tomcat复制重命名到/usr/local/solr/tomcat

澳门美高梅手机网站 3

范畴论

在主动阻碍大家看看对象的中间方面,范畴论具有不凡的意思。范畴论中的一个目的,像一个星云。对于它,你所知的只是它与任何对象时期的涉及,亦即它
与其余对象相连接的箭头。那就是 Internet
搜索引擎对网站开展名次时所用的方针,它只分析输入与输出的链接(除非它受欺骗)。在面向对象编程中,一个良好的对象应该是只揭露它的抽象接口(纯外部,
无体积),其格局则扮演箭头的剧中人物。即使为了精晓一个目标怎么着与此外对象举办复合,当你发现只好深入挖潜对象的落到实处之时,此时你所用的编程范式的本来优
势就消失了。

让大家暂时撇开平台、框架、技术、设计方式、对象考虑、敏捷开发论等。
追问程序本质。

第三步:把solr部署到tomcat下

专注,那里因为本身用的是solr7.1最新版,所以跟网上广大solr4的版本要拷贝*.war文件,然后再起步tomcat解压的操作是不一样的。(那里直接就是解压好的)

复制一视同仁命名solr目录里的server/solr-webapp/webapp文件夹到/usr/local/solr/tomcat/webapps/solr

澳门美高梅手机网站 4

布尔代数的逻辑种类

布尔代数源点于数学领域,是一个用以集合运算和逻辑运算的公式:〈B,∨,∧,¬
〉。其中B为一个非空集合,∨,∧为定义在B上的多个二元运算,¬为定义在B上的一个一元运算。

经过布尔代数进行联谊运算可以收获到差异集合之间的交集、并集或补集,进行逻辑运算可以对不同集合进行与、或、非。

在布尔代数上的运算被叫做AND(与)、OR(或)和NOT(非)。代数结构假使布尔代数,那么些运算的行事就必须和两成分的布尔代数一样(那多少个因素是TRUE(真)和FALSE(假))。亦称逻辑代数.布尔(Boole,G.)为研究考虑规律(逻辑学)于1847年提议的数学工具.布尔代数是指代数系统B=〈B,+,·,′〉

它涵盖集合B连同在其上定义的多个二元运算+,·和一个一元运算′,布尔代数具有下列性质:对B中任意成分a,b,c,有:

1.a+b=b+a, a·b=b·a.

2.a·(b+c)=a·b+a·c,

a+(b·c)=(a+b)·(a+c).

3.a+0=a,  a·1=a.

4.a+a′=1, a·a′=0.

第四步:把server/lib/目录下的一些jar包,添加到刚刚布局的solr工程中。

server/lib/ext/下的具有jar复制到 /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/下,都是些日志相关的jar包

澳门美高梅手机网站 5

server/lib/metrics*
开头的5个jar复制到 /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/下(solr4安顿没有这些)

澳门美高梅手机网站 6

公理化

在 1933 年,美利哥化学家 爱德华 Vermilye Huntington (1874-1952)
展现了对布尔代数的如下公理化:

交换律: x + y = y + x。

结合律: (x + y) + z = x + (y + z)。

Huntington等式: n(n(x) + y) + n(n(x) + n(y)) = x。

一元函数符号 n 可以读做’补’。

赫伯特 Robbins 接着摆出下列难题:
Huntington等式能或不能缩小为下述的等式,并且那几个新等式与结合律和互换律一起成为布尔代数的基本功?
通过一组叫做 罗宾斯 代数的公理,难点就成为了: 是还是不是拥有的 罗宾斯代数都是布尔代数?

罗宾斯 代数的公理化:

交换律: x + y = y + x

结合律: (x + y) + z = x + (y + z)

Robbins等式: n(n(x + y') + n(x + n(y))) = x

以此难点自从 1930 时期平素是公开的,并改为 艾尔Fred Tarski
和他的学生最喜好的标题。

在 1996 年,William McCune 在 Argonne 江山实验室,建造在 LarryWos、Steve Winker 和 Bob Veroff
的办事之上,肯定的答疑了这几个长时间存在的标题: 所有的 罗宾斯代数都以布尔代数。那项工作是使用 McCune 的机关推理程序 EQP 已毕的。

第五步:把server/resources/目录下的log4j.properties,添加到刚刚布局的solr工程中

在意要开创一个classes的目录(solr4陈设没有第五步)

澳门美高梅手机网站 7

电脑程序的精神

从实质上的话, 程序就是一多重有序实施的下令集合。
怎样将下令集合协会成可看重可用可相信的软件(美妙的逻辑之塔),
那是个难点。

程序 = 逻辑 + 控制。 what to do + when to do.

从编程角度来说, 开发者应对的就是逻辑, 逻辑的公布、协会和保安。
逻辑是东西自此及彼的契合事物发展规律的队列。指令是逻辑的有血有肉落到实处方式。

逻辑创设的先决条件是切合事物发展规律。 程序只可以处理数值,
却传来了字符串, 就只可以报错而望洋兴叹继续; 当处理海量数据时, 若内存不足,
就会招致程序崩溃; 若程序存在内存走漏, 随着岁月的推移而耗尽内存,
也会导致程序崩溃。 多个线程同时修改一个共享变量, 若不加控制,
就会因为不相同线程执行修改变量的时序的不确定导致该变量最后值的不确定。
那一个就是程序执行的前进规律。 要编写程序, 必定要先通悉这个原理。

规律的表现格局是:纵然条件 (C1, C2, …, Cn) 是发生结果 (R1, R2, … ,
Rn) 的放量要求条件, 那么当 C1, C2, …, Cn 任一不满意条件时,
都不容许暴发结果 (R1, R2, …, Rn) ; 反之, 若结果 (R1, R2, …, Rn)
没有出现, 则必定是 C1, C2, …, Cn 某一口径不满意导致。 错误和非凡即是
C1, C2, …, Cn 任一不满足条件的表现。规律的特性是早晚的,
不设有或许之说;
只设有人们探索的是或不是丰盛精确。编程开发首先应当知道程序执行的规律,
然后才是实在的费用; 否则就会被先后的结果折腾得死去活来。

在通悉程序执行规律之后, 程序须要消除如下难点:

  • 要发挥什么逻辑
  • 何以发挥该逻辑;
  • 什么样敬重该逻辑。

软件的复杂性表未来怎么表明和珍惜交互复杂的重型逻辑上

临时先回到软件的源点, 回想一下那总体是怎么暴发的。

先前时代, 人们选取物理的或逻辑的二进制机器指令来编写程序,
尝试着表明思想中的逻辑, 控制硬件计算和突显, 发现是一蹴而就的;

随后, 创建了助记符 —— 汇编语言, 比机器指令更便于记念;

再跟着, 创立了编译器、解释器和计算机高级语言,
可以以人类本人自然的点子去编写程序, 在捐躯少量属性的情景下,
拿到比汇编语言更强且更便于选用的语句控制能力:条件、分支、循环,
以及越来越多的言语特色: 指针、结构体、联合体、枚举等, 还创制了函数,
可以将一多重指令封装成一个独自的逻辑块反复使用;

逐渐地,发生了面向进程的编程方法;

新生, 人们发现将数据和逻辑封装成对象, 更近乎于现实世界,
且更便于保险大型软件, 又并发了面向对象的编程语言和编程方历史学,
扩大了新的言语特色: 继承、 多态、 模板、 格外错误。

为了不用再一次开销常见工具和义务, 人们创设和包裹了容器及算法、SDK,
垃圾回收器, 甚至是并发库;

为了让电脑语言更强劲更有功用地发挥各样实际逻辑,
消解软件开发中相见的争辨, 还在言语中援助了元编程、 高阶函数, 闭包
等有用特色。

为了更高功用地付出可信的软件和应用程序, 人们渐次营造了代码编辑器、
IDE、 代码版本管理工具、公共库、应用框架、
可复用组件、系统标准、互连网协议、 语言标准等,
针对遇到的标题提议了好多两样的笔触和缓解方案,
并统计提炼成特定的技能和设计情势, 还追究和变异了无数软件开发进程,
用来确保最终揭露的软件质量。 即便编制的那些软件和工具还存在重重 BUG
,可是它们都“奇迹般地存活”, 并共同创设了今天蔚为壮观的软件世界。

别的, 软件还经历了“单机程序 => 多机程序 => 分布式程序” 的长河 ,
多机联网程序因为五个子系统的互相变得更为错综复杂。 那里不再赘言。

但请小心, 无论软件发展到何等繁杂的档次, 总有一群人,
在试图从程序的真相中探索软件开发的核心难题,
他们试图论证和保管程序的不易、提炼软件的主干品质并开展衡量;
程序的正确性本质是逻辑学来确保的。 没有逻辑学, 程序根本就不可以立足,
更不能够有前日的常见使用。

软件开发工具让大家更有功效地开创逻辑、 远离语法错误的麻烦;

公共库将常用的通用逻辑块封装成可反复使用的零部件, 幸免不要求的重复劳动;

设计方式呈现的是哪些可伸张地解决周边的逻辑交互难点;

利用框架消除的是应用的通用逻辑流的支配的题材,让开发者越多地聚焦具体作业逻辑上;

开发技术是在实际的行使情境下遵从既定总体思路去追究现实难题解决的措施。

第六步:成立一个solrhome

将servier/solr目录复制到以前创设的solr目录下,重命名为solrhome,以后/usr/local/solr目录下就有多个文件夹了

澳门美高梅手机网站 8

发挥和维护大型逻辑

大家要缓解的是更通用的难题:
怎么样以更不错出错的不二法门去表述和保证大型逻辑 ?

发挥和掩护大型逻辑的极限门槛就是:
将大型逻辑切分为便于消化的一小块一小块, “不急不忙地吃掉”。

在该形式的履行中,
可以丰富利用现有的开发工具、公共库、设计方式、应用框架、开发技术。

第七步:关联solr及solrhome

亟需修改tomcat里solr工程的web.xml文件

澳门美高梅手机网站 9

找到那个,是被诠释的,须要修改value那项

澳门美高梅手机网站 10

开辟注释,修改为地方自身创制的solrhome目录

澳门美高梅手机网站 11

下一场到最下方,将这一段注释掉,不然会报403不当,已毕后保存退出(solr4布置不用注释那些)

澳门美高梅手机网站 12

独立无交互的特大型逻辑或接口已毕

独立无交互的逻辑平常呈现为公共库, 可以化解常用或公共的平日职分,
对任何逻辑无其他借助和互相, 即自足逻辑。

应对单身无交互的巨型逻辑的主要性措施是演讲为多少的简单完成、测试和复用的小块逻辑,
编写和严俊测试。

扶助是行使成熟的编程形式去表述逻辑, 尽或许复用经过严厉测试的可靠的库。

独立无交互的特大型逻辑通过客观的逻辑块切分、严谨的单元测试能够赢得丰富的测试和可信度。

第八步:启动tomcat

澳门美高梅手机网站 13

去自身的微处理器上访问下服务器的solr服务

在意下访问地址,直接访问192.168.25.128:8080/solr会报404,需要在后头加上/index.xml

若果出现上边的页面,就是solr服务搭建ok了

澳门美高梅手机网站 14

如若要关张solr服务,直接关门tomcat就足以了

澳门美高梅手机网站 15

单身无交互的耗时长的逻辑或接口落成

赶快响应的题材: “用户必要等待时间短” 与 “请求处理耗时长”
之间的争论导致的。

消除独自无交互的耗时长的逻辑照旧得以动用切分逻辑块、严谨的单元测试的做法使之更便于处理;

其余, 有两种设计思路可以设想: 并发 与 异步。

  • 并发思路是将切分的相互独立的逻辑块分配给不同的支配线程中施行,
    从而下跌请求处理时长;
    并发方案拿到的习性升高取决于串行操作在总操作中的时间占比。

  • 异步思路是“先响应, 后拍卖, 终布告” 的”先奏后斩”方案。

将一步分离成了三步, 为了让用户率先拿到先河的答应, 再去实践承诺。
那样做能让用户暂时地放心, 却充实了新的题目:
音信中间件组件的支出与配置、异步消息发送与吸收、编程模型的扭转和适应。借使全勤经过运作出色,
将会达到很好的体会,简单为用户接受。借使内部一步暴发偏向,
就会促成种种题材, 比如数据不均等, 音讯堆积、
请求不能够被拍卖。最后用户等待时间并从未下降, 反而使体验越来越糟糕。 当然,
如若成功率为 95%, 也是“可以接受”的, 那样用户大概会怪本人“运气不太好”,
而不会过多怪责连串的不健全。终究没有其余业务能够成功完美的程度。

出现与异步方案的调剂难度和排查问题都比同步方案平添很多。
每一个新的设计方案都会有其亮点, 同时也会有其症结。 权衡优缺点,
择善而从之 。值得注意的是, 并发方案是本着服务端实际处理请求逻辑而言,
而异步方案是针对性请求处理此前是或不是及时过来的办法。 并发与各种、
异步与一头两两结合, 可取得多种办法:

三、关于集群搭建

这篇只是单机solr服务的搭建进度,尽管急需搭建solr集群,请参考小编的这两篇文章:

逐一同步: 最初的编程模型

  • 可取是几乎、安全、 不难保险和调试;
  • 症结是性质较低, 响应时间和吞吐量都不高; 若请求处理时长不短,
    采纳顺序同步的方案佳;

Solr集群搭建详细教程(一)

出现同步: 立异的编程模型

  • 亮点是经过并发升高服务端的处理速度和吞吐量, 但若请求处理耗时较长,
    响应时间依旧不高, 影响客户端体验;
  • 若通过并发方案处理请求的时长不长, 或客户端体验须要不高,
    可以运用并发同步的方案;

Solr集群搭建详细教程(二)

 

逐条异步: 改革客户端体验的编程模型

  • 亮点是提升了响应时间和客户端体验, 由于其论理处理仍旧使用顺序格局,
    请求处理时长并未有立异, 因而吞吐量并从未改正。
    是一种较好的折衷方案;
  • 若请求处理耗时较长, 影响客户端体验, 且请求处理逻辑复杂,
    采取并发方案简单出错或难以产出, 可拔取顺序异步方案;

出现异步: 同时改善客户端体验和服务端处理速度

  • 可取是拉长了响应时间、客户端体验和处理速度、吞吐量。
  • 缺陷是便于出错, 且不易调试;
  • 若客户端对响应经验要求较高,
    请求处理逻辑简单(比如简单的数据拉取和集中),
    选拔并发格局可实用提高处理速度, 可以运用并发异步方案;

逻辑块之间的互相耦合与可增加性

软件的繁杂真正反映在逻辑块的随地长久的相互耦合和可伸张上。那是软件开发与维护中极具搦战性的局部。

澳门美高梅手机网站,逻辑块之间的互相耦合日常展示在二种情境:

a. 操作顺序的倚重。
比如资源立异操作必须在指定资源已经创办的情景下开展。
b. 对共享有限资源的产出申请。 比如打印机只有两台,
却有多个应用程序连接上去伸手打印文档;
c. 对共享可变状态的出现访问。
比如七个操作同时要翻新数据库中的同一条记下;

两种情境的纷纭均是由并发引起的。 即使所有操作都以串行举行的,
逻辑块的互动无非是“你方唱罢作者登场”的先后控制,
而资源对单个请求平日是十足的; 一旦选拔了出现方案,
就不便控制逻辑块的推行顺序和资源分配的具体情形了,
不难导致某资源对单个请求不足的情事,
从而阻塞多少个请求的处理依然死锁。并发升高了运用的天性,
却充实了失误的高危害和几率。并发控制是大型逻辑交互的本质性难题。并发控制的难点在于时序的合理控制和管事资源的客观分配。

对此 a 情境, 日常选拔添加前置条件来求解,
在操作从前校验相关资源是或不是满意、实体状态是或不是合理,
实体之间的关系是或不是正确; 若前置条件不满意, 则直接回到错误指示,
恐怕暂时挂起以备后续继续执行;

对此 b 情境, 须要创制一个保障适用的资源分配算法 和资源分配模块 ,
应用程序不再“自行”去拉取资源, 而是向资源分配模块申请资源,
由资源分配模块根据实际申请的一体化景况及报名条件来决定怎么样分配资源;

对此 c 情境, 须求开展安全的排外访问, 谨慎地操纵。

逻辑块之间的互相耦合应该交由交互解耦模块去落成,
而不是在团结的接口里直情径行。

相当于说, 唯有相互解耦模块知道所有接口之间的互动,
而接口只做自个儿清楚的事情就足以了。否则, 接口 A 与接口 B
必须领悟相互毕竟做了什么样, 才能科学地做和好的工作。 借使 接口 A 和接口 B
都修改某个资源的场馆。 接口 A 在做某项操作实践必须履行 IF (ConditionX)
do something ; DoMyOwnThing ; 接 口 B 也要根据 A 的逻辑相应地实践 if
(ConditionY) do anotherThing;DoMyOwnThing. 而程序员在爱戴和修改接口 A
的逻辑时, 不自然知道接口 B 的逻辑与之荣辱与共,
于是修改不可防止地破坏了接口 B 的逻辑。 耦合的接口数量越来越多,
或然耦合接口之间的耦合资源越来越多,
对前期维护和扩张将是一个不便应对的惊恐不已的梦。

对于逻辑块之间的相互解耦, 或者通俗地说, 模块解耦.

完结逻辑时的容错考虑

次第中的逻辑紧若是三类:

  • 取得值: 从数据库、网络或对象中赢得值。
    假使数据库或互联网访问充裕稳定的话, 可以当做是概括的获取值,
    数据库访问和网络访问对获取值是晶莹剔透的;

  • 检测值: 检测值是或不是合法, 常常是放手条件校验、
    中间状态校验和前置结果校验,
    依据检测结果举行“获取值”或“设置值”的逻辑;

  • 安装(拷贝)值: 设置数据库、对象中的值;
    或然发送数据和下令给互联网。若是数据库或互连网访问充足稳定的话,
    可以视作是简不难单的安装值, 数据库访问和网络访问对设置值是晶莹的;

这三类逻辑可以称之为逻辑元。 具体工作逻辑就是依据物理的或逻辑的资源限制,
将逻辑元的构成包装成逻辑块, 有效控制逻辑块的时序交互和资源分配。
时序控制不客观和资源缺乏导致错误和那一个。五个程序同时更新一个共享变量,
假使时序不控制, 就会促成错误的结果; 互联网通讯错误,
是因为互联网带宽资源是有限的。

怎么着应对不当和特别 ?

防御性编程

防备错误的艺术就是拓展防御性编程, 举行容错考虑。 多思考:
假诺这一步暴发错误, 会导致怎么样难题? 该如何是好才能防备那些张冠李戴?
即便难以防患, 该怎么描述, 才能在产出谬误时更好地稳住出那样的谬误?
在产出谬误时, 如何才能回复到健康合法的景色 ? 假诺不或然程序自动回复,
怎么样做才能让手工处理越发简约 ?

要健康地表述和掩护大型逻辑, 首先系统完全架构必须充分稳固可信,
在开发和保安进程中不停巩固。 倘若一栋建筑全部统筹有题目, 那么,
无论里面的屋子装修得多么赏心悦目优雅, 都会趁机建筑的倒下而消亡。
那亟需深切去切磋所使用的利用框架, 挖出大概的不可信危害,
并加以防患和决定。

在已规定的设计方案和事务逻辑的境况下, 怎么样编写BUG更少的代码:

提纲挈领的笺注 + 契约式/防御式编程 + 更短小的逻辑块 + 复用公共库 +
严酷测试

编排更少BUG程序的六条规则:

      1.   在方法前面编写简明扼要的注释: 方法用途, 接收参数,  返回值, 注意事项, 作者, 时间。

      2.   契约式编程: 在方法入口处编写前置条件校验,在方法出口处编写后置结果校验 ;

      3.   防御式编程: 编程时严格校验参数和前置条件; 仔细考虑各种错误与异常的定位和处理;

      4.   编写和保持短小逻辑块, 易于为人的脑容量一次性处理, 容易测试; 

      5.   复用经过严格测试的可靠的公共库; 如果库没有经过很好的测试,但有很好的用处, 帮助其添加测试;

      6.   对所编写的代码, 如果不是逻辑元, 都要进行严格测试。

有关我: 陈光剑,吉林黄海人, 号行走江湖一剑客,字之剑。程序员,作家,
小说家

http://universsky.github.io/


<link rel=”stylesheet”
href=”http://yandex.st/highlightjs/6.2/styles/googlecode.min.css"&gt;

<script
src=”http://code.jquery.com/jquery-1.7.2.min.js"&gt;&lt;/script&gt;
<script
src=”http://yandex.st/highlightjs/6.2/highlight.min.js"&gt;&lt;/script&gt;

<script>hljs.initHighlightingOnLoad();</script>
<script type=”text/javascript”>
$(document).ready(function(){
$(“h2,h3,h4,h5,h6”).each(function(i,item){
var tag = $(item).get(0).localName;
$(item).attr(“id”,”wow”+i);
$(“#category”).append(‘<a class=”new’+tag+'”
href=”#wow’+i+'”>’+$(this).text()+'</a></br>’);
$(“.newh2”).css(“margin-left”,0);
$(“.newh3”).css(“margin-left”,20);
$(“.newh4”).css(“margin-left”,40);
$(“.newh5”).css(“margin-left”,60);
$(“.newh6”).css(“margin-left”,80);
});
});
</script>

发表评论

电子邮件地址不会被公开。 必填项已用*标注