Dubbo啟動(dòng)時(shí)qos-server can not bind localhost:22222錯(cuò)誤解決

摘要: 原創(chuàng)出處 https://blog.csdn.net/u012988901/article/details/84503672

本節(jié)介紹

上一節(jié)中consumer啟動(dòng)時(shí)報(bào)了"Fail to start qos server"、"qos-server can not bind localhost:22222" 的異常,這節(jié)將會(huì)解釋一下為什么會(huì)出現(xiàn)這個(gè)錯(cuò)誤仑乌,怎么去解決它每界,還有qos中的一些Dubbo 內(nèi)建的telnet命令的使用方法候引。

啟動(dòng)的錯(cuò)誤

上一節(jié)Dubbo入門案例中渊迁,consumer工程啟動(dòng)時(shí)的報(bào)錯(cuò)信息如下:

2018-11-25 22:10:32,642 main [server.Server] 102 [ERROR]  [DUBBO] qos-server can not bind localhost:22222, dubbo version: 2.6.4, current host: 169.254.68.252
java.net.BindException: Address already in use: bind
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:433)
    at sun.nio.ch.Net.bind(Net.java:425)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
    at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:125)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:498)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1271)
    at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:413)
    at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:399)
    at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:1019)
    at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:198)
    at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:349)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:358)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
    at java.lang.Thread.run(Thread.java:748)
2018-11-25 22:10:32,650 main [protocol.QosProtocolWrapper] 101 [WARN ]  [DUBBO] Fail to start qos server: , dubbo version: 2.6.4, current host: 169.254.68.252
java.net.BindException: Address already in use: bind
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:433)
    at sun.nio.ch.Net.bind(Net.java:425)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
    at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:125)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:498)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1271)
    at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:413)
    at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:399)
    at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:1019)
    at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:198)
    at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:349)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:358)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
    at java.lang.Thread.run(Thread.java:748)

最關(guān)鍵的就是這兩句:

[DUBBO] qos-server can not bind localhost:22222, dubbo version: 2.6.4, current host: 169.254.68.252  
java.net.BindException: Address already in use: bind

[DUBBO] Fail to start qos server: , dubbo version: 2.6.4, current host: 169.254.68.252  
java.net.BindException: Address already in use: bind

什么是QoS

Qos=Quality of Service季研,qos是Dubbo的在線運(yùn)維命令飞主,可以對(duì)服務(wù)進(jìn)行動(dòng)態(tài)的配置、控制及查詢前鹅,Dubboo2.5.8新版本重構(gòu)了telnet(telnet是從Dubbo2.0.5開始支持的)模塊摘悴,提供了新的telnet命令支持,新版本的telnet端口與dubbo協(xié)議的端口是不同的端口嫡纠,默認(rèn)為22222烦租,可以通過配置文件dubbo.properties修改。telnet 模塊現(xiàn)在同時(shí)支持 http 協(xié)議和 telnet 協(xié)議除盏,方便各種情況的使用叉橱。

QoS提供了一些啟動(dòng)參數(shù),來對(duì)啟動(dòng)進(jìn)行配置者蠕,他們主要包括:

參數(shù) 說明 默認(rèn)值
qosEnable 是否啟動(dòng)QoS true
qosPort 啟動(dòng)QoS綁定的端口 22222
qosAcceptForeignIp 是否允許遠(yuǎn)程訪問 false

注意窃祝,從2.6.4/2.7.0開始,qosAcceptForeignIp默認(rèn)配置改為false(拒絕遠(yuǎn)端主機(jī)發(fā)出的命令踱侣,只允許服務(wù)本機(jī)執(zhí)行)粪小,如果qosAcceptForeignIp設(shè)置為true,有可能帶來安全風(fēng)險(xiǎn)抡句,請(qǐng)仔細(xì)評(píng)估后再打開探膊。

QoS參數(shù)可以通過如下方式進(jìn)行配置

  • JVM系統(tǒng)屬性
  • dubbo.properties
  • XML方式
  • Spring-boot自動(dòng)裝配方式

其中,上述方式的優(yōu)先順序?yàn)镴VM系統(tǒng)屬性 > dubbo.properties > XML/Spring-boot自動(dòng)裝配方式待榔。

