精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

微服務中,OpenFeign應該這樣用才好!

開發 架構
本文深入研究了領域驅動設計(DDD)和微服務架構中的兩個關鍵概念:防腐層(ACL)和遠程調用的最佳實踐。在DDD中,我們學習了如何使用ACL來隔離外部依賴,降低系統耦合度。

大家好,我是飄渺。在今天的DDD與微服務系列文章中,讓我們探討如何在DDD的分層架構中調用第三方服務以及在微服務中使用OpenFeign的最佳實踐。

1. DDD中的防腐層

在應用服務中,經常需要調用外部服務接口來實現某些業務功能,這就在代碼層面引入了對外部系統的依賴。例如,下面這段轉賬的代碼邏輯需要調用外部接口服務RemoteService來獲取匯率。

public class TransferServiceImpl implements TransferService{
 private RemoteService remoteService;
 @Override
  public void transfer(Long sourceUserId, String targetUserId, BigDecimal targetAmount){
  //...
  ExchangeRateRemote exchangeRate = remoteService.getExchangeRate(
sourceAccount.getCurrency(), targetCurrency);
  BigDecimal rate = exchangeRate.getRate();
  }
   //...
}

這里可以看到,TransferService強烈依賴于RemoteService和ExchangeRateRemote對象。如果外部服務的方法或ExchangeRateRemote字段發生變化,都會影響到ApplicationService的代碼。當有多個服務依賴此外部接口時,遷移和改造的成本將會巨大。同時,外部依賴的兜底、限流和熔斷策略也會受到影響。

在復雜系統中,我們應該盡量避免自己的代碼因為外部系統的變化而修改。那么如何實現對外部系統的隔離呢?答案就是引入防腐層(Anti-Corruption Layer,簡稱ACL)。

1.1 什么是防腐層

在許多情況下,我們的系統需要依賴其他系統,但被依賴的系統可能具有不合理的數據結構、API、協議或技術實現。如果我們強烈依賴外部系統,就會導致我們的系統受到“腐蝕”。在這種情況下,通過引入防腐層,可以有效地隔離外部依賴和內部邏輯,無論外部如何變化,內部代碼盡可能保持不變。

圖片圖片

防腐層不僅僅是一層簡單的調用封裝,在實際開發中,ACL可以提供更多強大的功能:

  • 適配器: 很多時候外部依賴的數據、接口和協議并不符合內部規范,通過適配器模式,可以將數據轉化邏輯封裝到ACL內部,降低對業務代碼的侵入。
  • 緩存: 對于頻繁調用且數據變更不頻繁的外部依賴,通過在ACL里嵌入緩存邏輯,能夠有效的降低對于外部依賴的請求壓力。同時,很多時候緩存邏輯是寫在業務代碼里的,通過將緩存邏輯嵌入ACL,能夠降低業務代碼的復雜度。
  • 兜底: 如果外部依賴的穩定性較差,提高系統穩定性的策略之一是通過ACL充當兜底,例如在外部依賴出問題時,返回最近一次成功的緩存或業務兜底數據。這種兜底邏輯通常復雜,如果散布在核心業務代碼中,會難以維護。通過集中在ACL中,更容易進行測試和修改。
  • 易于測試: ACL的接口類能夠很容易的實現Mock或Stub,以便于單元測試。
  • 功能開關: 有時候,我們希望在某些場景下啟用或禁用某個接口的功能,或者讓某個接口返回特定值。我們可以在ACL中配置功能開關,而不會影響真實的業務代碼。

1.2 如何實現防腐層

實現ACL防腐層的步驟如下:

  • 對于依賴的外部對象,我們提取所需的字段,并創建一個內部所需的DTO類。
  • 構建一個新的Facade,在Facade中封裝調用鏈路,將外部類轉化為內部類。Facade可以參考Repository的實現模式,將接口定義在領域層,而將實現放在基礎設施層。
  • 在ApplicationService中依賴內部的Facade對象。

具體實現如下:

