Ê×Ïȸø´ó¼Ò½éÉÜÏÂʲôÊǸºÔؾùºâ£¨À´×Ô°Ù¿Æ£©
¸ºÔؾùºâ ½¨Á¢ÔÚÏÖÓÐÍøÂç½á¹¹Ö®ÉÏ£¬ËüÌṩÁËÒ»ÖÖÁ®¼ÛÓÐЧ͸Ã÷µÄ·½·¨À©Õ¹ ÍøÂçÉ豸ºÍ ·þÎñÆ÷µÄ´ø¿í¡¢Ôö¼Ó ÍÌÍÂÁ¿¡¢¼ÓÇ¿ÍøÂçÊý¾Ý´¦ÀíÄÜÁ¦¡¢Ìá¸ßÍøÂçµÄÁé»îÐԺͿÉÓÃÐÔ¡£
¸ºÔؾùºâ£¬Ó¢ÎÄÃû³ÆÎªLoad Balance£¬ÆäÒâ˼¾ÍÊÇ·Ö̯µ½¶à¸ö²Ù×÷µ¥ÔªÉϽøÐÐÖ´ÐУ¬ÀýÈçWeb ·þÎñÆ÷¡¢
FTP·þÎñÆ÷¡¢ ÆóÒµ¹Ø¼üÓ¦Ó÷þÎñÆ÷ºÍÆäËü¹Ø¼üÈÎÎñ·þÎñÆ÷µÈ£¬´Ó¶ø¹²Í¬Íê³É¹¤×÷ÈÎÎñ¡£

