国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

造輪子!8個類手寫一個配置中心!

共 12285字,需瀏覽 25分鐘

 ·

2022-02-12 11:23

點擊關(guān)注公眾號,Java干貨及時送達??


配置中心是我們平常使用微服務(wù)架構(gòu)時重要的一個模塊,常用的配置中心組件也比較多,從早期的Spring Cloud Config,到Disconf、Apollo、Nacos等,它們支持的功能、產(chǎn)品的性能以及給用戶的體驗也各有不同。

雖然說功能上有不少差異,但是它們解決的最核心問題,無疑是配置文件修改后的實時生效,有時候在搬磚之余Hydra就在好奇實時生效是如何實現(xiàn)的、如果讓我來設(shè)計又會怎么去實現(xiàn),于是這幾天抽出了點空閑時間,摸魚摸出了個簡易版的單機配置中心,先來看看效果:

之所以說是簡易版本,首先是因為實現(xiàn)的核心功能就只有配置修改后實時生效,并且代碼的實現(xiàn)也非常簡單,一共只用了8個類就實現(xiàn)了這個核心功能,看一下代碼的結(jié)構(gòu),核心類就是core包中的這8個類:

看到這是不是有點好奇,雖說是低配版,就憑這么幾個類也能實現(xiàn)一個配置中心?那么先看一下總體的設(shè)計流程,下面我們再細說代碼。

代碼簡要說明

下面對8個核心類進行一下簡要說明并貼出核心代碼,有的類中代碼比較長,可能對手機瀏覽的小伙伴不是非常友好,建議收藏后以后電腦瀏覽器打開(騙波收藏,計劃通!)。另外Hydra已經(jīng)把項目的全部代碼上傳到了git,有需要的小伙伴可以移步文末獲取地址。

1、ScanRunner

ScanRunner實現(xiàn)了CommandLineRunner接口,可以保證它在springboot啟動最后執(zhí)行,這樣就能確保其他的Bean已經(jīng)實例化結(jié)束并被放入了容器中。至于為什么起名叫ScanRunner,是因為這里要實現(xiàn)的主要就是掃描類相關(guān)功能。先看一下代碼:

@Component
public?class?ScanRunner?implements?CommandLineRunner?{
????@Override
????public?void?run(String...?args)?throws?Exception?{
????????doScanComponent();
????}

????private?void?doScanComponent(){
????????String?rootPath?=?this.getClass().getResource("/").getPath();
????????List?fileList?=?FileScanner.findFileByType(rootPath,null,FileScanner.TYPE_CLASS);
????????doFilter(rootPath,fileList);
????????EnvInitializer.init();
????}

????private?void?doFilter(String?rootPath,?List?fileList)?{
????????rootPath?=?FileScanner.getRealRootPath(rootPath);
????????for?(String?fullPath?:?fileList)?{
????????????String?shortName?=?fullPath.replace(rootPath,?"")
????????????????????.replace(FileScanner.TYPE_CLASS,"");
????????????String?packageFileName=shortName.replaceAll(Matcher.quoteReplacement(File.separator),"\\.");

????????????try?{
????????????????Class?clazz?=?Class.forName(packageFileName);
????????????????if?(clazz.isAnnotationPresent(Component.class)
????????????????????????||?clazz.isAnnotationPresent(Controller.class)
????????????????????????||clazz.isAnnotationPresent(Service.class))
{
????????????????????VariablePool.add(clazz);
????????????????}
????????????}?catch?(ClassNotFoundException?e)?{
????????????????e.printStackTrace();
????????????}
????????}
????}????
}

真正實現(xiàn)文件掃描功能是調(diào)用的FileScanner,它的實現(xiàn)我們后面具體再說,在功能上它能夠根據(jù)文件后綴名掃描某一目錄下的全部文件,這里首先掃描出了target目錄下全部以.class結(jié)尾的文件:

掃描到全部class文件后,就可以利用類的全限定名獲取到類的Class對象,下一步是調(diào)用doFilter方法對類進行過濾。這里我們暫時僅考慮通過@Value注解的方式注入配置文件中屬性值的方式,那么下一個問題來了,什么類中的@Value注解會生效呢?答案是通過@Component@Controller、@Service這些注解交給spring容器管理的類。

綜上,我們通過這些注解再次進行過濾出符合條件的類,找到后交給VariablePool對變量進行處理。

2、FileScanner

FileScanner是掃描文件的工具類,它可以根據(jù)文件后綴名篩選出需要的某個類型的文件,除了在ScanRunner中用它掃描了class文件外,在后面的邏輯中還會用它掃描yml文件。下面,看一下FileScanner中實現(xiàn)的文件掃描的具體代碼:

public?class?FileScanner?{
????public?static?final?String?TYPE_CLASS=".class";
????public?static?final?String?TYPE_YML=".yml";

????public?static?List?findFileByType(String?rootPath,?List?fileList,String?fileType){
????????if?(fileList==null){
????????????fileList=new?ArrayList<>();
????????}

????????File?rootFile=new?File(rootPath);
????????if?(!rootFile.isDirectory()){
????????????addFile(rootFile.getPath(),fileList,fileType);
????????}else{
????????????String[]?subFileList?=?rootFile.list();
????????????for?(String?file?:?subFileList)?{
????????????????String?subFilePath=rootPath?+?"\\"?+?file;
????????????????File?subFile?=?new?File(subFilePath);
????????????????if?(!subFile.isDirectory()){
????????????????????addFile(subFile.getPath(),fileList,fileType);
????????????????}else{
????????????????????findFileByType(subFilePath,fileList,fileType);
????????????????}
????????????}
????????}
????????return?fileList;
????}

????private?static?void?addFile(String?fileName,List?fileList,String?fileType){
????????if?(fileName.endsWith(fileType)){
????????????fileList.add(fileName);
????????}
????}

????public?static?String?getRealRootPath(String?rootPath){
????????if?(System.getProperty("os.name").startsWith("Windows")
????????????????&&?rootPath.startsWith("/")){
????????????rootPath?=?rootPath.substring(1);
????????????rootPath?=?rootPath.replaceAll("/",?Matcher.quoteReplacement(File.separator));
????????}
????????return?rootPath;
????}
}