// 自定義的內部值類
@Data
public class ExchangeRateDTO {
  ...
}

// 稅率Facade接口
public interface ExchangeRateFacade {
    ExchangeRateDTO getExchangeRate(String sourceCurrency, String targetCurrency);
}

// 稅率facade實現
@Service
public class ExchangeRateFacadeImpl implements ExchangeRateFacade {

    @Resource
    private RemoteService remoteService;

    @Override
    public ExchangeRateDTO getExchangeRate(String sourceCurrency, String targetCurrency) {
        ExchangeRateRemote exchangeRemote = remoteService.getExchangeRate(sourceCurrency, targetCurrency);
        if (exchangeRemote != null) {
            ExchangeRateDTO dto = new ExchangeRateDTO();
            dto.setXXX(exchangeRemote.getXXX());
            return dto;
        }
        return null;
    }
}

通過ACL改造后,我們的ApplicationService代碼如下:

public class TransferServiceImpl implements TransferService{
 private ExchangeRateFacade exchangeRateFacade;
 @Override
  public void transfer(Long sourceUserId, String targetUserId, BigDecimal targetAmount){
  ...
  ExchangeRateDTO exchangeRate = exchangeRateFacade.getExchangeRate(
sourceAccount.getCurrency(), targetCurrency);
  BigDecimal rate = exchangeRate.getRate();
   }
  ...
}

這樣,經過ACL改造后,ApplicationService的代碼已不再直接依賴外部的類和方法,而是依賴我們自己內部定義的值類和接口。如果未來外部服務發生任何變化,只需修改Facade類和數據轉換邏輯,而不需要修改ApplicationService的邏輯。

1.3 小結

在沒有防腐層ACL的情況下,系統需要直接依賴外部對象和外部調用接口,調用邏輯如下:

圖片圖片

而有了防腐層ACL后,系統只需要依賴內部的值類和接口,調用邏輯如下:

圖片圖片

2. 微服務中的遠程調用

在構建微服務時,我們經常需要跨服務調用,例如在DailyMart系統中,購物車服務需要調用商品服務以獲取商品詳細信息。理論上,我們可以遵循上述ACL的實現邏輯,在購物車模塊創建Facade接口和內部轉換類。然而,在實際開發中,由于是內部系統,差異性不太明顯,通常可以直接使用OpenFeign進行遠程調用,忽略Facade定義和內部類轉換的過程。

以下是在微服務中使用OpenFeign實現跨服務調用的過程:

  • 首先,在購物車模塊的基礎設施層創建一個接口,并使用@FeignClient注解進行標注。
@FeignClient("product-service")
public interface ProductRemoteFacade {

    @GetMapping("/api/product/spu/{spuId}")
    Result<ProductRespDTO> getProductBySpuId(@PathVariable("spuId") Long spuId);

}

需要注意的是,我們在商品服務中對外提供的商品詳情接口定義返回的是ProductRespDTO對象,但通過OpenFeign調用時返回的是Result對象。

@Operation(summary = "查詢商品詳情")
@Parameter(name = "spuId", description = "商品spuId")
@GetMapping("/api/product/spu/{spuId}")
public ProductRespDTO getProductBySpuId(@PathVariable("spuId") Long spuId) {
 return productRemoteFacade.getProductBySpuId(spuId);
}

這是因為在前文中,我們定義了一個全局的包裝類GlobalResponseBodyAdvice,會自動給所有接口封裝返回對象Result。因此,在定義Feign接口時,也需要使用Result對象來接收。如果對此邏輯不太清晰,建議參考第七章的內容。

  • 在啟動類上添加@EnableFeignClient注解
@SpringBootApplication
@EnableFeignClients("com.jianzh5.dailymart.module.cart.infrastructure.acl")
public class CartApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(CartApplication.class, args);
    }
    
}
  • 在應用服務中注入Feign接口并使用