±¾ÎĽ²ÊöµÄÊÇ¡±½«Íⲿ·¢ËÍÀ´µÄÇëÇó¾ùÔÈ·ÖÅäµ½¶Ô³Æ½á¹¹ÖеÄijһ̨·þÎñÆ÷ÉÏ¡±µÄ¸÷ÖÖËã·¨£¬²¢ÒÔJava´úÂëÑÝʾÿÖÖËã·¨µÄ¾ßÌåʵÏÖ£¬OK£¬ÏÂÃæ½øÈëÕýÌ⣬ÔÚ½øÈëÕýÌâǰ£¬ÏÈдһ¸öÀàÀ´Ä£ÄâIpÁÐ±í£º
import java.util.HashMap;
/** * @author ashang.peng@aliyun.com * @date
¶þÔÂ 07, 2017 */
public class IpMap {
// ´ý·ÓɵÄIpÁÐ±í£¬Key´ú±íIp£¬Value´ú±í¸ÃIpµÄÈ¨ÖØ
public static HashMap<String, Integer> serverWeightMap
=
new HashMap<String, Integer>();
static
{
serverWeightMap.put("192.168.1.100",
1);
serverWeightMap.put("192.168.1.101",
1);
// È¨ÖØÎª4
serverWeightMap.put("192.168.1.102",
4);
serverWeightMap.put("192.168.1.103",
1);
serverWeightMap.put("192.168.1.104",
1);
// È¨ÖØÎª3
serverWeightMap.put("192.168.1.105",
3);
serverWeightMap.put("192.168.1.106",
1);
// È¨ÖØÎª2
serverWeightMap.put("192.168.1.107",
2);
serverWeightMap.put("192.168.1.108",
1);
serverWeightMap.put("192.168.1.109",
1);
serverWeightMap.put("192.168.1.110",
1);
}
} |
ÂÖѯ£¨Round Robin£©·¨
ÂÖѯµ÷¶ÈËã·¨µÄÔÀíÊÇÿһ´Î°ÑÀ´×ÔÓû§µÄÇëÇóÂÖÁ÷·ÖÅ䏸ÄÚ²¿ÖеķþÎñÆ÷£¬´Ó1¿ªÊ¼£¬Ö±µ½N(ÄÚ²¿·þÎñÆ÷¸öÊý)£¬È»ºóÖØÐ¿ªÊ¼Ñ»·¡£Ëã·¨µÄÓŵãÊÇÆä¼ò½àÐÔ£¬ËüÎÞÐè¼Ç¼µ±Ç°ËùÓÐÁ¬½ÓµÄ״̬£¬ËùÒÔËüÊÇÒ»ÖÖÎÞ״̬µ÷¶È¡£
Æä´úÂëʵÏÖ´óÖÂÈçÏ£º
import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set;
/** * @author ashang.peng@aliyun.com * @date
¶þÔÂ 07, 2017 */
class RoundRobin {
private static Integer pos = 0;
public static String getServer()
{
// ÖØ½¨Ò»¸öMap£¬±ÜÃâ·þÎñÆ÷µÄÉÏÏÂÏßµ¼ÖµIJ¢·¢ÎÊÌâ
Map<String, Integer> serverMap =
new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap);
// È¡µÃIpµØÖ·List
Set<String> keySet = serverMap.keySet();
ArrayList<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);
String server = null;
synchronized (pos)
{
if (pos > keySet.size())
pos = 0;
server = keyList.get(pos);
pos ++;
}
return server;
}
} |
ÓÉÓÚserverWeightMapÖеĵØÖ·ÁбíÊǶ¯Ì¬µÄ£¬ËæÊ±¿ÉÄÜÓлúÆ÷ÉÏÏß¡¢ÏÂÏß»òÕßå´»ú£¬Òò´ËΪÁ˱ÜÃâ¿ÉÄܳöÏֵIJ¢·¢ÎÊÌ⣬·½·¨ÄÚ²¿ÒªÐ½¨¾Ö²¿±äÁ¿serverMap£¬ÏÖ½«serverMapÖеÄÄÚÈݸ´ÖƵ½Ï̱߳¾µØ£¬ÒÔ±ÜÃâ±»¶à¸öÏß³ÌÐ޸ġ£ÕâÑù¿ÉÄÜ»áÒýÈëеÄÎÊÌ⣬¸´ÖÆÒÔºóserverWeightMapµÄÐÞ¸ÄÎÞ·¨·´Ó³¸øserverMap£¬Ò²¾ÍÊÇ˵ÕâÒ»ÂÖÑ¡Ôñ·þÎñÆ÷µÄ¹ý³ÌÖУ¬ÐÂÔö·þÎñÆ÷»òÕßÏÂÏß·þÎñÆ÷£¬¸ºÔؾùºâËã·¨½«ÎÞ·¨»ñÖª¡£ÐÂÔöÎÞËùν£¬Èç¹ûÓзþÎñÆ÷ÏÂÏß»òÕßå´»ú£¬ÄÇô¿ÉÄÜ»á·ÃÎʵ½²»´æÔڵĵØÖ·¡£Òò´Ë£¬·þÎñµ÷ÓöËÐèÒªÓÐÏàÓ¦µÄÈÝ´í´¦Àí£¬±ÈÈçÖØÐ·¢ÆðÒ»´ÎserverÑ¡Ôñ²¢µ÷Óá£
¶ÔÓÚµ±Ç°ÂÖѯµÄλÖñäÁ¿pos£¬ÎªÁ˱£Ö¤·þÎñÆ÷Ñ¡ÔñµÄ˳ÐòÐÔ£¬ÐèÒªÔÚ²Ù×÷ʱ¶ÔÆä¼ÓËø£¬Ê¹µÃͬһʱ¿ÌÖ»ÄÜÓÐÒ»¸öÏ߳̿ÉÒÔÐÞ¸ÄposµÄÖµ£¬·ñÔòµ±pos±äÁ¿±»²¢·¢Ð޸ģ¬ÔòÎÞ·¨±£Ö¤·þÎñÆ÷Ñ¡ÔñµÄ˳ÐòÐÔ£¬ÉõÖÁÓпÉÄܵ¼ÖÂkeyListÊý×éÔ½½ç¡£
ÂÖѯ·¨µÄÓŵãÔÚÓÚ£ºÊÔͼ×öµ½ÇëÇó×ªÒÆµÄ¾ø¶Ô¾ùºâ¡£
ÂÖѯ·¨µÄȱµãÔÚÓÚ£ºÎªÁË×öµ½ÇëÇó×ªÒÆµÄ¾ø¶Ô¾ùºâ£¬±ØÐ븶³öÏ൱´óµÄ´ú¼Û£¬ÒòΪΪÁ˱£Ö¤pos±äÁ¿Ð޸ĵĻ¥³âÐÔ£¬ÐèÒªÒýÈëÖØÁ¿¼¶µÄ±¯¹ÛËøsynchronized£¬Õ⽫»áµ¼Ö¸öÎÂÖѯ´úÂëµÄ²¢·¢ÍÌÍÂÁ¿·¢ÉúÃ÷ÏÔµÄϽµ¡£
Ëæ»ú£¨Random£©·¨
ͨ¹ýϵͳµÄËæ»úËã·¨£¬¸ù¾Ýºó¶Ë·þÎñÆ÷µÄÁбí´óСֵÀ´Ëæ»úѡȡÆäÖеÄһ̨·þÎñÆ÷½øÐзÃÎÊ¡£ÓɸÅÂÊͳ¼ÆÀíÂÛ¿ÉÒÔµÃÖª£¬Ëæ×ſͻ§¶Ëµ÷Ó÷þÎñ¶ËµÄ´ÎÊýÔö¶à£¬
Æäʵ¼ÊЧ¹ûÔ½À´Ô½½Ó½üÓÚÆ½¾ù·ÖÅäµ÷ÓÃÁ¿µ½ºó¶ËµÄÿһ̨·þÎñÆ÷£¬Ò²¾ÍÊÇÂÖѯµÄ½á¹û¡£
Ëæ»ú·¨µÄ´úÂëʵÏÖ´óÖÂÈçÏ£º
import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set;
/** * @author ashang.peng@aliyun.com * @date
¶þÔÂ 07, 2017 */
class Random {
public static String getServer()
{
// ÖØ½¨Ò»¸öMap£¬±ÜÃâ·þÎñÆ÷µÄÉÏÏÂÏßµ¼ÖµIJ¢·¢ÎÊÌâ
Map<String, Integer> serverMap =
new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap);
// È¡µÃIpµØÖ·List
Set<String> keySet = serverMap.keySet();
ArrayList<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);
java.util.Random random = new java.util.Random();
int randomPos = random.nextInt(keyList.size());
return keyList.get(randomPos);
}
} |
ÕûÌå´úÂë˼·ºÍÂÖѯ·¨Ò»Ö£¬ÏÈÖØ½¨serverMap£¬ÔÙ»ñÈ¡µ½serverÁÐ±í¡£ÔÚѡȡserverµÄʱºò£¬Í¨¹ýRandomµÄnextInt·½·¨È¡0~keyList.size()Çø¼äµÄÒ»¸öËæ»úÖµ£¬´Ó¶ø´Ó·þÎñÆ÷ÁбíÖÐËæ»ú»ñÈ¡µ½Ò»Ì¨·þÎñÆ÷µØÖ·½øÐзµ»Ø¡£»ùÓÚ¸ÅÂÊͳ¼ÆµÄÀíÂÛ£¬ÍÌÍÂÁ¿Ô½´ó£¬Ëæ»úËã·¨µÄЧ¹ûÔ½½Ó½üÓÚÂÖѯËã·¨µÄЧ¹û¡£
Ô´µØÖ·¹þÏ££¨Hash£©·¨
Ô´µØÖ·¹þÏ£µÄ˼ÏëÊǸù¾Ý»ñÈ¡¿Í»§¶ËµÄIPµØÖ·£¬Í¨¹ý¹þÏ£º¯Êý¼ÆËãµÃµ½µÄÒ»¸öÊýÖµ£¬ÓøÃÊýÖµ¶Ô·þÎñÆ÷ÁбíµÄ´óС½øÐÐȡģÔËË㣬µÃµ½µÄ½á¹û±ãÊǿͷþ¶ËÒª·ÃÎÊ·þÎñÆ÷µÄÐòºÅ¡£²ÉÓÃÔ´µØÖ·¹þÏ£·¨½øÐиºÔؾùºâ£¬Í¬Ò»IPµØÖ·µÄ¿Í»§¶Ë£¬µ±ºó¶Ë·þÎñÆ÷ÁÐ±í²»±äʱ£¬Ëüÿ´Î¶¼»áÓ³É䵽ͬһ̨ºó¶Ë·þÎñÆ÷½øÐзÃÎÊ¡£
Ô´µØÖ·¹þÏ£Ëã·¨µÄ´úÂëʵÏÖ´óÖÂÈçÏ£º
import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set;
/** * @author ashang.peng@aliyun.com * @date
¶þÔÂ 07, 2017 */
class Hash {
public static String getServer()
{
// ÖØ½¨Ò»¸öMap£¬±ÜÃâ·þÎñÆ÷µÄÉÏÏÂÏßµ¼ÖµIJ¢·¢ÎÊÌâ
Map<String, Integer> serverMap =
new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap);
// È¡µÃIpµØÖ·List
Set<String> keySet = serverMap.keySet();
ArrayList<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);
// ÔÚWebÓ¦ÓÃÖпÉͨ¹ýHttpServletµÄgetRemoteIp·½·¨»ñÈ¡
String remoteIp = "127.0.0.1";
int hashCode = remoteIp.hashCode();
int serverListSize = keyList.size();
int serverPos = hashCode % serverListSize;
return keyList.get(serverPos);
}
} |
ǰÁ½²¿·ÖºÍÂÖѯ·¨¡¢Ëæ»ú·¨Ò»Ñù¾Í²»ËµÁË£¬²î±ðÔÚÓÚ·ÓÉÑ¡Ôñ²¿·Ö¡£Í¨¹ý¿Í»§¶ËµÄipÒ²¾ÍÊÇremoteIp£¬È¡µÃËüµÄHashÖµ£¬¶Ô·þÎñÆ÷ÁбíµÄ´óСȡ죬½á¹û±ãÊÇÑ¡ÓõķþÎñÆ÷ÔÚ·þÎñÆ÷ÁбíÖеÄË÷ÒýÖµ¡£
Ô´µØÖ·¹þÏ£·¨µÄÓŵãÔÚÓÚ£º±£Ö¤ÁËÏàͬ¿Í»§¶ËIPµØÖ·½«»á±»¹þÏ£µ½Í¬Ò»Ì¨ºó¶Ë·þÎñÆ÷£¬Ö±µ½ºó¶Ë·þÎñÆ÷Áбí±ä¸ü¡£¸ù¾Ý´ËÌØÐÔ¿ÉÒÔÔÚ·þÎñÏû·ÑÕßÓë·þÎñÌṩÕßÖ®¼ä½¨Á¢ÓÐ״̬µÄsession»á»°¡£
Ô´µØÖ·¹þÏ£Ëã·¨µÄȱµãÔÚÓÚ£º³ý·Ç¼¯ÈºÖзþÎñÆ÷µÄ·Ç³£Îȶ¨£¬»ù±¾²»»áÉÏÏÂÏߣ¬·ñÔòÒ»µ©ÓзþÎñÆ÷ÉÏÏß¡¢ÏÂÏߣ¬ÄÇôͨ¹ýÔ´µØÖ·¹þÏ£Ë㷨·Óɵ½µÄ·þÎñÆ÷ÊÇ·þÎñÆ÷ÉÏÏß¡¢ÏÂÏßǰ·Óɵ½µÄ·þÎñÆ÷µÄ¸ÅÂʷdz£µÍ£¬Èç¹ûÊÇsessionÔòÈ¡²»µ½session£¬Èç¹ûÊÇ»º´æÔò¿ÉÄÜÒý·¢¡±Ñ©±À¡±¡£Èç¹ûÕâô½âÊͲ»ÊʺÏÃ÷°×£¬¿ÉÒÔ¿´ÎÒ֮ǰµÄһƪÎÄÕÂMemCache³¬Ïêϸ½â¶Á£¬Ò»ÖÂÐÔHashËã·¨²¿·Ö¡£
¼ÓȨÂÖѯ£¨Weight Round Robin£©·¨
²»Í¬µÄºó¶Ë·þÎñÆ÷¿ÉÄÜ»úÆ÷µÄÅäÖú͵±Ç°ÏµÍ³µÄ¸ºÔز¢²»Ïàͬ£¬Òò´ËËüÃǵĿ¹Ñ¹ÄÜÁ¦Ò²²»Ïàͬ¡£¸øÅäÖøߡ¢¸ºÔص͵ĻúÆ÷ÅäÖøü¸ßµÄÈ¨ÖØ£¬ÈÃÆä´¦Àí¸ü¶àµÄÇ룻¶øÅäÖõ͡¢¸ºÔظߵĻúÆ÷£¬¸øÆä·ÖÅä½ÏµÍµÄÈ¨ÖØ£¬½µµÍÆäϵͳ¸ºÔØ£¬¼ÓȨÂÖѯÄܺܺõش¦ÀíÕâÒ»ÎÊÌ⣬²¢½«ÇëÇó˳ÐòÇÒ°´ÕÕÈ¨ÖØ·ÖÅäµ½ºó¶Ë¡£¼ÓȨÂÖѯ·¨µÄ´úÂëʵÏÖ´óÖÂÈçÏ£º
import java.util.*;
/** * @author ashang.peng@aliyun.com * @date
¶þÔÂ 07, 2017 */
class WeightRoundRobin {
private static Integer pos;
public static String getServer()
{
// ÖØ½¨Ò»¸öMap£¬±ÜÃâ·þÎñÆ÷µÄÉÏÏÂÏßµ¼ÖµIJ¢·¢ÎÊÌâ
Map<String, Integer> serverMap =
new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap);
// È¡µÃIpµØÖ·List
Set<String> keySet = serverMap.keySet();
Iterator<String> iterator = keySet.iterator();
List<String> serverList = new ArrayList<String>();
while (iterator.hasNext())
{
String server = iterator.next();
int weight = serverMap.get(server);
for (int i = 0; i < weight; i++)
serverList.add(server);
}
String server = null;
synchronized (pos)
{
if (pos > keySet.size())
pos = 0;
server = serverList.get(pos);
pos ++;
}
return server;
}
} |
ÓëÂÖѯ·¨ÀàËÆ£¬Ö»ÊÇÔÚ»ñÈ¡·þÎñÆ÷µØÖ·Ö®Ç°Ôö¼ÓÁËÒ»¶ÎÈ¨ÖØ¼ÆËãµÄ´úÂ룬¸ù¾ÝÈ¨ÖØµÄ´óС£¬½«µØÖ·Öظ´µØÔö¼Óµ½·þÎñÆ÷µØÖ·ÁбíÖУ¬È¨ÖØÔ½´ó£¬¸Ã·þÎñÆ÷ÿÂÖËù»ñµÃµÄÇëÇóÊýÁ¿Ô½¶à¡£
¼ÓÈ¨Ëæ»ú£¨Weight Random£©·¨
Óë¼ÓȨÂÖѯ·¨Ò»Ñù£¬¼ÓÈ¨Ëæ»ú·¨Ò²¸ù¾Ýºó¶Ë»úÆ÷µÄÅäÖã¬ÏµÍ³µÄ¸ºÔØ·ÖÅ䲻ͬµÄÈ¨ÖØ¡£²»Í¬µÄÊÇ£¬ËüÊǰ´ÕÕÈ¨ÖØËæ»úÇëÇóºó¶Ë·þÎñÆ÷£¬¶ø·Ç˳Ðò¡£
import java.util.*;
/** * @author ashang.peng@aliyun.com * @date
¶þÔÂ 07, 2017 */
class WeightRandom {
public static String getServer()
{
// ÖØ½¨Ò»¸öMap£¬±ÜÃâ·þÎñÆ÷µÄÉÏÏÂÏßµ¼ÖµIJ¢·¢ÎÊÌâ
Map<String, Integer> serverMap =
new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap);
// È¡µÃIpµØÖ·List
Set<String> keySet = serverMap.keySet();
Iterator<String> iterator = keySet.iterator();
List<String> serverList = new ArrayList<String>();
while (iterator.hasNext())
{
String server = iterator.next();
int weight = serverMap.get(server);
for (int i = 0; i < weight; i++)
serverList.add(server);
}
java.util.Random random = new java.util.Random();
int randomPos = random.nextInt(serverList.size());
return serverList.get(randomPos);
}
} |
Õâ¶Î´úÂëÏ൱ÓÚÊÇËæ»ú·¨ºÍ¼ÓȨÂÖѯ·¨µÄ½áºÏ£¬±È½ÏºÃÀí½â£¬¾Í²»½âÊÍÁË¡£
×îСÁ¬½ÓÊý£¨Least Connections£©·¨
×îСÁ¬½ÓÊýËã·¨±È½ÏÁé»îºÍÖÇÄÜ£¬ÓÉÓÚºó¶Ë·þÎñÆ÷µÄÅäÖò»¾¡Ïàͬ£¬¶ÔÓÚÇëÇóµÄ´¦ÀíÓпìÓÐÂý£¬ËüÊǸù¾Ýºó¶Ë·þÎñÆ÷µ±Ç°µÄÁ¬½ÓÇé¿ö£¬¶¯Ì¬µØÑ¡È¡ÆäÖе±Ç°
»ýѹÁ¬½ÓÊý×îÉÙµÄһ̨·þÎñÆ÷À´´¦Àíµ±Ç°µÄÇëÇ󣬾¡¿ÉÄܵØÌá¸ßºó¶Ë·þÎñµÄÀûÓÃЧÂÊ£¬½«¸ºÔðºÏÀíµØ·ÖÁ÷µ½Ã¿Ò»Ì¨·þÎñÆ÷¡£
Ç°Ãæ¼¸ÖÖ·½·¨·Ñ¾¡ÐÄ˼À´ÊµÏÖ·þÎñÏû·ÑÕßÇëÇó´ÎÊý·ÖÅäµÄ¾ùºâ£¬µ±È»Õâô×öÊÇû´íµÄ£¬¿ÉÒÔΪºó¶ËµÄ¶ą̀·þÎñÆ÷ƽ¾ù·ÖÅ乤×÷Á¿£¬×î´ó³Ì¶ÈµØÌá¸ß·þÎñÆ÷µÄÀûÓÃÂÊ£¬µ«ÊÇʵ¼ÊÇé¿öÊÇ·ñÕæµÄÈç´Ë£¿Êµ¼ÊÇé¿öÖУ¬ÇëÇó´ÎÊýµÄ¾ùºâÕæµÄÄÜ´ú±í¸ºÔصľùºâÂð£¿ÕâÊÇÒ»¸öÖµµÃ˼¿¼µÄÎÊÌâ¡£
ÉÏÃæµÄÎÊÌ⣬ÔÙ»»Ò»¸ö½Ç¶ÈÀ´Ëµ¾ÍÊÇ£ºÒÔºó¶Ë·þÎñÆ÷µÄÊÓ½ÇÀ´¹Û²ìϵͳµÄ¸ºÔØ£¬¶ø·ÇÇëÇ󷢯ð·½À´¹Û²ì¡£×îСÁ¬½ÓÊý·¨±ãÊôÓÚ´ËÀà¡£
×îСÁ¬½ÓÊýËã·¨±È½ÏÁé»îºÍÖÇÄÜ£¬ÓÉÓÚºó¶Ë·þÎñÆ÷µÄÅäÖò»¾¡Ïàͬ£¬¶ÔÓÚÇëÇóµÄ´¦ÀíÓпìÓÐÂý£¬ËüÕýÊǸù¾Ýºó¶Ë·þÎñÆ÷µ±Ç°µÄÁ¬½ÓÇé¿ö£¬¶¯Ì¬µØÑ¡È¡ÆäÖе±Ç°»ýѹÁ¬½ÓÊý×îÉÙµÄһ̨·þÎñÆ÷À´´¦Àíµ±Ç°ÇëÇ󣬾¡¿ÉÄܵØÌá¸ßºó¶Ë·þÎñÆ÷µÄÀûÓÃЧÂÊ£¬½«¸ºÔغÏÀíµØ·ÖÁ÷µ½Ã¿Ò»Ì¨»úÆ÷¡£ÓÉÓÚ×îСÁ¬½ÓÊýÉè¼Æ·þÎñÆ÷Á¬½ÓÊýµÄ»ã×ܺ͸ÐÖª£¬Éè¼ÆÓëʵÏÖ½ÏΪ·±Ëö£¬´Ë´¦¾Í²»ËµËüµÄʵÏÖÁË¡£ |