使用系統(tǒng)屬性方式進(jìn)行配置

-Ddubbo.application.qos.enable=true
-Ddubbo.application.qos.port=33333
-Ddubbo.application.qos.accept.foreign.ip=false

使用dubbo.properties文件進(jìn)行配置

在項(xiàng)目的src/main/resources目錄下添加dubbo.properties文件逞壁,內(nèi)容如下:

dubbo.application.qos.enable=true
dubbo.application.qos.port=33333
dubbo.application.qos.accept.foreign.ip=false

使用XML方法進(jìn)行配置

如果要通過XML配置響應(yīng)的QoS相關(guān)的參數(shù),可以進(jìn)行如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
  <dubbo:application name="demo-provider">
    <dubbo:parameter key="qos.enable" value="true"/>
    <dubbo:parameter key="qos.accept.foreign.ip" value="false"/>
    <dubbo:parameter key="qos.port" value="33333"/>
  </dubbo:application>
  <dubbo:registry address="multicast://224.5.6.7:1234"/>
  <dubbo:protocol name="dubbo" port="20880"/>
  <dubbo:service interface="org.apache.dubbo.demo.provider.DemoService" ref="demoService"/>
  <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
</beans>

使用spring-boot自動(dòng)裝配方式配置

如果是spring-boot的應(yīng)用锐锣,可以在application.properties或者application.yml上配置:

dubbo.application.qosEnable=true
dubbo.application.qosPort=33333
dubbo.application.qosAcceptForeignIp=false

解決問題

通過上面的介紹腌闯,我們已經(jīng)找到了問題出現(xiàn)的原因:consumer啟動(dòng)時(shí)qos-server也是使用的默認(rèn)的22222端口,但是這時(shí)候端口已經(jīng)被provider給占用了雕憔,所以才會(huì)報(bào)錯(cuò)的姿骏。我們將simple-consumer.xml改成如下即可解決這個(gè)問題了。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 消費(fèi)方應(yīng)用名斤彼,用于計(jì)算依賴關(guān)系分瘦,不是匹配條件蘸泻,不要與提供方一樣 -->
    <dubbo:application name="simple-consumer">
        <dubbo:parameter key="qos.enable" value="true" />
        <dubbo:parameter key="qos.accept.foreign.ip" value="false" />
        <dubbo:parameter key="qos.port" value="33333" />
    </dubbo:application>

    <!-- 注冊中心地址 -->
    <dubbo:registry address="zookeeper://192.168.74.4:2181?backup=192.168.74.5:2181,192.168.74.6:2181" />

    <!-- 生成遠(yuǎn)程服務(wù)代理,可以像使用本地bean一樣使用demoService 檢查級(jí)聯(lián)依賴關(guān)系 默認(rèn)為true 當(dāng)有依賴服務(wù)的時(shí)候擅腰,需要根據(jù)需求進(jìn)行設(shè)置 -->
    <dubbo:reference id="simpleService" check="false" interface="com.wkp.service.simple.SimpleService" />
</beans>

Telnet命令使用介紹

要使用Telnet命令的話蟋恬,我們的provider或者consumer工程的pom文件中要添加commons-lang3的依賴翁潘,否則會(huì)無法使用并且控制臺(tái)會(huì)報(bào) 如下異常

2018-11-25 23:21:18,680 qos-worker-3-1 [channel.DefaultChannelPipeline] 1217 [WARN ] An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
    at com.alibaba.dubbo.qos.server.handler.TelnetProcessHandler.channelRead0(TelnetProcessHandler.java:45)
    at com.alibaba.dubbo.qos.server.handler.TelnetProcessHandler.channelRead0(TelnetProcessHandler.java:37)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

Qos提供的新的Telnet命令

Telnet連接命令格式如下:

telnet [host-name [port]]