@Override
public void getShoppingCartDetail(Long cartId) {
 ShoppingCart shoppingCart = shoppingCartRepository.find(new CartId(cartId));
  
 Result<ProductRespDTO> productRespResult = productRemoteFacade.getProductBySpuId(1L);
  
  // 從Result對象中獲取真實的業務對象
 if(productRespResult.getCode().equals("OK")){
  ProductRespDTO data = productRespResult.getData();
 }

}

如上所示,我們可以看到,每次調用Feign接口都需要解析Result對象以獲取真正的業務對象。這種代碼看起來有些冗余,是否有辦法去除呢?

2.1 自定義Feign的解碼器

這時,我們可以通過重寫Feign的解碼器來實現,在解碼器中完成封裝對象的拆解。

@RequiredArgsConstructor
public class DailyMartResponseDecoder implements Decoder {

    private final ObjectMapper objectMapper;
    @Override
    public Object decode(Response response, Type type) throws IOException, FeignException {
        Result<?> result = objectMapper.readValue(response.body().asInputStream(), objectMapper.constructType(Result.class));
        if(result.getCode().equals("OK")){
            Object data = result.getData();
            JavaType javaType = TypeFactory.defaultInstance().constructType(type);
            return objectMapper.convertValue(data, javaType);
        }else{
            throw new RemoteException(result.getCode(), result.getMessage());
        }
    }
}

同時,創建一個配置類,替換原生的解碼器。

@Bean
public Decoder feignDecoder(){
 return new DailyMartResponseDecoder(objectMapper);
}

這樣,在定義或調用OpenFeign接口時,直接使用原生對象ProductRespDTO即可。

@FeignClient("product-service")
public interface ProductRemoteFacade {

    @GetMapping("/api/product/spu/{spuId}")
    ProductRespDTO getProductBySpuId(@PathVariable("spuId") Long spuId);

}

...

@Override
public void getShoppingCartDetail(Long cartId) {
 ShoppingCart shoppingCart = shoppingCartRepository.find(new CartId(cartId));

 ProductRespDTO productRespResult = productRemoteClient.getProductBySpuId(1L);

}

2.2 上游異常統一處理

在使用OpenFeign進行遠程調用時,如果HTTP狀態碼為非200,OpenFeign會觸發異常解析并進入默認的異常解碼器feign.codec.ErrorDecoder,將業務異常包裝成FeignException。此時,如果不做任何處理,調用時可以返回的消息會變成FeignException的消息體,如下所示:

圖片圖片

顯然,這個包裝后的異常我們不需要,應該直接將捕獲到的生產者的業務異常拋給前端。那么,如何解決這個問題呢?

可以通過重寫OpenFeign的默認異常解碼器來實現,代碼如下:

@RequiredArgsConstructor
@Slf4j
public class DailyMartFeignErrorDecoder implements ErrorDecoder {

    private final ObjectMapper objectMapper;

    /**
     * OpenFeign的異常解析
     * @author Java日知錄
     * @param methodKey 方法名
     * @param response 響應體
     */
    @Override
    public Exception decode(String methodKey, Response response) {
        try {
            Reader reader = response.body().asReader(Charset.defaultCharset());
            Result<?> result = objectMapper.readValue(reader, objectMapper.constructType(Result.class));
            return new RemoteException(result.getCode(),result.getMessage());
        } catch (IOException e) {
            log.error("Response轉換異常",e);
            throw new RemoteException(ErrorCode.FEIGN_ERROR);
        }

    }
}

此異常解碼器直接將異常轉化為自定義的RemoteException,表示遠程調用異常。

當然,還需要在配置類中注入此異常解碼器。

2.3 Feign全局異常處理

在2.2小節中,我們拋出了自定義的業務異常,然而OpenFeign處理響應時會捕獲到業務異常并將其轉換成DecodeException。

圖片圖片

由于DailyMart中的全局異常處理器沒有單獨處理DecodeException,它會被兜底異常處理器攔截,并返回類似“系統異常,請聯系管理員”的錯誤提示。

因此,要完全使用上游系統的業務異常,還需要定義一個單獨的異常處理器來處理DecodeException。這個處理器可以與全局異常處理器分開,代碼如下:

/**
 * Feign的全局異常處理,與常規的全局異常處理類分開
 * @author Java日知錄
 */
@RestControllerAdvice
@Slf4j
@Order(Ordered.HIGHEST_PRECEDENCE) // 優先級
@ResponseStatus(code = HttpStatus.BAD_REQUEST) // 統一 HTTP 狀態碼
public class DailyMartFeignExceptionHandler {
    
    @ExceptionHandler(FeignException.class)
    public Result<?> handleFeignException(FeignException e) {
        return new Result<Void>()
                .setCode(ErrorCode.REMOTE_ERROR.getCode())
                .setMessage(e.getMessage())
                .setTimestamp(System.currentTimeMillis());
    }
    
    @ExceptionHandler(DecodeException.class)
    public Result<?> handleDecodeException(DecodeException e) {
        Throwable cause = e.getCause();
        if (cause instanceof AbstractException) {
            RemoteException remoteException = (RemoteException) cause;
            // 上游符合全局響應包裝約定的再次拋出即可
            return new Result<Void>()
                    .setCode(remoteException.getCode())
                    .setMessage(remoteException.getMessage())
                    .setTimestamp(System.currentTimeMillis());
        }
        // 全部轉換成RemoteException
        return new Result<Void>()
                .setCode(ErrorCode.REMOTE_ERROR.getCode())
                .setMessage(e.getMessage())
                .setTimestamp(System.currentTimeMillis());
    }
    
}

如此一來,框架會自動將業務異常傳遞給調用服務,業務中也無需關心全局包裝的拆解問題,這就是OpenFeign遠程調用的最佳實踐。當然,在DailyMart中可能有許多服務都需要遠程調用,我們可以將上述內容構建成一個通用的Starter模塊,以便其他業務模塊共享。

圖片圖片

小結

本文深入研究了領域驅動設計(DDD)和微服務架構中的兩個關鍵概念:防腐層(ACL)和遠程調用的最佳實踐。在DDD中,我們學習了如何使用ACL來隔離外部依賴,降低系統耦合度。在微服務架構中,我們探討了如何通過OpenFeign來實現跨服務調用,并解決了全局包裝和異常處理的問題,希望本文的內容對您在軟件開發項目中有所幫助。

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2023-09-22 16:22:13

IntegerJava

2023-03-29 15:01:43

微服務開發

2022-09-27 15:06:07

微服務架構開發

2022-12-05 09:08:12

微服務灰度發布

2019-08-29 08:00:00

微服務架構服務網格

2019-01-10 13:17:15

微服務容器微服務架構

2024-04-03 12:14:15

微服務架構監控

2024-12-17 08:20:50

2017-08-16 09:03:33

云計算微服務用例

2022-07-26 09:48:55

微服務服務AKF

2025-03-21 08:55:36

SpringOpenFeignAPI

2025-09-22 09:31:34

2019-07-28 20:38:33

2020-09-16 09:08:49

訂單微服務架構

2019-09-29 10:29:02

緩存模式微服務架構

2022-06-05 13:51:47

SentinelOpenFeign服務熔斷

2023-04-03 17:43:47

gRPCOpenFeign微服務

2024-05-17 13:48:19

2019-01-21 10:50:07

微服務架構開發

2024-01-02 08:35:17

微服務版本管理
點贊
收藏

51CTO技術棧公眾號

