精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产午夜精品视频免费不卡69堂| 99久久er热在这里只有精品15| 日韩视频中文字幕| 在线观看日本www| 丰满的护士2在线观看高清| aaa亚洲精品一二三区| 国产成人久久久| 国产又黄又爽又无遮挡| 三级小说欧洲区亚洲区| 欧美人妇做爰xxxⅹ性高电影| 国产传媒久久久| 蝌蚪视频在线播放| 国产精品夜夜嗨| 日本伊人精品一区二区三区介绍| 九九热视频在线免费观看| 欧美日韩一本| 91麻豆精品久久久久蜜臀| 无码人妻精品一区二区三区在线 | 蜜桃一区二区三区在线观看| 欧美激情第99页| 国产精品69久久久久孕妇欧美| 国产丝袜一区| 欧美一区二区三区在线电影| 北条麻妃视频在线| 第四色日韩影片| 亚洲色图在线看| 欧美日本韩国国产| 神马午夜在线观看| 国产揄拍国内精品对白| 国产99久久精品一区二区永久免费| 欧美精品成人久久| 91日韩免费| 国产亚洲精品久久久久动| 中文字幕在线视频播放| 日韩一区网站| 欧美日韩激情在线| 999精品视频在线| 中文字幕影音在线| 亚洲一区二区三区四区五区中文 | а√中文在线8| 国产精品乱码久久久久久| 免费看成人av| 日韩av免费观影| 99精品久久99久久久久| 99精品国产高清在线观看| 91久久久久久久久久久久| 美女网站在线免费欧美精品| 国产精品美女午夜av| 天天爱天天做天天爽| 玖玖在线精品| 日本精品一区二区三区在线| 欧美日韩一二三四区| 国产精品综合| 人妖精品videosex性欧美| 99精品在线播放| 免费日韩av片| 国产91免费观看| 国产精品国产精品国产| 日本午夜精品一区二区三区电影 | 人妻久久久一区二区三区| 国精一区二区三区| 亚洲风情在线资源站| 免费超爽大片黄| 蜜桃在线视频| 在线观看亚洲成人| av在线网址导航| 99综合久久| 欧美一区二区啪啪| 国产精品91av| 欧美男人操女人视频| 亚洲精品中文字幕有码专区| 四虎影成人精品a片| 欧美三级美国一级| 精品国模在线视频| 久久艹精品视频| 亚洲一区二区伦理| 国产精品成人av性教育| 一级特黄色大片| 懂色av一区二区三区免费观看| 精品不卡一区二区三区| 国产一区二区三区福利| 中文字幕日韩精品一区| 成人免费看片'免费看| 香蕉伊大人中文在线观看| 在线看日韩精品电影| 在线视频观看一区二区| 粉嫩的18在线观看极品精品| 国产午夜一区二区| 欧美爱爱免费视频| 国产一区二区你懂的| 国产精品一二三在线| xxxx国产精品| 国产午夜精品久久久久久免费视| 欧美 日韩 国产 在线观看| а√天堂资源官网在线资源| 欧美性猛片xxxx免费看久爱| 国产精品嫩草69影院| 美女久久久久| 欧美成人免费va影院高清| 中文字幕国产在线观看| 激情偷乱视频一区二区三区| 精品国产免费一区二区三区| 在线看免费av| 看黄色录像一级片| 亚洲一级在线| 国产精品国产一区二区| av中文字幕在线| 亚洲成人av一区二区三区| 国产精品自拍视频在线| 天海翼精品一区二区三区| 欧美成人免费全部| 国产精品欧美综合| 成人教育av在线| 制服国产精品| 99re66热这里只有精品4| 亚洲成人久久电影| 无码黑人精品一区二区| 丝袜亚洲另类欧美综合| 国产精品伊人日日| 在线播放蜜桃麻豆| 欧美性色黄大片手机版| 丰满少妇一区二区三区| 亚洲无线一线二线三线区别av| 国产日韩欧美一二三区| 黑人与亚洲人色ⅹvideos| 亚洲国产aⅴ成人精品无吗| 福利视频999| 波多野结衣在线观看一区二区| 97在线观看视频国产| 亚洲精品一区二区三区四区 | 久草精品视频在线观看| 国产成人啪免费观看软件| 亚洲开发第一视频在线播放| 日韩免费va| 亚洲欧美日韩精品久久| 欧美一二三区视频| 成人看片黄a免费看在线| 久久久久久久久网| 99久久99九九99九九九| 久久影院资源网| 国产精品色综合| 国产精品电影院| www亚洲成人| 不卡av一区二区| 国产精品中文字幕久久久| h视频网站在线观看| 在线观看精品一区| 亚洲区自拍偷拍| 日韩精品亚洲一区二区三区免费| 欧美国产综合视频| 校园春色亚洲色图| 国产亚洲欧洲黄色| 在线亚洲欧美日韩| 中文字幕亚洲在| 日本一二三区在线| 欧美午夜一区| 国产一区在线免费观看| 国产直播在线| 亚洲精品资源在线| 中国黄色一级视频| 国产精品久久福利| 亚洲一级片免费观看| 在线日本高清免费不卡| 久久久神马电影| 国产精品久久久久av电视剧| 在线精品播放av| 一级特黄aaa大片在线观看| 亚洲精品一二三四区| 国产大尺度视频| 亚洲欧美成人| 亚洲欧洲日韩精品| 日本在线视频一区二区三区| 国语自产在线不卡| 九九在线视频| 7777精品伊人久久久大香线蕉完整版 | 国产视频网站在线| 欧美日韩国产精品自在自线| 农村黄色一级片| 91啪亚洲精品| 小明看看成人免费视频| 合欧美一区二区三区| 麻豆av一区二区| 九七影院97影院理论片久久| 欧美日韩国产成人| 男人天堂网在线观看| 欧美精品aⅴ在线视频| 国产一级在线观看视频| 国产网站一区二区| 国产伦精品一区二区三区妓女下载| 亚洲第一伊人| 亚洲综合网中心| 日本福利一区| 91亚洲精品久久久| av高清不卡| 九九久久综合网站| 国产黄色片在线观看| 精品久久久久久久久久久院品网| 免费黄色小视频在线观看| 一区二区三区欧美| 97人妻人人揉人人躁人人| 成人黄色大片在线观看 | 日日骚av一区| 五月婷中文字幕| 日韩午夜精品电影| 日韩免费av网站| 亚洲激情网站免费观看| 无码 人妻 在线 视频| 粉嫩av亚洲一区二区图片| 自拍偷拍 国产| 99xxxx成人网| a天堂资源在线观看| 日韩电影免费网站| 欧美日韩国产综合在线| av成人男女| 成人免费在线网址| 成人精品国产亚洲| 欧美综合激情网| 人人澡人人添人人爽一区二区| 色狠狠久久aa北条麻妃| 青青青免费视频在线2| 精品国内二区三区| 国产又粗又大又爽| 欧美性一区二区| 午夜精品一区二| 天天操天天色综合| 日韩精品一区二区三| 亚洲激情av在线| 天天做夜夜爱爱爱| 国产精品网曝门| 日本一级免费视频| 久久久午夜精品| 国产伦精品一区二区三区妓女| 国产成人精品一区二| 99中文字幕在线| 精品亚洲porn| 日韩av一卡二卡三卡| 另类中文字幕网| 色乱码一区二区三区在线| 丝袜亚洲另类欧美| 国产一级不卡毛片| 葵司免费一区二区三区四区五区| 亚洲色成人一区二区三区小说| 一道本一区二区| 日韩精品视频一区二区在线观看| 一本不卡影院| 可以在线看的黄色网址| 免费在线欧美黄色| 国产精品亚洲a| 青青草国产精品亚洲专区无| 亚洲xxxx2d动漫1| 久久成人精品无人区| 99九九99九九九99九他书对| 国产资源在线一区| 少妇丰满尤物大尺度写真| 国产精品一区三区| 国产精品亚洲一区二区无码| 成人黄色在线看| 欧美激情aaa| 中文字幕一区视频| 中文字幕在线观看2018| 亚洲午夜免费视频| 亚洲 欧美 视频| 欧美网站大全在线观看| 97成人免费视频| 欧美精品一区二区三区久久久| 天天干,夜夜操| 亚洲人av在线影院| 久久综合之合合综合久久| 久久99精品久久久久久琪琪| 成人女同在线观看| 青草成人免费视频| 免费视频观看成人| 国产66精品久久久久999小说| 日韩三级av| 亚洲图片都市激情| 国内自拍一区| 蜜臀久久99精品久久久酒店新书| 久久国产成人午夜av影院| avtt中文字幕| 国产三级欧美三级日产三级99 | 亚洲麻豆一区二区三区| 久久伊人中文字幕| 萌白酱视频在线| 亚洲va欧美va天堂v国产综合| 国产精品熟女视频| 日韩欧美国产成人一区二区| 视频一区二区三区在线看免费看| 日日噜噜噜夜夜爽亚洲精品 | 一区视频在线看| 虎白女粉嫩尤物福利视频| 韩国一区二区在线观看| 日韩精品一区二区三区高清免费| 欧美极品xxx| 日韩少妇高潮抽搐| 欧美二区三区91| 看电影就来5566av视频在线播放| 久久视频在线看| 国产一区二区三区朝在线观看| 国产福利久久| 欧美色图国产精品| 1024av视频| 成人午夜碰碰视频| 国产精品1区2区3区4区| 精品久久久久久亚洲国产300| 国产在成人精品线拍偷自揄拍| 日韩成人中文字幕| 污污的视频在线观看| 国产精品入口免费视| 欧美wwwwww| 久久这里只有精品8| 久久国产精品一区二区| 可以直接看的无码av| 亚洲午夜视频在线观看| aaa一区二区三区| 最近2019年日本中文免费字幕| 在线女人免费视频| 成人在线资源网址| 91精品国产视频| 国产又猛又黄的视频| 久久综合狠狠综合久久综合88| 久久亚洲AV无码| 制服丝袜av成人在线看| 成年人免费在线视频| 日韩av电影国产| 久久国产精品色av免费看| 国产在线观看欧美| 激情六月婷婷久久| 天美传媒免费在线观看| 日本韩国一区二区三区视频| 三级视频在线| 97国产在线视频| 国产精品chinese在线观看| 成人性做爰片免费视频| 久久www免费人成看片高清| 第一次破处视频| 在线视频你懂得一区| 二人午夜免费观看在线视频| 国产成人精品视频在线观看| 亚洲亚洲免费| 无遮挡又爽又刺激的视频| 国产亚洲短视频| 国产精华7777777| 在线免费看av不卡| 成人一区视频| 在线无限看免费粉色视频| 久久精品国产免费| 男人av资源站| 日韩一区二区影院| 欧美韩日亚洲| 国外成人在线视频网站| 一本综合久久| 久久久久久久毛片| 欧美乱熟臀69xxxxxx| 1区2区3区在线视频| 成人高清在线观看| 日韩视频中文| 三上悠亚影音先锋| 欧美日韩成人综合| 1区2区在线观看| 好吊色欧美一区二区三区| 亚洲在线免费| 中文字幕 自拍| 91精品免费观看| 波多野结衣中文在线| 久久av一区二区三区亚洲| 日韩在线一二三区| 少妇高潮在线观看| 日韩你懂的在线播放| 欧美少妇精品| 丝袜足脚交91精品| 国产精品一区免费在线观看| 国产无精乱码一区二区三区| 亚洲欧美综合图区| 一区二区三区无毛| 黄色大片在线免费看| 久久人人爽人人爽| 97免费观看视频| 2019中文字幕在线免费观看| 日韩在线不卡| 中文字幕在线视频播放| 欧日韩精品视频| 欧美videossex另类| 欧美精品一区二区三区在线四季| 日本中文一区二区三区| 久草网在线观看| 亚洲最新在线视频| 91精品尤物| 天天影视综合色| 伊人性伊人情综合网| 国产在线视频你懂得| 91丝袜脚交足在线播放| 久久精品日产第一区二区 | 亚洲a一区二区| 999国产在线视频| 国产精品日韩一区二区 | 91情侣偷在线精品国产| 亚洲女优在线| 国产一级淫片免费| 日韩在线观看精品| 中文字幕中文字幕精品|