查找文件的邏輯很簡單,就是在給定的根目錄rootPath下,循環(huán)遍歷每一個目錄,對找到的文件再進行后綴名的比對,如果符合條件就加到返回的文件名列表中。

至于下面的這個getRealRootPath方法,是因為在windows環(huán)境下,獲取到項目的運行目錄是這樣的:

/F:/Workspace/hermit-purple-config/target/classes/

而class文件名是這樣的:

F:\Workspace\hermit-purple-config\target\classes\com\cn\hermimt\purple\test\service\UserService.class

如果想要獲取一個類的全限定名,那么首先要去掉運行目錄,再把文件名中的反斜杠\替換成點.,這里就是為了刪掉文件名中的運行路徑提前做好準備。

3、VariablePool

回到上面的主流程中,每個在ScanRunner中掃描出的帶有@Component、@Controller、@Service注解的Class,都會交給VariablePool進行處理。顧名思義,VariablePool就是變量池的意思,下面會用這個容器封裝所有帶@Value注解的屬性。

public?class?VariablePool?{
????public?static?Map>?pool=new?HashMap<>();
????
????private?static?final?String?regex="^(\\$\\{)(.)+(\\})$";
????private?static?Pattern?pattern;
????static{
????????pattern=Pattern.compile(regex);
????}

????public?static?void?add(Class?clazz){
????????Field[]?fields?=?clazz.getDeclaredFields();

????????for?(Field?field?:?fields)?{
????????????if?(field.isAnnotationPresent(Value.class)){
????????????????Value?annotation?=?field.getAnnotation(Value.class);
????????????????String?annoValue?=?annotation.value();
????????????????if?(!pattern.matcher(annoValue).matches())
????????????????????continue;

????????????????annoValue=annoValue.replace("${","");
????????????????annoValue=annoValue.substring(0,annoValue.length()-1);

????????????????Map?clazzMap?=?Optional.ofNullable(pool.get(annoValue))
????????????????????????.orElse(new?HashMap<>());
????????????????clazzMap.put(clazz,field.getName());
????????????????pool.put(annoValue,clazzMap);
????????????}
????????}
????}

????public?static?Map>?getPool()?{
????????return?pool;
????}
}

簡單說一下這塊代碼的設(shè)計思路:

  • 通過反射拿到Class對象中所有的屬性,并判斷屬性是否加了@Value注解
  • @Value如果要注入配置文件中的值,一定要符合${xxx}的格式(這里先暫時不考慮${xxx:defaultValue}這種設(shè)置了默認值的格式),所以需要使用正則表達式驗證是否符合,并校驗通過后去掉開頭的${和結(jié)尾的},獲取真正對應(yīng)的配置文件中的字段
  • VariablePool中聲明了一個靜態(tài)HashMap,用于存放所有配置文件中屬性-類-類中屬性的映射關(guān)系,接下來就要把這個關(guān)系存放到這個pool

簡單來說,變量池就是下面這樣的結(jié)構(gòu):

這里如果不好理解的話可以看看例子,我們引入兩個測試Service

@Service
public?class?UserService?{
????@Value("${person.name}")
????String?name;
????@Value("${person.age}")
????Integer?age;
}

@Service
public?class?UserDeptService?{
????@Value("${person.name}")
????String?pname;
}

在所有Class執(zhí)行完add方法后,變量池pool中的數(shù)據(jù)是這樣的:

可以看到在pool中,person.name對應(yīng)的內(nèi)層Map中包含了兩條數(shù)據(jù),分別是UserService中的name字段,以及UserDeptService中的pname字段。

4、EnvInitializer

VariablePool封裝完所有變量數(shù)據(jù)后,ScanRunner會調(diào)用EnvInitializerinit方法,開始對yml文件進行解析,完成配置中心環(huán)境的初始化。其實說白了,這個環(huán)境就是一個靜態(tài)的HashMap,key是屬性名,value就是屬性的值。

public?class?EnvInitializer?{
????private?static?Map?envMap=new?HashMap<>();

????public?static?void?init(){
????????String?rootPath?=?EnvInitializer.class.getResource("/").getPath();
????????List?fileList?=?FileScanner.findFileByType(rootPath,null,FileScanner.TYPE_YML);
????????for?(String?ymlFilePath?:?fileList)?{
????????????rootPath?=?FileScanner.getRealRootPath(rootPath);
????????????ymlFilePath?=?ymlFilePath.replace(rootPath,?"");
????????????YamlMapFactoryBean?yamlMapFb?=?new?YamlMapFactoryBean();
????????????yamlMapFb.setResources(new?ClassPathResource(ymlFilePath));
????????????Map?map?=?yamlMapFb.getObject();
????????????YamlConverter.doConvert(map,null,envMap);
????????}
????}

????public?static?void?setEnvMap(Map?envMap)?{
????????EnvInitializer.envMap?=?envMap;
????}
????public?static?Map?getEnvMap()?{
????????return?envMap;
????}
}

首先還是使用FileScanner掃描根目錄下所有的.yml結(jié)尾的文件,并使用spring自帶的YamlMapFactoryBean進行yml文件的解析。但是這里有一個問題,所有yml文件解析后都會生成一個獨立的Map,需要進行Map的合并,生成一份配置信息表。至于這一塊具體的操作,都交給了下面的YamlConverter進行處理。