国产在线成人精品午夜| 男女污污视频网站| 在线免费观看的av网站| 国产麻豆成人精品| 2019中文字幕在线| 欧美性生交大片| 国产成人精品福利| 欧美在线视频全部完| 国产日韩第一页| 青青草在线播放| 国产成a人亚洲| 国产精品久久久久久婷婷天堂| 国产亚洲小视频| 日本高清免费电影一区| 亚洲国语精品自产拍在线观看| 欧美精品久久久久久久久25p| 91福利在线尤物| 中文字幕一区二区视频| 欧美成人一区二区在线| 亚洲精品一区二区三区新线路| 日韩成人一级片| 91精品国产91久久久久| 久久高清内射无套| 日韩在线观看一区| 亚洲精品中文字幕有码专区| 亚洲成人激情小说| 欧美在线一级| 色综合天天天天做夜夜夜夜做| 久久久久久久香蕉| 素人av在线| 国产亚洲精品精华液| 狠狠色综合色区| 亚洲第一天堂影院| 国产一区91精品张津瑜| 国产精品亚洲片夜色在线| 国产99免费视频| 免费亚洲婷婷| 6080yy精品一区二区三区| 免费在线观看国产精品| 欧美91视频| 另类色图亚洲色图| 午夜精品一区二区三级视频| 精品盗摄女厕tp美女嘘嘘| 日韩精品极品在线观看播放免费视频 | 精品高清美女精品国产区| 337p亚洲精品色噜噜狠狠p| 成人影院在线观看| 亚洲美腿欧美偷拍| 99re99热| 深夜国产在线播放| 亚洲一区二区三区在线播放| 无码人妻精品一区二区蜜桃网站| av黄色在线| 亚洲一区二区中文在线| 国产九色porny| www在线看| 欧美日韩另类在线| 国产精品亚洲αv天堂无码| 色老太综合网| 欧美日韩另类一区| 久久人人爽人人片| 国产精品欧美大片| 日韩精品极品在线观看| www在线观看免费视频| 国产一区毛片| www.久久久久| 欧美性猛交xxxxx少妇| 午夜久久福利| 97精品视频在线| 日韩av免费播放| 老汉av免费一区二区三区| 成人精品一区二区三区| 亚洲国产精品无码久久| 91在线精品秘密一区二区| 日本视频一区二区不卡| 欧美成人精品一区二区男人看| 亚洲欧美区自拍先锋| 欧美一区二区视频在线播放| 都市激情亚洲一区| 欧美日韩美少妇 | 久久久久久久综合| 亚洲欧洲一区二区| 免费在线看电影| 一本大道综合伊人精品热热| 日韩在线一区视频| 大桥未久女教师av一区二区| 亚洲视频欧洲视频| 精品无码久久久久成人漫画| 国产欧美另类| 成人午夜黄色影院| 桃花色综合影院| ...中文天堂在线一区| 日韩亚洲欧美视频| 51一区二区三区| 欧美大片一区二区三区| 制服 丝袜 综合 日韩 欧美| 91成人超碰| 青青草国产精品一区二区| 国产乱码精品一区二区三区精东| 99riav一区二区三区| 中国成人亚色综合网站| 亚洲一级少妇| 日韩一区二区三区观看| 少妇av片在线观看| 亚洲福利一区| 成人网页在线免费观看| 青青操视频在线| 夜色激情一区二区| 黄色在线视频网| 欧美人妖在线观看| 欧美成年人视频网站| 亚洲欧美一二三区| av亚洲精华国产精华| 中文字幕日韩精品一区二区| 色综合一本到久久亚洲91| 精品少妇一区二区三区免费观看| 美国一级黄色录像| 国产精品日韩久久久| 91免费看网站| a视频网址在线观看| 欧美性猛交xxxx偷拍洗澡| 久久久久中文字幕亚洲精品| 日韩国产欧美| 国产精品久久久av久久久| 天天摸天天干天天操| 一区二区三区四区蜜桃| 亚洲欧美日本一区二区三区| 国产精品最新| 欧美在线性爱视频| 亚州男人的天堂| 精品毛片网大全| 欧亚乱熟女一区二区在线| 国产字幕视频一区二区| 91亚色免费| 97caopron在线视频| 69堂国产成人免费视频| 五月天免费网站| 麻豆专区一区二区三区四区五区| 视频一区不卡| 久久99国产精品二区高清软件| 亚洲欧美一区二区三区久久 | 91精品国产综合久久婷婷香蕉| 少妇一级黄色片| 美腿丝袜亚洲三区| 日日骚一区二区网站| 亚洲成人av观看| 中文字幕亚洲第一| 又色又爽又黄无遮挡的免费视频| 国产精品三级久久久久三级| 无限资源日本好片| 97精品中文字幕| 91久久久久久久久久久久久| 18+视频在线观看| 欧美www视频| 永久免费看片在线播放| 99re亚洲国产精品| 999精品网站| 成人羞羞网站入口| 91九色国产视频| 性欧美videoshd高清| 亚洲成人免费在线视频| 日本特黄特色aaa大片免费| av在线综合网| 粉嫩虎白女毛片人体| 欧美日韩中文字幕一区二区三区 | 国产精品tv| 欧美尤物巨大精品爽| 国产小视频免费在线网址| 欧美熟乱第一页| 欧美性x x x| aaa亚洲精品| 狠狠热免费视频| 亚洲精品久久久| 国产在线欧美日韩| 日韩精品影片| 欧美日韩xxx| 深夜福利在线视频| 欧美日韩不卡在线| 免费一级特黄特色大片| 国产午夜三级一区二区三| 手机在线国产视频| 国产视频亚洲| 制服国产精品| 无码日韩精品一区二区免费| 国产精品自在线| 波多野结衣中文在线| 原创国产精品91| 国产91麻豆视频| 欧美亚洲一区二区在线| 久久国产精品二区| 国产校园另类小说区| caopor在线| 经典一区二区三区| 国产三区在线视频| 欧美日韩久久| 亚洲国产精品久久久久久女王| 51vv免费精品视频一区二区 | 成人搞黄视频| 国产精品极品美女粉嫩高清在线| 日本高清在线观看视频| 中文字幕精品一区久久久久| 人妻无码中文字幕免费视频蜜桃| 欧美日韩电影一区| 香蕉影院在线观看| 亚洲国产一区二区三区| 91香蕉国产视频| 91蜜桃网址入口| 99riav国产精品视频| 老司机一区二区| 成人免费xxxxx在线视频| 欧美午夜免费影院| www亚洲国产| 日韩精品免费一区二区在线观看| 国产综合色一区二区三区| 日本一区精品视频| 国产精品偷伦视频免费观看国产 | 亚洲伦理精品| 四虎4hu永久免费入口| 欧美另类69xxxxx| 久久久久久九九| 粉嫩av一区二区| 97自拍视频| 麻豆一二三区精品蜜桃| 国产在线视频不卡| 老司机精品视频网| 国产精品电影网站| 草莓视频成人appios| 欧洲美女免费图片一区| 成人免费网站观看| 欧美激情一区二区三级高清视频| 国产黄色在线网站| 久久国产精品99国产精| 国产乱色在线观看| 操91在线视频| 粗大黑人巨茎大战欧美成人| 久久天天躁狠狠躁夜夜爽蜜月| aiai在线| zzjj国产精品一区二区| 免费黄色网址在线观看| 日韩在线www| 免费av在线播放| 久久精品国产视频| 国产在线二区| 色综合视频一区中文字幕| 视频在线观看入口黄最新永久免费国产| 欧美大胆在线视频| 污视频网站在线免费| 欧美富婆性猛交| 久久久123| 国产69精品久久久久99| 激情国产在线| 国产精品99免视看9| 成人mm视频在线观看| 国产精品揄拍500视频| 午夜不卡一区| 99九九电视剧免费观看| 超碰一区二区三区| 精品久久久久久一区| 欧美美乳视频| 亚洲国产欧美日韩| 综合一区av| 97超碰在线人人| 国模娜娜一区二区三区| 日韩午夜视频在线观看| 欧美精品色图| 国产日本欧美在线| 国内揄拍国内精品久久| 国产av天堂无码一区二区三区| 欧美中文字幕| 91视频这里只有精品| 成熟亚洲日本毛茸茸凸凹| 丰满少妇高潮一区二区| 日本一区二区不卡视频| 中文字幕视频三区| 国产精品18久久久久久久久| 91视频在线免费| 久久久国产午夜精品| 91香蕉一区二区三区在线观看| 夜夜亚洲天天久久| 无码日韩精品一区二区| 欧美日韩国产中文| 欧美一级淫片免费视频魅影视频| 亚洲欧美日韩天堂| 91麻豆一二三四在线| 136fldh精品导航福利| 精品乱码一区二区三区四区| 国产精品三区四区| 免费观看不卡av| 青青草综合视频| 视频一区二区国产| 亚洲精品国产久| 久久综合九色综合97婷婷| 欧美h片在线观看| 亚洲综合成人在线| 特一级黄色大片| 欧美丝袜丝交足nylons| av网站中文字幕| 91福利在线导航| 国产乱淫片视频| 亚洲视频在线看| 尤物yw193can在线观看| 国产99久久精品一区二区永久免费| 黄色成人小视频| 国产精品一区免费观看| 99re6这里只有精品| 男女激情无遮挡| 国内外成人在线视频| 国产精品揄拍100视频| 亚洲色图视频网| 69av视频在线观看| 亚洲激情视频在线| 亚洲男同gay网站| 国产精品日韩在线| 少妇一区二区视频| 天堂…中文在线最新版在线| 韩国理伦片一区二区三区在线播放| 免费成人深夜夜行p站| 亚洲精品水蜜桃| 国产又爽又黄又嫩又猛又粗| 精品亚洲一区二区三区| 国产在线xxx| 99理论电影网| 亚洲免费二区| 中文字幕亚洲影院| 国产精品免费人成网站| 中文字幕在线看人| 亚洲免费福利视频| 久草免费在线视频| 国产嫩草一区二区三区在线观看| 一区二区在线影院| 永久av免费在线观看| 国产精品国产馆在线真实露脸| 自拍偷拍18p| 精品亚洲一区二区三区在线观看| 欧美性受ⅹ╳╳╳黑人a性爽| 成人免费黄色网| 日韩精品欧美| 波多结衣在线观看| 国产欧美精品一区二区三区四区| 综合网在线观看| 亚洲欧美制服第一页| 亚洲欧洲自拍| 青青成人在线| 天堂成人国产精品一区| 99久久久无码国产精品性 | 亚洲第一av在线| heyzo高清在线| 国模精品一区二区三区| 国产日韩欧美一区二区三区在线观看| 日本久久久久久久久久| 亚洲va中文字幕| 天天干天天插天天操| 91av视频在线观看| 国产探花在线精品| 亚洲色图38p| 中文字幕一区二区三区不卡 | 国产污视频网站| 亚洲精品美女久久久久| 亚洲精品永久免费视频| 欧美日韩无遮挡| 日韩国产精品久久| 国产又黄又粗又猛又爽的| 91.com在线观看| av毛片在线免费看| 国产偷国产偷亚洲高清97cao| 99视频+国产日韩欧美| 给我看免费高清在线观看| 色94色欧美sute亚洲线路二| 日本最新在线视频| 91国产在线播放| 亚洲深爱激情| 在线观看免费黄色网址| 欧美一级精品大片| 美女的胸无遮挡在线观看| 欧美在线一区二区三区四区| 蜜臀久久99精品久久久久久9| 日韩在线视频免费看| 欧美一区二区三区电影| 国产啊啊啊视频在线观看| 久久久久国产精品视频| 麻豆国产精品一区二区三区| 妺妺窝人体色www聚色窝仙踪| 亚洲精品久久久久国产| 福利一区在线| 青草网在线观看| 高清国产午夜精品久久久久久| 少妇太紧太爽又黄又硬又爽| 这里只有精品视频在线| 亚洲国产高清在线观看| 久久9精品区-无套内射无码| 国产精品美女久久久久高潮| 免费av网站在线播放| 国产精品免费观看在线| 国产精品黄色| 呻吟揉丰满对白91乃国产区| 精品国产一区二区在线观看| 日韩三区在线| 国产九色porny| 日韩一区日韩二区| 牛牛澡牛牛爽一区二区|