因?yàn)榉?wù)控制通常都是針對(duì)于服務(wù)提供者的趁冈,其中動(dòng)態(tài)上下線服務(wù)是比較常用的,所以我們演示Telnet命令的時(shí)候也是連接的provider拜马,我們將simple-provider.xml改成如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
    <!-- 具體的實(shí)現(xiàn)bean -->
    <bean id="simpleService" class="com.wkp.service.simple.impl.SimpleServiceImpl" />

    <!-- 提供方應(yīng)用信息渗勘,用于計(jì)算依賴關(guān)系 -->
    <dubbo:application name="simple-provider">
        <dubbo:parameter key="qos.enable" value="true" />
        <dubbo:parameter key="qos.accept.foreign.ip" value="false" />
        <dubbo:parameter key="qos.port" value="22222" />
    </dubbo:application>

    <!-- 使用zookeeper注冊中心暴露服務(wù)地址(zookeeper單節(jié)點(diǎn)時(shí),address的值例如:zookeeper://192.168.74.4:2181) -->
    <dubbo:registry address="zookeeper://192.168.74.4:2181?backup=192.168.74.5:2181,192.168.74.6:2181" />

    <!-- 用dubbo協(xié)議在20880端口暴露服務(wù) -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- 聲明需要暴露的服務(wù)接口  寫操作可以設(shè)置retries=0 避免重復(fù)調(diào)用SOA服務(wù) -->
    <dubbo:service retries="0" interface="com.wkp.service.simple.SimpleService" ref="simpleService" />

</beans>

當(dāng)qos不允許遠(yuǎn)程連接時(shí)(<dubbo:parameter key="qos.accept.foreign.ip" value="false" />)俩莽,我們從另外機(jī)器嘗試訪問當(dāng)前provider旺坠,結(jié)果如下:

image

出現(xiàn)了"Foreign Ip Not Permitted",說明不允許遠(yuǎn)程連接扮超。

然后我們修改simple-provider.xml中 qos.accept.foreign.ip 的值為 true 取刃,再次嘗試訪問provider。

[root@wkp5 ~]# telnet 192.168.74.1 22222
Trying 192.168.74.1...
Connected to 192.168.74.1.
Escape character is '^]'.
   ___   __  __ ___   ___   ____     
  / _ \ / / / // _ ) / _ ) / __ \  
 / // // /_/ // _  |/ _  |/ /_/ /    
/____/ \____//____//____/ \____/   
dubbo>help
+---------+----------------------------------------------------------------------------------+
|    help | help command                                                                     |
+---------+----------------------------------------------------------------------------------+
|      ls | ls service                                                                       |
+---------+----------------------------------------------------------------------------------+
| offline | offline dubbo                                                                    |
+---------+----------------------------------------------------------------------------------+
|  online | online dubbo                                                                     |
+---------+----------------------------------------------------------------------------------+
|    quit | quit telnet console                                                              |
+---------+----------------------------------------------------------------------------------+

dubbo>help online
+--------------+----------------------------------------------------------------------------------+
| COMMAND NAME | online                                                                           |
+--------------+----------------------------------------------------------------------------------+
|      EXAMPLE | online dubbo                                                                     |
|              | online xx.xx.xxx.service                                                         |
+--------------+----------------------------------------------------------------------------------+

dubbo>help offline
+--------------+----------------------------------------------------------------------------------+
| COMMAND NAME | offline                                                                          |
+--------------+----------------------------------------------------------------------------------+
|      EXAMPLE | offline dubbo                                                                    |
|              | offline xx.xx.xxx.service                                                        |
+--------------+----------------------------------------------------------------------------------+

dubbo>ls
As Provider side:
+------------------------------------+---+
|        Provider Service Name       |PUB|
+------------------------------------+---+
|com.wkp.service.simple.SimpleService| Y |
+------------------------------------+---+
As Consumer side:
+---------------------+---+
|Consumer Service Name|NUM|
+---------------------+---+

dubbo>offline
OK
dubbo>ls
As Provider side:
+------------------------------------+---+
|        Provider Service Name       |PUB|
+------------------------------------+---+
|com.wkp.service.simple.SimpleService| N |
+------------------------------------+---+
As Consumer side:
+---------------------+---+
|Consumer Service Name|NUM|
+---------------------+---+

dubbo>online
OK
dubbo>ls
As Provider side:
+------------------------------------+---+
|        Provider Service Name       |PUB|
+------------------------------------+---+
|com.wkp.service.simple.SimpleService| Y |
+------------------------------------+---+
As Consumer side:
+---------------------+---+
|Consumer Service Name|NUM|
+---------------------+---+

dubbo>quit
BYE!
Connection closed by foreign host.
[root@wkp5 ~]# 

上面我們演示了五個(gè)命令:help出刷,ls璧疗,online,offline馁龟,quit崩侠。

help 列出所有命令, help online:列出某個(gè)命令的使用方法

quit 退出命令

ls 列出消費(fèi)者和提供者列表

online 上線服務(wù)命令

當(dāng)使用延遲發(fā)布功能的時(shí)候(通過設(shè)置 com.alibaba.dubbo.config.AbstractServiceConfig#register 為 false)坷檩,后續(xù)需要上線的時(shí)候却音,可通過 Online 命令

//上線所有服務(wù)
dubbo>online
OK

//根據(jù)正則,上線部分服務(wù)
dubbo>online com.*
OK

常見使用場景:

當(dāng)線上的 QPS 比較高的時(shí)候矢炼,當(dāng)剛重啟機(jī)器的時(shí)候系瓢,由于沒有進(jìn)行JIT 預(yù)熱或相關(guān)資源沒有預(yù)熱,可能會(huì)導(dǎo)致大量超時(shí)句灌,這個(gè)時(shí)候夷陋,可通過分批發(fā)布服務(wù),逐漸加大流量

當(dāng)由于某臺(tái)機(jī)器由于某種原因涯塔,需要下線服務(wù)肌稻,然后又需要重新上線服務(wù)

offline下線服務(wù)

由于故障等原因,需要臨時(shí)下線服務(wù)保持現(xiàn)場匕荸,可以使用 Offline 下線命令爹谭。

//下線所有服務(wù)
dubbo>offline
OK

//根據(jù)正則,下線部分服務(wù)
dubbo>offline com.*
OK
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榛搔,一起剝皮案震驚了整個(gè)濱河市诺凡,隨后出現(xiàn)的幾起案子东揣,更是在濱河造成了極大的恐慌,老刑警劉巖腹泌,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘶卧,死亡現(xiàn)場離奇詭異,居然都是意外死亡凉袱,警方通過查閱死者的電腦和手機(jī)芥吟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來专甩,“玉大人钟鸵,你說我怎么就攤上這事〉佣悖” “怎么了棺耍?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長种樱。 經(jīng)常有香客問我蒙袍,道長,這世上最難降的妖魔是什么嫩挤? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任害幅,我火速辦了婚禮,結(jié)果婚禮上俐镐,老公的妹妹穿的比我還像新娘矫限。我一直安慰自己,他們只是感情好佩抹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布叼风。 她就那樣靜靜地躺著,像睡著了一般棍苹。 火紅的嫁衣襯著肌膚如雪无宿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天枢里,我揣著相機(jī)與錄音孽鸡,去河邊找鬼。 笑死栏豺,一個(gè)胖子當(dāng)著我的面吹牛彬碱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奥洼,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼巷疼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灵奖?” 一聲冷哼從身側(cè)響起嚼沿,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤估盘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后骡尽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遣妥,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年攀细,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箫踩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辨图,死狀恐怖班套,靈堂內(nèi)的尸體忽然破棺而出肢藐,到底是詐尸還是另有隱情故河,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布吆豹,位于F島的核電站鱼的,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痘煤。R本人自食惡果不足惜凑阶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衷快。 院中可真熱鬧宙橱,春花似錦、人聲如沸蘸拔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽调窍。三九已至宝冕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邓萨,已是汗流浹背地梨。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缔恳,地道東北人宝剖。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像歉甚,于是被迫代替她去往敵國和親万细。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎铃芦,感謝一直在我身邊的親朋好友雅镊。感恩相遇襟雷!感恩不離不棄。 中午開了第一次的黨會(huì)仁烹,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,567評(píng)論 0 11
  • 彩排完耸弄,天已黑
    劉凱書法閱讀 4,218評(píng)論 1 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒卓缰。表情可以傳達(dá)很多信息计呈。高興了當(dāng)然就笑了,難過就哭了征唬。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,081評(píng)論 2 7