我們先進行一下演示,準備兩個yml文件,配置文件一:application.yml

spring:
??application:
????name:?hermit-purple
server:
??port:?6879
person:
??name:?Hydra
??age:?18

配置文件二:config/test.yml

my:
??name:?John
??friend:
????name:?Jay
????sex:?male
run:?yeah

先來看一看環(huán)境完成初始化后,生成的數(shù)據(jù)格式是這樣的:

5、YamlConverter

YamlConverter主要實現(xiàn)的方法有三個:

  • doConvert():將EnvInitializer中提供的多個Map合并成一個單層Map
  • monoToMultiLayer():將單層Map轉(zhuǎn)換為多層Map(為了生成yml格式字符串)
  • convert():yml格式的字符串解析為Map(為了判斷屬性是否發(fā)生變化)

由于后面兩個功能暫時還沒有涉及,我們先看第一段代碼:

public?class?YamlConverter?{
????public?static?void?doConvert(Map?map,String?parentKey,Map?propertiesMap){
????????String?prefix=(Objects.isNull(parentKey))?"":parentKey+".";
????????map.forEach((key,value)->{
????????????if?(value?instanceof?Map){
????????????????doConvert((Map)value,prefix+key,propertiesMap);
????????????}else{
????????????????propertiesMap.put(prefix+key,value);
????????????}
????????});
????}
?//...
}????

邏輯也很簡單,通過循環(huán)遍歷的方式,將多個Map最終都合并到了目的envMap中,并且如果遇到多層Map嵌套的情況,那么將多層Map的key通過點.進行了連接,最終得到了上面那張圖中樣式的單層Map。

其余兩個方法,我們在下面使用到的場景再說。

6、ConfigController

ConfigController作為控制器,用于和前端進行交互,只有兩個接口saveget,下面分別介紹。

get

前端頁面在開啟時會調(diào)用ConfigController中的get接口,填充到textArea中。先看一下get方法的實現(xiàn):

@GetMapping("get")
public?String?get(){
????ObjectMapper?objectMapper?=?new?ObjectMapper(new?YAMLFactory());
????String?yamlContent?=?null;
????try?{
????????Map?envMap?=?EnvInitializer.getEnvMap();
????????Map?map?=?YamlConverter.monoToMultiLayer(envMap,?null);
????????yamlContent?=?objectMapper.writeValueAsString(map);
????}?catch?(Exception?e)?{
????????e.printStackTrace();
????}
????return?yamlContent;
}

之前在項目啟動時,就已經(jīng)把配置文件屬性封裝到了EnvInitializerenvMap中,并且這個envMap是一個單層的Map,不存在嵌套關(guān)系。但是我們這里要使用jackson生成標準格式的yml文檔,這種格式不符合要求,需要將它還原成一個具有層級關(guān)系的多層Map,就需要調(diào)用YamlConvertermonoToMultiLayer()方法。

monoToMultiLayer()方法的代碼有點長,就不貼在這里了,主要是根據(jù)key中的.進行拆分并不斷創(chuàng)建子級的Map,轉(zhuǎn)換完成后得到的多層Map數(shù)據(jù)如下:

在獲得這種格式后的Map后,就可以調(diào)用jackson中的方法將Map轉(zhuǎn)換為yml格式的字符串傳遞給前端了,看一下處理完成后返回給前端的字符串:

save

在前端頁面修改了yml內(nèi)容后點擊保存時,會調(diào)用save方法保存并更新配置,方法的實現(xiàn)如下:

@PostMapping("save")
public?String?save(@RequestBody?Map?newValue)?{
????String?ymlContent?=(String)?newValue.get("yml");
????PropertyTrigger.change(ymlContent);
????return?"success";
}

在拿到前端傳過來的yml字符串后,調(diào)用PropertyTriggerchange方法,實現(xiàn)后續(xù)的更改邏輯。

7、PropertyTrigger

在調(diào)用change方法后,主要做的事情有兩件:

  • 修改EnvInitializer中的環(huán)境envMap,用于前端頁面刷新時返回新的數(shù)據(jù),以及下一次屬性改變時進行對比使用
  • 修改bean中屬性的值,這也是整個配置中心最重要的功能

先看一下代碼:

public?class?PropertyTrigger?{
????public?static?void?change(String?ymlContent)?{
????????Map?newMap?=?YamlConverter.convert(ymlContent);
????????Map?oldMap?=?EnvInitializer.getEnvMap();

????????oldMap.keySet().stream()
????????????????.filter(key->newMap.containsKey(key))
????????????????.filter(key->!newMap.get(key).equals(oldMap.get(key)))
????????????????.forEach(key->{
????????????????????System.out.println(key);
????????????????????Object?newVal?=?newMap.get(key);
????????????????????oldMap.put(key,?newVal);
????????????????????doChange(key,newVal);
????????????????});
????????EnvInitializer.setEnvMap(oldMap);
????}

????private?static?void?doChange(String?propertyName,?Object?newValue)?{
????????System.out.println("newValue:"+newValue);
????????Map>?pool?=?VariablePool.getPool();
????????Map?classProMap?=?pool.get(propertyName);

????????classProMap.forEach((clazzName,realPropertyName)->{
????????????try?{
????????????????Object?bean?=?SpringContextUtil.getBean(clazzName);
????????????????Field?field?=?clazzName.getDeclaredField(realPropertyName);
????????????????field.setAccessible(true);
????????????????field.set(bean,?newValue);
????????????}?catch?(NoSuchFieldException?|?IllegalAccessException?e)?{
????????????????e.printStackTrace();
????????????}
????????});
????}
}

前面鋪墊了那么多,其實就是為了實現(xiàn)這段代碼中的功能,具體邏輯如下:

  • 調(diào)用YamlConverterconvert方法,將前端傳來的yml格式字符串解析封裝成單層Map,數(shù)據(jù)格式和EnvInitializer中的envMap相同
  • 遍歷舊的envMap,查看其中的key在新的Map中對應(yīng)的屬性值是否發(fā)生了改變,如果沒有改變則不做之后的任何操作
  • 如果發(fā)生改變,用新的值替換envMap中的舊值
  • 通過屬性名稱,從VariablePool中拿到涉及改變的Class,以及類中的字段Field。并通過后面的SpringContextUtil中的方法獲取到這個bean的實例對象,再通過反射改變字段的值
  • 將修改后的Map寫回EnvInitializer中的envMap

到這里,就實現(xiàn)了全部的功能。

8、SpringContextUtil

SpringContextUtil通過實現(xiàn)ApplicationContextAware接口獲得了spring容器,而通過容器的getBean()方法就可以容易的拿到spring中的bean,方便進行后續(xù)的更改操作。

@Component
public?class?SpringContextUtil?implements?ApplicationContextAware?{
????private?static?ApplicationContext?applicationContext;
????@Override
????public?void?setApplicationContext(ApplicationContext?applicationContext)?throws?BeansException?{
????????this.applicationContext?=?applicationContext;
????}
????public?static??T?getBean(Class?t)?{
????????return?applicationContext.getBean(t);
????}
}

9、前端代碼

至于前端代碼,就是一個非常簡單的表單,代碼的話可以移步git查看。

最后

到這里全部的代碼介紹完了,最后做一個簡要的總結(jié)吧,雖然通過這幾個類能夠?qū)崿F(xiàn)一個簡易版的配置中心功能,但是還有不少的缺陷,例如:

  • 沒有處理@ConfigurationProperties注解
  • 只處理了yml文件,沒有處理properties文件
  • 目前處理的bean都是基于singleton模式,如果作用域為prototype,也會存在問題
  • 反射性能低,如果某個屬性涉及的類很多會影響性能
  • 目前只能代碼嵌入到項目中使用,還不支持獨立部署及遠程注冊功能
  • ……

總的來說,后續(xù)需要完善的點還有不少,真是感覺任重道遠。

項目git地址:

https://github.com/trunks2008/hermit-purple-config

1.?不是我吹,這款 IDEA 插件你真沒用過!

2.?抗住千萬流量的大型分布式系統(tǒng)架構(gòu)設(shè)計

3.?網(wǎng)傳鐵飯碗職業(yè)排名,公務(wù)員僅排第八!

4.?Vue涉及國家安全漏洞?尤雨溪親自回應(yīng)

最近面試BAT,整理一份面試資料Java面試BATJ通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

獲取方式:點“在看”,關(guān)注公眾號并回復?Java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

PS:因公眾號平臺更改了推送規(guī)則,如果不想錯過內(nèi)容,記得讀完點一下在看,加個星標,這樣每次新文章推送才會第一時間出現(xiàn)在你的訂閱列表里。

“在看”支持小哈呀,謝謝啦??!

瀏覽 69
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 91三级片在线观看| 黄色免费在线观看视频| 亚洲成人AV在线播放| 成人免费视频网| 无码9999| 无码高潮视频| 国产无码一二三区| 五月天激情片| 成人在线看片| 波多野结衣网| 天天干天天操综合| 欧美性国产| 青春草在线视频| 国产少妇| 蜜桃传媒一区二区亚洲AV| 伊人久久免费视频| 欧美精品成人免码在线| 日韩无码影视| 开心老牛熟| 蝌蚪窝免费视频| 一级黄色性爱视频| 欧美午夜性爱视频| 三区在线观看| 中文字幕在线观看网| 精品国产午夜福利| 国内无码精品| 亚洲国产A片| 亚洲乱码国产乱码精品天美传媒 | 九色PORNY蝌蚪视频| 国产V视频| 美女自慰网站免费| 日韩欧美第一页| www.婷婷色| 男人天堂新地址| 欧美成人无码一区二区三区| 天天操天天日天天射| 中国操逼毛片| 国产一级二级片| 欧美v在线观看| 91成人一区二区| 一本大道久久久久| 午夜免费无码视频| 国产主播一区二区| 免费一级A| 91麻豆电影| 福利视频导航自拍| 蜜臀久久99精品久久久久久宅男| 午夜成人精品一区二区三区 | 又大又长又粗91| 先锋影音男人| 先锋影音男人| 日本熟妇HD| 不卡精品| 亚洲一级一级黄色| 天天干天天操天天拍| 成人性爱视频免费在线观看| 日韩AⅤ视频| 噜噜| 91在线电影| 色欲色欲一区二区三区| 在线观看不卡av| 国产91在线拍揄自揄拍无码九色| 精品国产精品三级精品AV网址| 色九九视频| 91精品国产91久久久久久吃药 | 国内久久婷婷| 艹逼免费视频| 91av无码| 免费操逼网| 北条麻妃无码| 无码中文av| 波多野结衣无码视频在线观看| 亚洲日韩视频在线观看| 日韩无码精品视频| 欧洲三级片| 牛牛AV| 成人区123| 日本一级片在线播放| 欧美大香蕉伊人网| 国产乱国产乱老熟300视频| 影音先锋AV成人| 婷婷视频导航| 色香蕉在线视频| 青青草网站在线观看| 黄色香蕉视频| 丝袜毛片| 高潮AV在线观看| 欧美一区二区三区精品| 亚洲精品成a人在线观看| 日本一级黄色电影| aaa黄片| 欧美一区二区三区在线观看| 91啪啪| av大片免费看| 欧美一区电影| 亚洲国产精品成人综合色在线婷婷| 特爽特黄特级特色视频| 日本色天堂| 国产网站免费| 人人干人人干人人干| 国产传媒_色哟哟| 国产性爱精品影片免费看| 亚色天堂| 男女日皮视频| 大香蕉精品欧美色综合2025 | 欧美性爱精品一区| 亚洲无码在线观看免费| 久久青草影院| 91人妻人人澡人人爽人人DVD| 女生自慰网站免费| 只有精品| 欧美人妻激情| 久久成人毛片| 国产精品一区在线观看| 97无码免费| 四虎在线观看视频| 欧美老女人的逼| 欧美性猛交ⅩXXX乱大交| 东北操逼视频| 亚洲无码一二区| 日本免费视频| 久久爆乳一区二区三区| 91探花秘在线播放| 999久久久久| 青青草原视频在线免费观看| av一区在线观看| 午夜资源网| 男人天堂色| 免费的A片| 最近中文字幕免费mv第一季歌词強上 | 全部在线A片免费播放| 国产av综合网| 久久精品一区二区三区不卡牛牛| 深夜福利18| 天天操b| 四川少妇搡bbbbb搡多人| 狼人亚洲伊人| 国产高清无码免费视频| 日一区二区| 天天躁夜夜躁狠狠躁AV| 99热电影| 麻豆免费成人传媒| 欧美国产日韩另类| 特级西西444www高清大胆免费看| 国产在线观看无码| 美女极度色诱图片www视频| 开心深爱激情网| 俺来也AV| 天天色免费视频| 成人影片在线观看18| 亚洲国产视频一区| 天堂AV在线免费观看| 7777影视电视剧在线观看官网 | 欧美囗交大荫蒂免费| 女人18片毛片60分钟黃菲菲| 翔田千里无码XXXXXX| 天天久久| 国产美女激情视频| 成人午夜| 国产精品香蕉| 中文字幕无码av| 亚洲无码电影视频| 国产精品一级a毛视频| 久久精品视频9| 日韩精品91| 一级A片在线观看| 国产91探花系列在线观看 | 澳门午夜| 免费内射视频| 国产黄色免费| 成人黄片在线免费观看| 亚洲二区视频| 日本高清无码在线| 天堂网在线视频| 韩日黄色| 大肉大捧一进一出免费阅读| 小视频你懂的| sesese999| 一线av| 成人无码日本动漫电影| 免看一级a毛片一片成人不卡| 国产无码中文| 一起操在线观看| 久久成人综合网| 国产无码一二三区| 五月天无码在线| 色哟哟精品| 国产一级操逼| 操逼免费视频网站| 京熱大亂交无碼大亂交| 成人啪啪视频| 人人操人人超碰| 中文字幕AV网| 青娱乐国产在线视频| 久久成人精品| 香蕉国产在线视频| 人操人操人操| 四虎高清无码| 久久毛| 韩国一区二区在线观看| 成年人视频免费看| 中国老女人操逼| 婷婷五月大香蕉| 天堂资源站| 日本无码免费视频| 国产操逼片| 国产精品欧美激情| 91三级电影| 亚洲第一av| 日本一区二区三区免费看| 亚洲国产精品VA在线看黑人 | 日韩无码影视| 无码人妻一区二区| 亚洲AV无码高清| 91香蕉视频免费在线观看| 热久久免费| 男人先锋| 黄色成人网站大全| 91精品在线免费观看| 成人欧美一区二区三区黑人免费 | 无套进入无套内谢| 制服丝袜在线视频| 3D动漫啪啪精品一区二区中文字幕| 日本三级片视频不卡| 欧美亚洲在线观看| 亚洲一级黄色视频| 亚洲性爱工厂| 国产91久久婷婷一区二区| 亚洲精品娱乐| 欧美国产综合在线| 国产激情视频网站| 天天操夜夜操狠狠操| 日本少妇高清视频| 成人日韩在线| 香蕉成人电影| 精品视频在线免费| 老司机视频在线视频18| 日本欧美一级| 手机免费AV| 夜色88V精品国产亚洲| aaa三级黄片| 国产夫妻自拍AV| 五月天色综合| 欧美日韩视频免费观看| 免费视频在线观看一区| 国产精品高潮无套内谢| 亚洲精品中文字幕乱码三区91| 农村一级婬片A片AAA毛片古装 | 精品人妻一区二区三区四区不卡在 | 久久久久黄色| 国产亚洲久一区二区写真| 免费看特别黄色视频| 日韩精品成人片| 成人无码交配视频国产网站| a视频在线| 中文字幕自拍偷拍| 亚洲小视频在线播放| 亚洲一级黄色| 亚洲品久久久蜜| 欧美成人国产| 97人妻在线视频| 偷拍三区| 人人人操人人| 亚洲天堂高清无码| 亚洲Av秘无码一区二区| 九色蝌蚪9l视频蝌蚪9l视频成人熟妇| 美国黄色A片| 黄色电影网页| 91精品国产91久久久久久久久久| 综合天堂AV久久久久久久| 国产顶级理伦| 国产精品中文字幕在线观看| 午夜福利三级| 国产精品视频免费观看| 香蕉视频啪啪啪| 欧美性爱怡红院| 美日韩毛片| 特一级黄色| 另类老妇奶BBBBwBB| 天堂久草| JUY-579被丈夫的上司侵犯后的第7天,我| 美女少妇激情BBBB| 日韩中文字幕网站| 视频一区在线观看| 中文字幕在线永久| 九色影院| 天天干天天日蜜臀色欲av| 国产亚洲三级| 亚洲综合自拍| 欧美性综合网| 躁BBB躁BBB添BBBBBB| 影视先锋久久| AV自拍偷拍| 日韩一级黄色电影| 色777色| 三级成人网| 91福利资源| 亚洲无码www| 欧美色五月| 99er在线观看| 青青草视频在线免费观看| 亚洲91无码精品一区在线播放| www四虎| 操女人逼AV| 性爱日韩| 一区二区三区在线观看| 国产精品V日韩精品V在线观看| 97A片在线观看播放| 一区二区精品视频| 波多野结衣av中文字幕| 国产在线欧美在线| 天堂网久久| 精品福利在线观看| 欧美日韩国产成人综合| 成人做爰黄A片免费看陈冠| 婷婷视频网| 日本精品在线视频| 在线视频三区| 国产熟妇毛多久久久久一区| 黄色av无码| 天天爽天天爽成人A片影院| 亚洲三级在线观看| 骚网站在线观看| 91传媒在线观看| 亚洲精品自拍偷拍| 污视频在线免费观看| av无码av天天av天天爽| 久久亚洲AV| 一级婬片A片AAAAA毛片| 男女无码视频| 国产成人内射| 做爱无码| 乱伦乱伦乱伦中文字幕| 中文字幕不卡在线| 六月婷婷五月天| 嫩BBB揍BBB揍BBB| 狠狠操一区| 99精品在线观看视频| 亚州AV天堂| 性天堂| 久久久97精品久久| 97人妻无码| av在线资源网站| 欧美日色| 日本伊人网| 日韩有码电影| 天天操夜夜操视频免费高清| 国产精品无码7777777| 中文乱码在线观看| 久99久热| 精品国产免费无码久久噜噜噜AV | 国产无码一区二区| 国产区在线| 日本少妇视频| 啪啪网站免费观看| 极品美女扒开粉嫩小泬高潮一| 丁香五月天av| 亚洲一级免费免费在线观看| 午夜AV在线观看| 亚洲无吗在线视频| 97精品国产97久久久久久免费 | 国内精品久久久久久久久久变脸| 亚洲AV成人片无码网站| 亚洲色鬼| 毛片A级成人片| 亚洲综合中文字幕在线| 久久中文字幕免费| 国产综合网站| 国产a一级a毛一级视频| 无码人妻精品一区二区三区99仓 | 九九精品99| 成人午夜A片| 喷水在线观看| 欧美A片在线免费观看| 在线看黄网站| 天天舔九色婷婷| 国产女18毛片多18精品| 国产性猛交╳XXX乱大交| 亚洲第一网站| 182av| 亚洲草逼视频| 亚洲无码字幕| 福利视频导航自拍| 国产在线观看| 一级看片免费视频| 久久久久久久人妻丝袜| 玖玖资源站中文字幕| 国产免费操逼| 欧美日韩高清无码| 精品国产AV无码一区二区三区| 国产成人AV片| 性爱日韩| 精品国产免费观看久久久_久久天天| 亚洲Av无码成人专区擼| 久热精品在线| 亚洲成人网站在线| 日韩免费AV电影| adn日韩av| 久久久精品免费| 亚州操B| 精品国产91| 男人的天堂青青草| 亚洲福利视频97| 91乱子伦国产乱| 91香蕉视频在线看| 蜜桃久久99精品久久久酒店| 免费黄片在线| 美妇肥臀一区二区三区-久久99精品国| 麻豆三级片在线观看| 国产激情内射| 99在线观看免费视频| 天天操天天日天天射| 久久成人123| 日韩大香蕉在线| 国产高清无码网站| 一级a片免费看| 天天夜夜操| 国产激情电影| 色色热| 国产无码性爱| 奶大丰满一乱一视频一区二区三区在| 日本黄色视| 91免费观看网站| 国产区在线观看| 60分钟上大床又黄又爽| 日日夜夜草| 免费a片在线观看| 国产无码小视频| 日本无码片| 欧美一级A| 亚洲欧美日韩动漫| 日韩成人黄色视频| 一区二区三区四区免费| 夜夜骚av.一区二区三区四区| 插插插插网| 靠逼久久| 亚洲黄色一级电影| 国产十欧洲十美国+亚洲一二三区在线午夜 | 激情五月婷婷丁香| 一级草逼| 免费看成人747474九号视频在线观看| 国产高清无码18| 欧美一级操逼视频| 波多野结衣不卡| 欧美日逼网| 青娱乐成人在线视频| 高潮视频在线观看| 久久久久亚洲AV无码麻豆| 自拍偷拍福利视频网站| 男女草逼| 一级操逼毛片| 亚洲无码色婷婷| 亚洲AV免费| 伊人国产女| 欧美被操| 制服丝袜无码| 成人久久精品| 日韩黄色一级| 国模一区二区三区| 亚洲黄片免费观看| 精东影业AV无码精品| 亚洲中文字幕无码在线观看| AV资源在线| 91精品国产99久久久久久天美 | 懂色AV| 黄色大片免费观看| 黄色动漫在线免费观看| 国产人成视频免费观看| 五月激情丁香| 久久免费在线视频| 九九射| 中文字幕精品在线免费视频观看视频| 四川BBB搡BBB搡多人乱| 欧洲AV在线| 亚洲午夜福利一区二区三区| 日逼视频免费观看| 无码99| 欧美高清另类| 欧美aa片| 亚洲vs无码秘蜜桃少妇| 国产乱伦对白| 一区二区三区四区| 日本黄色一级视频| 亚洲无码高清在线视频| se婷婷| 夜夜操免费视频| 一道本无码在线播放| 黄片网站入口| 熟女一区| 国产深夜福利| 欧美噜噜| 黄片视频链接| 日韩成人免费| 在线免费观看无码| 婷婷三级| 狼人香蕉在线视频| 波多野结衣无码AV在线| 久操视频免费在线观看| 亚洲精品自拍视频| 一级操逼视频| 亚洲无码视频网站| 69精品在线| 免费看a| 亚洲免费成人视频| 人人看人人澡| 成人毛片在线大全免费| 一级操逼视频| 四虎884| 亚洲另类天堂| 欧美国产操逼| 爆菊花综合网| 丁香婷婷五月| 日本无码专区| 激情综合久久| 日韩中文字幕视频在线观看| 成人国产精品秘欧美高清| 91在线亚洲| 成人在线国产| 日韩综合在线视频| 国产理论在线| 中文字幕二区| JlZZJLZZ亚洲美女18| 丝袜久久| 香蕉一级视频| 这里只有精品视频| 日韩高清无码不卡| 熟妇槡BBBB槡BBBB图| 中文字幕无码免费| 久久免费操| 爱爱视频免费看| 亚洲免费观看高清完整版在va线 | 91色在线| 五月天婷婷激情视频| 高潮喷水无码| 欧美性猛交XXXX乱大交| 国产精品9999| 影音先锋亚洲资源| 永久免费av| 欧美久久大香蕉| www.午夜福利| 91久久久久久久91| 亚洲欧美日韩黑料吃瓜在线观看 | 午夜神马影院| 美女网站视频黄| 国产一级A片免费看| 韩日一级17c| 亚洲黄色电影网站| 午夜无码精品一区二区三区99午 | 91视频黄| 六月丁香五月天| 日韩人妻精品中文字幕| 国产精品96久久久| 亚洲七区| 色吧综合网| A无码| 久久99久久99久久99人受| 免费十无码| 色婷久久| 国产精品99久久免费黑人人妻| 波多野结衣久久| 九九成人网站| 欧美成人午夜视频| 日本中文字幕网站| 波多野结衣在线精品| 色情五月| 大鸡巴操骚逼视频| 伊人大综合| 国产成人AV免费无码| 日韩第五页| 久草香蕉| 中文字幕日韩欧美在线| 性A免费在线播放| 色色色综合| 国产A片视频| 狠狠干干| 免费在线观看黄视频| 黄色电影天堂网| 国产精品久久久久久久牛牛| 97欧美日韩| 91久久精品国产91久久公交车 | 成人看片33x9.CC| 国产黄片在线免费观看| 五月婷婷丁香综合| 乖我硬了让老子cao你小视频| 久久另类TS人妖一区二区| 亚洲大片在线观看| 国产成人三级视频| 精品国产999久久久免费| 成人伊人AV| 欧美footjob| www.精品视频| 亚洲aⅴ| jizz免费在线观看| 国产一级性爱| 国产精品黑人ThePorn| 亚洲AV秘一区二区色盗战流出| 国产一区二区不卡| 国产福利网站| 亚洲操逼片| 亚洲AV秘无码苍井空| 国产香蕉视频在线观看| 国产麻豆精品成人免费视频| 久久亚洲AV成人无码国产野外| 亚洲四区| 双飞人妻13p| 无码视频在线观看免费| 五月天欧美性爱| 国产成人精品二三区麻豆| 欧美日韩一级A片| 久热在线精品视频| 久久肉| 麻豆精品传媒2021md| 99热国品| 黄色大片在线播放| 一区二区三区四区成人| 成人黄色一级A片| 久久色在线视频| 国产一级黄色A片| 中字无码av| 国产AV日韩AⅤ亚洲AV中文| 91逼逼| 久久久久久久香蕉视频| 一纹A片免费观看| 91成人在线| 午夜精品视频| 欧美日韩在线免费观看| 中文字幕的| 人妻少妇精品视频| 日韩人妻无码专区| 亚洲一级av| 天天插天天插| 日韩成人无码AV| 日本成人电影在线观看| 97国产精品手机| 天堂va欧美ⅴa亚洲va一夜| 国产精品人人人人| 一级草逼| 国产噜噜噜噜噜久久久久久久久| 巨爆乳肉感一区二区三区视频| 久久精品综合| 操青青| 精品乱码一区| 青青五月天| 最近中文字幕高清2019中文字幕| 老女人操逼| 内射网站| 日本一本不卡| 成人激情综合| 日本A片在线播放| 亚洲精品久久久久久久久豆丁网| jizzjizz欧美| 九九热在线精品| 大香蕉久热| 欧美午夜在线| 国产免费黄色片| 国产成人精品一区二区三区| 国产1页| 亚洲卡一卡二| 日韩激情| 99精品久久| 熟妇无码| 国产内射视频| 黄网国产手机在线观看| 秋霞久久日| 国产操穴| 国产乱国产乱老熟300视频 | 蜜臀网| 亚洲少妇熟女| 久久婷婷五月综合伊人| 亚洲网站在线播放| 国产超碰| 国内成人AV| 日本a片在线观看| 99re在线观看视频| 午夜成人毛片| 18禁在线| 国产乱子伦-区二区三区四区| 操比在线| 秋霞福利网| 国产成人综合视频| 农村少妇久久久久久久| 91视频18| 日本色色色| 国产精品成人无码免费| 亚洲乱伦网| 亚洲天堂无码在线| 亚洲视频免费| 亚洲一区二区黄色电影视频网站| 米奇7777狠狠狠狠| 久久水密桃| 伊人网在线免费视频| 日日夜夜干| 尤物在线播放| 欧洲成人在线播放| 91人妻日韩人妻无码专区精品 | 国产一级黄色A片| 台湾无码精品| 尤物网站在线观看| 婷婷狠狠爱| 久久午夜一级A片| 3p绿帽黑人看自己老婆| 丰满少妇在线观看网站| 精品一区在线| AV中文在线| 99精品六月婷婷综合在线| 啪啪啪av| 成人才看的在线视频| 国产成人秘在线观看免费网站 | 亚洲无码av在线播放| 无码人妻一区二区三区| 国产无码专区| 人妻中文字幕网| 在线91视频| 男人午夜网站| 黄色无码在线观看| 99热在线只有精品| A片免费播放| 你懂的在线观看| 亚洲成人AV在线| 38D蜜桃臀| 日本一级黄色电影| 五月天婷婷视频| 一级黄色A片| 日本一区二区三区免费看| 嫩草99| 国产69视频在线观看| 在线视频一区二区| 三级片网站在线观看| 超碰人人在线观看| 久操免费在线视频| 五月激情丁香| 91福利在线观看| 亚洲无码电影视频| 五月丁香亚洲综合| 黄色一级小说| 草逼逼| 在线观看网址你懂的| 黄片日逼视频| 亚洲成人视频在线免费观看| 99在线精品视频免费观看20| 波多野结衣AV在线播放| 日韩A片| av大片在线观看| 青青青国产在线| 中文久久久| 亚洲狼人天堂| 欧美亚洲黄片| 在线观看一区| 一级视频免费观看| 色播国产成人AV| 操学生妹| 欧美日比视频| 日本人妻中文字幕| 国产精品怡红院有限公司| 国产区视频| 97精品人妻一区二区| 日本一区二区三区免费观看| 波多野结衣在线无码| 女生自慰在线观看| 日本一级黄色电影网| 肏屄视频在线看| 婷婷久久综合久| 肏屄视频在线| 五月AV| 人人妻人人操人人爱| 99热官方网站| 国产精品自拍三级| 99精品无码| 欧美成人网站在线观看| 波多野结衣av在线观看窜天猴 | 伊人色色| 久久日韩操| 人妻无码精品蜜桃| 久久精品免费电影| 欧美一区二区三区免费| 日韩在线电影| 大香蕉伊人| 欧美日韩一区二区三区视频| 自拍三区| 亚洲欧美网站| 久久人爽| 91在线观看| 亚洲欧洲自拍| AV无码一区二区三区| 黄片99| 7799精品视频| 色色欧美色色| 竹菊av一区二区三区四区五区| 亚洲午夜精品成人毛片| 日韩中字幕无码| 亚洲成色A片77777在线小说| 亚洲国产精品久久久| 黄片在线免费观看| 久久久无码AV| 99天天操| 亚洲天堂一区二区三区| 亚洲天堂在线视频| 91AV在线观看视频| 91成人视频在线免费观看| 一级日逼| 99在线观看| 日韩AV网站在线观看| 欧美婬乱片A片AAA毛片地址| 国产精品av在线| 神马午夜福利| 日日操天天| 亚洲精品视频免费观看| 人人操在线观看| 色眯眯久久爱| 欧美一级高清片免费一级a| 嫩BX区二区三区的区别| 日本中文字幕在线视频| 91搞一搞| 秘蜜桃色一区二区三区在线观看| 豆花AV在线| 欧美一级内射| 婷婷成人五月天| 中文字幕av久久爽爽| 日本a片在线观看| 亚洲中文字幕av| 国产91丝袜在线播放| 日韩爱爱爱| 悠悠色影院| 国产青娱乐在线视频| www.欧美视频| 无码精品视频在线观看| 91av视频| 自慰一区二区| 男女啊啊啊| 国产小视频在线播放| 亚洲无码在线播放| 男人天堂中文字幕| 99精品国产热久久91色欲| 激情综合久久| 天天干天天操| 四虎av在线播放| 嫩小槡BBBB槡BBBB槡免费-百度 | 天堂在线9| 国产精品三级在线观看| 天天色天天日| 亚洲av资源在线观看| 亚洲中文字幕不卡| 无码免费高清| 国产女18毛片多18精品| 国产传媒视频| 91大神在线免费看| 黄片网站在线免费观看| 久久草大香蕉| 操操影院| 大鸡巴久久久久| 欧美在线v| 人妻在线观看| 男人的天堂婷婷| 欧美成人免费A级在线观看| 成人毛片在线观看| 先锋影音亚洲AV每日资源网站 | 91白浆肆意四溢456| 91久久午夜无码鲁丝片久久人妻| 99热黄| 精品视频在线观看| 国产精品人人| 91精品国产99久久久久久天美 | 激情人妻AV| 久久久在线| 无码人妻一区二区三区三| 日韩无码字幕| 77777色| 亚洲视频在线观| 99高清无码| 欧美精品一区二区三区使用方法 | 国产少妇| 美女AV网站| 中文字幕精品人妻| 日韩免费视频在线观看| 亚洲国产精品成人综合色在线婷婷| 激情人妻AV| 国产成人精品AV| 欧美午夜电影| 日韩中文一区| 高颜值呻吟给力| 亚洲中文第一页| 高H视频在线观看| 日韩图片区小说视频区日| 国产精品日韩高清北条麻衣| 97A片在线观看播放| 熟妇私拍| 高清无码免费不卡| 青青草原AV| 二区三区在线观看| 日韩精品一区二区在线观看| AV无码在线观看| 日本在线观看www| 中国操逼| 国产換妻4P视频| 97九色| 成人黄片免费看| 伊人久久久影视大全| 一区二区三区四区在线播放| 免费无码高清| 国产精品国产三级国产|