日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

《掌门1对1微服务体系 Solar | 阿里巴巴 Sentinel 落地实践》

發(fā)布時(shí)間:2024/8/23 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《掌门1对1微服务体系 Solar | 阿里巴巴 Sentinel 落地实践》 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介:

前言

掌門(mén)1對(duì)1精耕在線教育領(lǐng)域,近幾年業(yè)務(wù)得到了快速發(fā)展,但同時(shí)也遭遇了“成長(zhǎng)的煩惱”。隨著微服務(wù)數(shù)量不斷增加,流量進(jìn)一步暴增,硬件資源有點(diǎn)不堪重負(fù),那么,如何實(shí)現(xiàn)更好的限流熔斷降級(jí)等流量防護(hù)措施,這個(gè)課題就擺在了掌門(mén)人的面前。由于?Spring Cloud?體系已經(jīng)演進(jìn)到第二代,第一代的?Hystrix?限流熔斷降級(jí)組件已經(jīng)不大適合現(xiàn)在的業(yè)務(wù)邏輯和規(guī)模,同時(shí)它目前被?Spring Cloud?官方置于維護(hù)模式,將不再向前發(fā)展。

如何選擇一個(gè)更好的限流熔斷降級(jí)組件?經(jīng)過(guò)對(duì)?Alibaba Sentinel、Resilience4j、Hystrix?等開(kāi)源組件做了深入的調(diào)研和比較,最終選定?Alibaba Sentinel?做微服務(wù)體系?Solar?中的限流熔斷降級(jí)必選組件。

Sentinel 簡(jiǎn)介

阿里巴巴中間件部門(mén)開(kāi)發(fā)的新一代以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性的分布式系統(tǒng)的流量防衛(wèi)兵。它承接了阿里巴巴近10年的雙十一大促流量的核心場(chǎng)景,例如秒殺(即突發(fā)流量控制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷、集群流量控制、實(shí)時(shí)熔斷下游不可用應(yīng)用等。

它具有非常豐富的開(kāi)源生態(tài):

它和?Hystrix?相比,有如下差異:

摘自官網(wǎng)?Sentinel Roadmap

關(guān)于?Sentinel?如何使用,它的技術(shù)實(shí)現(xiàn)原理怎樣等,官方文檔或者民間博客、公眾號(hào)文章等可以提供非常詳盡且有價(jià)值的材料,這些不在本文的討論范圍內(nèi),就不一一贅述。筆者嘗試結(jié)合掌門(mén)1對(duì)1現(xiàn)有的技術(shù)棧以及中間件一體化的戰(zhàn)略,并著眼于強(qiáng)大的?Spring Cloud Alibaba?技術(shù)生態(tài)圈展開(kāi)闡釋。

Sentinel 深度集成 Apollo

Sentinel?官方在?sentinel-datasource-apollo?模塊中已經(jīng)對(duì)?Apollo?做了一些擴(kuò)展,主要實(shí)現(xiàn)了?Sentinel?規(guī)則的讀取和訂閱邏輯。這些并不夠,我們需要對(duì)?Apollo?進(jìn)行更深層次的集成。

摘自官網(wǎng)?在生產(chǎn)環(huán)境中使用 Sentinel

Solar SDK 環(huán)境初始化

定制?EnvironmentPostProcessor?類(lèi),實(shí)現(xiàn)如下:

  • Sentinel Dashboard?的項(xiàng)目名稱(chēng)從?Apollo?AppId?的維度進(jìn)行展示
  • 根據(jù)環(huán)境?env?值讀取相應(yīng)的配置文件,并訪問(wèn)對(duì)應(yīng)環(huán)境的?Sentinel Dashboard?域名Sentinel Dashboard?在生產(chǎn)環(huán)境部署若干臺(tái)?ECS?實(shí)例,阿里云?SLB?做負(fù)載均衡,實(shí)現(xiàn)對(duì)集群的水平擴(kuò)展
public class SentinelClientEnvironmentPostProcessor implements EnvironmentPostProcessor {private final ResourceLoader resourceLoader = new DefaultResourceLoader();private static final String DEFAULT_CLASSPATH_LOCATION = "classpath:/META-INF/app.properties";private static final String DEFAULT_LOCATION = "/META-INF/app.properties";private static final String DEFAULT_LOG_LOCATION = "/opt/logs/"; @Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {try {Resource appResource = resourceLoader.getResource(DEFAULT_CLASSPATH_LOCATION);if (!appResource.exists()) {appResource = resourceLoader.getResource(DEFAULT_LOCATION);}Properties appProperties = new Properties();appProperties.load(new InputStreamReader(appResource.getInputStream()));String appId = appProperties.getProperty("app.id");System.setProperty("project.name", appId);System.setProperty("csp.sentinel.log.dir", DEFAULT_LOG_LOCATION + appId);Properties properties = new Properties();String path = isOSWindows() ? "C:/opt/settings/server.properties" : "/opt/settings/server.properties";File file = new File(path);if (file.exists() && file.canRead()) {FileInputStream fis = new FileInputStream(file);if (fis != null) {try {properties.load(new InputStreamReader(fis, Charset.defaultCharset()));} finally {fis.close();}}}String idc = properties.getProperty("idc");String location;String env = System.getProperty("env");if (StringUtils.isEmpty(idc)) {if (!isBlank(env)) {env = env.trim().toLowerCase();} else {env = System.getenv("ENV");if (!isBlank(env)) {env = env.trim().toLowerCase();} else {env = properties.getProperty("env");if (!isBlank(env)) {env = env.trim();} else {env = Env.FAT.getEnv();}}}location = "classpath:/META-INF/sentinel-" + env + ".properties";} else {location = "classpath:/META-INF/sentinel-" + idc + ".properties";}Resource serverResource = resourceLoader.getResource(location);properties.load(new InputStreamReader(serverResource.getInputStream()));for (String key : properties.stringPropertyNames()) {System.setProperty(key, properties.getProperty(key));}System.setProperty(CommonConstant.SENTINEL_VERSION_NAME, CommonConstant.SENTINEL_VERSION_VALUE);} catch (Exception e) {LOG.error(e.getMessage());}}private boolean isBlank(String str) {return Strings.nullToEmpty(str).trim().isEmpty();}private boolean isOSWindows() {String osName = System.getProperty("os.name");return !isBlank(osName) && osName.startsWith("Windows");} }

把?SentinelClientEnvironmentPostProcessor?類(lèi)放置?\resources\META-INF\spring.factories?文件中,內(nèi)容為

org.springframework.boot.env.EnvironmentPostProcessor=\ com.zhangmen.solar.component.sentinel.common.context.SentinelClientEnvironmentPostProcessor

在?\resources\META-INF?目錄下,定制環(huán)境配置文件,文件名格式為?sentinel-{環(huán)境號(hào)}.properties?。下文以?dev?環(huán)境和?flow?流控配置(其它規(guī)則配置,請(qǐng)自行參考?Spring Cloud Alibaba Sentinel?的相關(guān)資料)為樣例。

sentinel-dev.properties

spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080 spring.cloud.sentinel.datasource.ds.apollo.namespaceName=application spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey=sentinel.flowRules spring.cloud.sentinel.datasource.ds.apollo.ruleType=flow ...

Sentinel Dashboard 持久化改造

原生的?Sentinel Dashboard?在創(chuàng)建完規(guī)則后,規(guī)則內(nèi)容保存在服務(wù)的內(nèi)存中,當(dāng)服務(wù)重啟后所有的規(guī)則內(nèi)容都會(huì)消失。因此,在生產(chǎn)部署時(shí)需要考慮配置持久化,并且使用?Apollo?動(dòng)態(tài)規(guī)則的感知能力。

① 向外暴露 Sentinel 規(guī)則的 Restful 接口

@RestController @RequestMapping(value = "/v2/flow") public class FlowControllerV2 {@Autowired@Qualifier("apolloFlowRuleProvider")private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;@Autowired@Qualifier("apolloFlowRulePublisher")private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;.... }

② 實(shí)現(xiàn) Sentinel Apollo 規(guī)則提供

@Component("apolloFlowRuleProvider") public class ApolloFlowRuleProvider extends BaseApolloRuleProvider<FlowRuleEntity> {@Overridepublic List<FlowRuleEntity> getRules(String appName) throws Exception {List<FlowRuleEntity> flowRuleEntityList = super.getRules(appName);if (!CollectionUtils.isEmpty(flowRuleEntityList)) {List<FlowRuleEntity> flowRuleEntities = JSONArray.parseArray(flowRuleEntityList.toString(), FlowRuleEntity.class);long id = 1;for (FlowRuleEntity entity : flowRuleEntities) {entity.setId(id++);entity.getClusterConfig().setFlowId(entity.getId());}return flowRuleEntities;} else {return null;}}@Overrideprotected String getDataId() {return ApolloConfigUtil.getFlowDataId();} }

③ 實(shí)現(xiàn) Sentinel Apollo 規(guī)則訂閱

@Component("apolloFlowRulePublisher") public class ApolloFlowRulePublisher extends BaseApolloRulePublisher<List<FlowRuleEntity>> {@Overridepublic void publish(String app, String operator, List<FlowRuleEntity> rules) throws Exception {if (!CollectionUtils.isEmpty(rules)) {for (int i = 0; i < rules.size(); i++) {rules.get(i).setId((long) (i + 1));rules.get(i).setApp(null);rules.get(i).setGmtModified(null);rules.get(i).setGmtCreate(null);rules.get(i).setIp(null);rules.get(i).setPort(null);rules.get(i).getClusterConfig().setFlowId((long) (i + 1));}} else {rules = null;}super.publish(app, operator, rules);}@Overrideprotected String getDataId() {return ApolloConfigUtil.getFlowDataId();} }

上述代碼實(shí)現(xiàn)了對(duì)?Apollo?配置讀寫(xiě)操作。熟悉?Apollo?的同學(xué)應(yīng)該知道,這些操作需要基于?Apollo OpenApi?來(lái)操作;動(dòng)態(tài)感知能力的邏輯已經(jīng)由?sentinel-datasource-apollo?模塊實(shí)現(xiàn)。

Sentinel 集成 Skywalking

由于掌門(mén)1對(duì)1微服務(wù)技術(shù)棧落地的比較早,鑒于歷史的局限性(當(dāng)時(shí)沒(méi)有更先進(jìn)的技術(shù)可供選擇),除了 Hystrix 比較古老以外,另一個(gè)技術(shù)棧的痛點(diǎn)是全鏈路監(jiān)控中間件的改造也提上議事日程,CAT 作為開(kāi)源界老牌作品,為公司底層全鏈路監(jiān)控提供強(qiáng)有力的保障,但隨著技術(shù)的演進(jìn),它逐漸已經(jīng)不適合公司的未來(lái)發(fā)展方向,經(jīng)過(guò)對(duì)比,最終選擇 Skywalking 將作為它的替代者(關(guān)于 Skywalking 的技術(shù)選型,將在后面掌門(mén)1對(duì)1微服務(wù)體系 Solar 的公眾號(hào)系列文章中會(huì)一一闡述)。

業(yè)務(wù)系統(tǒng)要求對(duì)限流熔斷降級(jí)實(shí)現(xiàn)全鏈路實(shí)時(shí)埋點(diǎn),并希望在?Skywalking?界面上提供限流熔斷降級(jí)埋點(diǎn)的多維度統(tǒng)計(jì)。由于?Skywalking?實(shí)現(xiàn)了?OpenTracing?標(biāo)準(zhǔn)化協(xié)議,那么以?OpenTracing?為橋梁,通過(guò)?Solar?SDK 輸出?Sentinel?埋點(diǎn)到?Skywalking?Server 不失為一個(gè)好的技術(shù)選擇。下面簡(jiǎn)單扼要介紹一下基于?Sentinel InitFunc?的?SPI?機(jī)制實(shí)現(xiàn)埋點(diǎn)輸出:

Sentinel?將?ProcessorSlot?作為?SPI?接口進(jìn)行擴(kuò)展(1.7.2 版本以前?SlotChainBuilder?作為?SPI?),使得?Slot Chain?具備了擴(kuò)展的能力。您可以自行加入自定義的 slot 并編排 slot 間的順序,從而可以給?Sentinel?添加自定義的功能。

摘自官網(wǎng)?Sentinel 工作主流程

抽象 Sentinel ProcessorSlot 埋點(diǎn)輸出

Sentinel?的?ProcessorSlotEntryCallback?提供?onPass?和?onBlocked?兩個(gè)方法,畢竟限流熔斷降級(jí)并不是常規(guī)的功能,不會(huì)發(fā)生在大流量上面,所以?onPass?上我們不做任何處理,否則正常的調(diào)用去實(shí)現(xiàn)攔截,將為產(chǎn)生大量的埋點(diǎn)數(shù)據(jù),會(huì)讓?Skywalking?Server 承受很大的性能壓力,所以?onBlocked?將是我們關(guān)注的重點(diǎn),它除了輸出?Sentinel?本身的上下文參數(shù)之外,也會(huì)輸出微服務(wù)?Solar?指標(biāo)參數(shù),主要包括:

  • 埋點(diǎn)?Span名稱(chēng),這里為?SENTINEL?,在?Skywalking?全鏈路監(jiān)控界面中,用戶可以非常容易的找到這個(gè)埋點(diǎn)
  • 服務(wù)所在的組名,指服務(wù)的邏輯分組
  • 服務(wù)類(lèi)型,包括服務(wù)和網(wǎng)關(guān)(網(wǎng)關(guān)也是一種特殊的服務(wù)),?Sentinel?埋點(diǎn)可以支持在服務(wù)和網(wǎng)關(guān)上的輸出
  • 服務(wù)的?APPID,它為?Apollo?組件的范疇概念
  • 服務(wù)名,它對(duì)應(yīng)為?spring.application.name?的配置值
  • 服務(wù)實(shí)例所在的?IP?地址和?Port?端口
  • 服務(wù)版本號(hào)
  • 服務(wù)所在的區(qū)域
  • 服務(wù)所在的子環(huán)境

接下去是?Sentinel?層面的參數(shù),請(qǐng)自行參考?Sentinel?官方文檔和源碼,了解其含義,這里不做具體講解。

public abstract class SentinelTracerProcessorSlotEntryCallback<S> implements ProcessorSlotEntryCallback<DefaultNode> {@Overridepublic void onPass(Context context, ResourceWrapper resourceWrapper, DefaultNode param, int count, Object... args) throws Exception {}@Overridepublic void onBlocked(BlockException e, Context context, ResourceWrapper resourceWrapper, DefaultNode param, int count, Object... args) {S span = buildSpan();PluginAdapter pluginAdapter = PluginContextAware.getStaticApplicationContext().getBean(PluginAdapter.class);outputSpan(span, DiscoveryConstant.SPAN_TAG_PLUGIN_NAME, context.getName());outputSpan(span, DiscoveryConstant.N_D_SERVICE_GROUP, pluginAdapter.getGroup());outputSpan(span, DiscoveryConstant.N_D_SERVICE_TYPE, pluginAdapter.getServiceType());String serviceAppId = pluginAdapter.getServiceAppId();if (StringUtils.isNotEmpty(serviceAppId)) {outputSpan(span, DiscoveryConstant.N_D_SERVICE_APP_ID, serviceAppId);}outputSpan(span, DiscoveryConstant.N_D_SERVICE_ID, pluginAdapter.getServiceId());outputSpan(span, DiscoveryConstant.N_D_SERVICE_ADDRESS, pluginAdapter.getHost() + ":" + pluginAdapter.getPort());outputSpan(span, DiscoveryConstant.N_D_SERVICE_VERSION, pluginAdapter.getVersion());outputSpan(span, DiscoveryConstant.N_D_SERVICE_REGION, pluginAdapter.getRegion());outputSpan(span, DiscoveryConstant.N_D_SERVICE_ENVIRONMENT, pluginAdapter.getEnvironment());outputSpan(span, SentinelStrategyConstant.ORIGIN, context.getOrigin());outputSpan(span, SentinelStrategyConstant.ASYNC, String.valueOf(context.isAsync()));outputSpan(span, SentinelStrategyConstant.RESOURCE_NAME, resourceWrapper.getName());outputSpan(span, SentinelStrategyConstant.RESOURCE_SHOW_NAME, resourceWrapper.getShowName());outputSpan(span, SentinelStrategyConstant.RESOURCE_TYPE, String.valueOf(resourceWrapper.getResourceType()));outputSpan(span, SentinelStrategyConstant.ENTRY_TYPE, resourceWrapper.getEntryType().toString());outputSpan(span, SentinelStrategyConstant.RULE_LIMIT_APP, e.getRuleLimitApp());if (tracerSentinelRuleOutputEnabled) {outputSpan(span, SentinelStrategyConstant.RULE, e.getRule().toString());}outputSpan(span, SentinelStrategyConstant.CAUSE, e.getClass().getName());outputSpan(span, SentinelStrategyConstant.BLOCK_EXCEPTION, e.getMessage());outputSpan(span, SentinelStrategyConstant.COUNT, String.valueOf(count));if (tracerSentinelArgsOutputEnabled) {outputSpan(span, SentinelStrategyConstant.ARGS, JSON.toJSONString(args));}finishSpan(span);}protected abstract S buildSpan();protected abstract void outputSpan(S span, String key, String value);protected abstract void finishSpan(S span); }

整合 OpenTracing & Skywalking

實(shí)現(xiàn)?SentinelTracerProcessorSlotEntryCallback?的三個(gè)核心方法:

  • buildSpan?- 創(chuàng)建?Skywalking?的埋點(diǎn)?Span?對(duì)象
  • outputSpan?- 輸出相關(guān)埋點(diǎn)數(shù)據(jù)的鍵值對(duì)到?Skywalking?的埋點(diǎn)?Span?對(duì)象中
  • finishSpan?- 提交?Skywalking?的埋點(diǎn)?Span?對(duì)象到?Skywalking?Server
public class SentinelSkywalkingTracerProcessorSlotEntryCallback extends SentinelTracerProcessorSlotEntryCallback<Span> {private Tracer tracer = new SkywalkingTracer();@Overrideprotected Span buildSpan() {return tracer.buildSpan(SentinelStrategyConstant.SPAN_NAME).startManual();}@Overrideprotected void outputSpan(Span span, String key, String value) {span.setTag(key, value);}@Overrideprotected void finishSpan(Span span) {span.finish();} }

實(shí)現(xiàn) Sentinel InitFunc SPI 擴(kuò)展

實(shí)現(xiàn)?SPI?的擴(kuò)展切入類(lèi)

public class SentinelSkywalkingTracerInitFunc implements InitFunc {@Overridepublic void init() throws Exception {StatisticSlotCallbackRegistry.addEntryCallback(SentinelSkywalkingTracerProcessorSlotEntryCallback.class.getName(), new SentinelSkywalkingTracerProcessorSlotEntryCallback());} }

把?SPI?的擴(kuò)展切入類(lèi)放置?\resources\META-INF\services\com.alibaba.csp.sentinel.init.InitFunc?文件中,內(nèi)容為

com.nepxion.discovery.plugin.strategy.sentinel.skywalking.monitor.SentinelSkywalkingTracerInitFunc

摘自?Nepxion Discovery 開(kāi)源社區(qū)

對(duì)于 Sentinel 跟 Opentracing, Skywalking, Jaeger 的集成可參考?https://github.com/Nepxion/Discovery?中的 discovery-plugin-strategy-sentinel-starter-opentracing, discovery-plugin-strategy-sentinel-starter-skywalking 等模塊。

最終在?Skywalking?全鏈路界面上輸出如下:

全鏈路調(diào)用鏈中,我們可以看到?solar-service-a?服務(wù)的鏈路上輸出了?SENTINEL?埋點(diǎn),表示?solar-service-a?上發(fā)生了?Sentinel?限流熔斷降級(jí)事件之一。

點(diǎn)擊?SENTINEL?埋點(diǎn),在呼出的內(nèi)容看板上,我們可以看到?solar-service-a?服務(wù)發(fā)生了限流事件,上面顯示限流的規(guī)則和異常信息以及微服務(wù)?Solar?指標(biāo)等一系列參數(shù)。

我們可以點(diǎn)擊界面上邊的【熔斷查詢】進(jìn)行?Sentinel?相關(guān)數(shù)據(jù)的分析和統(tǒng)計(jì)

Sentinel 集成 InfluxDB & Grafana

監(jiān)控?cái)?shù)據(jù)持久化到 InfluxDB

① Sentinel MetricFetcher 拉取數(shù)據(jù)

實(shí)現(xiàn)?Dashboard?服務(wù)端拉取?Sentinel?客戶端(即?Solar?微服務(wù))的監(jiān)控?cái)?shù)據(jù)

@Component public class MetricFetcher {@Autowired@Qualifier("influxDBMetricRepository")private MetricsRepository<MetricEntity> metricStore;... }

② InfluxDB 實(shí)例初始化

@Configuration public class InfluxDBAutoConfiguration {@Value("${spring.influx.url}")private String influxDBUrl;@Value("${spring.influx.user}")private String userName;@Value("${spring.influx.password}")private String password;@Value("${spring.influx.database}")private String database;@Beanpublic InfluxDB influxDB() {InfluxDB influxDB = null;try {influxDB = InfluxDBFactory.connect(influxDBUrl, userName, password);influxDB.setDatabase(database).enableBatch(100, 1000, TimeUnit.MILLISECONDS);influxDB.setLogLevel(InfluxDB.LogLevel.NONE);} catch (Exception e) {LOG.error(e.getMessage());}return influxDB;} }

③ Sentinel 數(shù)據(jù)寫(xiě)入到 InfluxDB

@Component("influxDBMetricRepository") public class InfluxDBMetricRepository implements MetricsRepository<MetricEntity> {@Autowiredprivate InfluxDB influxDB;@Overridepublic void save(MetricEntity metric) {try {Point point = createPoint(metric);influxDB.write(point);} catch (Exception e) {LOG.error(e.getMessage());}}@Overridepublic void saveAll(Iterable<MetricEntity> metrics) {if (metrics == null) {return;}try {BatchPoints batchPoints = BatchPoints.builder().build();metrics.forEach(metric -> {Point point = createPoint(metric);batchPoints.point(point);});influxDB.write(batchPoints);} catch (Exception e) {LOG.error(e.getMessage());}} }

Grafana 界面展現(xiàn)監(jiān)控?cái)?shù)據(jù)

Sentinel Limit-App 熔斷擴(kuò)展

掌門(mén)1對(duì)1已經(jīng)實(shí)現(xiàn)通過(guò)灰度藍(lán)綠發(fā)布方式,實(shí)現(xiàn)對(duì)流量的精確制導(dǎo)和調(diào)撥,但為了進(jìn)一步實(shí)施更安全的流量保障,引入了基礎(chǔ)指標(biāo)和灰度藍(lán)綠發(fā)布指標(biāo)的熔斷,同時(shí)也支持業(yè)務(wù)自定義指標(biāo)和組合指標(biāo)的熔斷。

通過(guò)對(duì)?Sentinel?Limit-App機(jī)制的擴(kuò)展并定制授權(quán)規(guī)則,實(shí)現(xiàn)微服務(wù)?Solar?的熔斷擴(kuò)展。對(duì)于授權(quán)規(guī)則中涉及到的參數(shù),簡(jiǎn)要做如下說(shuō)明:

  • resource?為?@SentinelResource?注解的?value?,也可以是調(diào)用的?URL?路徑值
  • limitApp?如果有多個(gè),可以通過(guò)?,?分隔。特別注意,下文為了描述簡(jiǎn)單,只以單個(gè)為例
  • strategy?為?0?表示白名單,符合條件就放行流量;?strategy?為?1?表示黑名單,符合條件就限制流量。特別注意,下文為了描述簡(jiǎn)單,只以白名單為例

基礎(chǔ)指標(biāo)的熔斷

通過(guò)?Http Header?自動(dòng)攜帶下游服務(wù)的基礎(chǔ)指標(biāo)進(jìn)行全鏈路傳遞的方式,對(duì)下游調(diào)用實(shí)施基礎(chǔ)指標(biāo)的熔斷。支持如下指標(biāo):

① 服務(wù)名

當(dāng) A 服務(wù)發(fā)送請(qǐng)求到 B 服務(wù),所攜帶的 A 服務(wù)名不滿足條件,該請(qǐng)求就會(huì)被 B 服務(wù)熔斷。

  • B 服務(wù)增加配置項(xiàng)
spring.application.strategy.service.sentinel.request.origin.key=n-d-service-id
  • B 服務(wù)增加授權(quán)規(guī)則,?limitApp?為 A 服務(wù)名
[{"resource": "sentinel-resource","limitApp": "a-service-id","strategy": 0} ]

② 服務(wù)的?APPID

當(dāng) A 服務(wù)發(fā)送請(qǐng)求到 B 服務(wù),所攜帶的 A 服務(wù)的?APPID?不滿足條件,該請(qǐng)求就會(huì)被 B 服務(wù)熔斷。

  • B 服務(wù)增加配置項(xiàng)
spring.application.strategy.service.sentinel.request.origin.key=n-d-service-app-id
  • B 服務(wù)增加授權(quán)規(guī)則,?limitApp?為 A 服務(wù)的?APPID
[{"resource": "sentinel-resource","limitApp": "a-service-app-id","strategy": 0} ]

③ 服務(wù)實(shí)例所在的?IP?地址和?Port?端口

當(dāng) A 服務(wù)發(fā)送請(qǐng)求到 B 服務(wù),所攜帶的 A 服務(wù)的?IP?地址和?Port?端口不滿足條件,該請(qǐng)求就會(huì)被 B 服務(wù)熔斷。

  • B 服務(wù)增加配置項(xiàng)
spring.application.strategy.service.sentinel.request.origin.key=n-d-service-address
  • B 服務(wù)增加授權(quán)規(guī)則,?limitApp?為 A 服務(wù)實(shí)例所在的?IP?地址和?Port?端口
[{"resource": "sentinel-resource","limitApp": "a-ip:a-port","strategy": 0} ]

灰度藍(lán)綠發(fā)布指標(biāo)的熔斷

通過(guò)?Http Header?自動(dòng)攜帶下游服務(wù)的灰度藍(lán)綠發(fā)布指標(biāo)進(jìn)行全鏈路傳遞的方式,對(duì)下游調(diào)用實(shí)施灰度藍(lán)綠發(fā)布指標(biāo)的熔斷。支持如下指標(biāo):

① 服務(wù)所在的組名

當(dāng) A 服務(wù)發(fā)送請(qǐng)求到 B 服務(wù),所攜帶的 A 服務(wù)的組名和 B 服務(wù)的組名不一致,該請(qǐng)求就會(huì)被 B 服務(wù)熔斷。

  • B 服務(wù)增加配置項(xiàng)
spring.application.strategy.service.sentinel.request.origin.key=n-d-service-group
  • B 服務(wù)增加授權(quán)規(guī)則,?limitApp?為 B 服務(wù)的組名
[{"resource": "sentinel-resource","limitApp": "b-group","strategy": 0} ]

② 服務(wù)版本號(hào)

當(dāng) A 服務(wù)發(fā)送請(qǐng)求到 B 服務(wù),所攜帶的 A 服務(wù)的版本號(hào)和 B 服務(wù)的版本號(hào)不一致,該請(qǐng)求就會(huì)被 B 服務(wù)熔斷。

  • B 服務(wù)增加配置項(xiàng)
spring.application.strategy.service.sentinel.request.origin.key=n-d-service-version
  • B 服務(wù)增加授權(quán)規(guī)則,?limitApp?為 B 服務(wù)的版本號(hào)
[{"resource": "sentinel-resource","limitApp": "b-version","strategy": 0} ]

③ 服務(wù)所在的區(qū)域

當(dāng) A 服務(wù)發(fā)送請(qǐng)求到 B 服務(wù),所攜帶的 A 服務(wù)的區(qū)域值和 B 服務(wù)的區(qū)域值不一致,該請(qǐng)求就會(huì)被 B 服務(wù)熔斷。

  • B 服務(wù)增加配置項(xiàng)
spring.application.strategy.service.sentinel.request.origin.key=n-d-service-region
  • B 服務(wù)增加授權(quán)規(guī)則,?limitApp?為 B 服務(wù)的區(qū)域值
[{"resource": "sentinel-resource","limitApp": "b-region","strategy": 0} ]

④ 服務(wù)所在的子環(huán)境

當(dāng) A 服務(wù)發(fā)送請(qǐng)求到 B 服務(wù),所攜帶的 A 服務(wù)的子環(huán)境值和 B 服務(wù)的子環(huán)境值不一致,該請(qǐng)求就會(huì)被 B 服務(wù)熔斷。

  • B 服務(wù)增加配置項(xiàng)
spring.application.strategy.service.sentinel.request.origin.key=n-d-service-env
  • B 服務(wù)增加授權(quán)規(guī)則,?limitApp?為 B 服務(wù)的子環(huán)境值
[{"resource": "sentinel-resource","limitApp": "b-env","strategy": 0} ]

業(yè)務(wù)自定義指標(biāo)的熔斷

通過(guò)?Http Header?攜帶下游服務(wù)的業(yè)務(wù)自定義指標(biāo)進(jìn)行全鏈路傳遞的方式,對(duì)下游調(diào)用實(shí)施自定義指標(biāo)的熔斷。

當(dāng) A 服務(wù)發(fā)送請(qǐng)求到 B 服務(wù),所攜帶的 A 的自定義指標(biāo)不滿足條件,該請(qǐng)求就會(huì)被 B 服務(wù)熔斷。例如: A 服務(wù)把?userName?通過(guò)?Http Header?傳遞給 B 服務(wù),而 B 服務(wù)只接受?userName?為?zhangsan?的請(qǐng)求,那么我們可以通過(guò)如下方式來(lái)解決:

  • B 服務(wù)通過(guò)適配類(lèi)實(shí)現(xiàn)?Sentinel?Origin?值的解析
public class MyServiceSentinelRequestOriginAdapter extends AbstractServiceSentinelRequestOriginAdapter {@Overridepublic String parseOrigin(HttpServletRequest request) {return request.getHeader("userName");} }
  • B 服務(wù)的配置類(lèi)里通過(guò)?@Bean?方式進(jìn)行適配類(lèi)創(chuàng)建
@Bean public ServiceSentinelRequestOriginAdapter ServiceSentinelRequestOriginAdapter() {return new MyServiceSentinelRequestOriginAdapter(); }
  • B 服務(wù)增加授權(quán)規(guī)則,?limitApp?為?zhangsan
[{"resource": "sentinel-resource","limitApp": "zhangsan","strategy": 0} ]

假如該方式仍未能滿足業(yè)務(wù)場(chǎng)景,業(yè)務(wù)系統(tǒng)希望根據(jù)?userName?獲取?userType,根據(jù)用戶類(lèi)型做統(tǒng)一熔斷,例如,用戶類(lèi)型為?AUTH_USER?的請(qǐng)求才能放行,其它都熔斷,那么我們可以把上面的例子修改如下:

  • B 服務(wù)的適配類(lèi)更改如下:
public class MyServiceSentinelRequestOriginAdapter extends AbstractServiceSentinelRequestOriginAdapter {@Overridepublic String parseOrigin(HttpServletRequest request) {String userName = request.getHeader("userName");String userType = getUserTypeByName(userName); return userType;} }
  • B 服務(wù)的授權(quán)規(guī)則更改如下:
[{"resource": "sentinel-resource","limitApp": "AUTH_USER","strategy": 0} ]

組合指標(biāo)的熔斷

通過(guò)?Http Header?攜帶下游服務(wù)的業(yè)務(wù)自定義指標(biāo)、基礎(chǔ)指標(biāo)或者灰度藍(lán)綠發(fā)布指標(biāo)進(jìn)行全鏈路傳遞的方式,對(duì)下游調(diào)用實(shí)施組合指標(biāo)的熔斷,例如,根據(jù)傳入的微服務(wù)版本號(hào) + 用戶名,組合在一起進(jìn)行熔斷。下面示例表示為下游服務(wù)版本為?1.0?且?userName?為?zhangsan,同時(shí)滿足這兩個(gè)條件下,所有服務(wù)的請(qǐng)求允許被放行,否則被熔斷。

  • B 服務(wù)的適配類(lèi)更改如下:
public class MyServiceSentinelRequestOriginAdapter extends AbstractServiceSentinelRequestOriginAdapter {@Overridepublic String parseOrigin(HttpServletRequest request) {String version = request.getHeader(DiscoveryConstant.N_D_SERVICE_VERSION);String userName = request.getHeader("userName");return version + "&" + userName;} }
  • B 服務(wù)的授權(quán)規(guī)則更改如下:
[{"resource": "sentinel-resource","limitApp": "1.0&zhangsan","strategy": 0} ]

Sentinel 網(wǎng)關(guān)流控實(shí)踐

闡述網(wǎng)關(guān)流控實(shí)踐的時(shí)候,我們使用精確匹配的方式對(duì)某個(gè)服務(wù)的請(qǐng)求做限流控制為例;對(duì)網(wǎng)關(guān)代理的?solar-service-a?服務(wù)的接口?/inspector/inspect?做限流控制為例。

API 分組管理

API?管理頁(yè)面里添加?solar-service-a, 并精確匹配串?/inspector/inspect

網(wǎng)關(guān)流控規(guī)則

在流控規(guī)則界面里配置相關(guān)的規(guī)則

最終在?Skywalking?全鏈路界面上輸出如下(跟?Solar?服務(wù)側(cè)?Sentinel?埋點(diǎn)相似,不一一闡述了):



Sentinel 集群限流實(shí)踐

我們采用?Sentinel?官方提供的嵌入式?Token Server?解決方案,即服務(wù)集群中選擇一個(gè)節(jié)點(diǎn)做為?Token Server?,同時(shí)該節(jié)點(diǎn)也作為?Token Client?響應(yīng)外部的請(qǐng)求的服務(wù)器。具體實(shí)現(xiàn)方式通過(guò)?Sentinel?實(shí)現(xiàn)預(yù)留的?SPI?InitFunc?接口,可以參考官方?sentinel-demo?模塊下面的?sentinel-demo-cluster-embedded?。

public class SentinelApolloTokenClusterInitFunc implements InitFunc {@Overridepublic void init() throws Exception {// Register client dynamic rule data source.initDynamicFlowRuleProperty();initDynamicParamRuleProperty();// Register token client related data source.// Token client common config:ClusterClientConfigInitializer.doInit();// Token client assign config (e.g. target token server) retrieved from assign map:ClusterClientAssignConfigInitializer.doInit();// Register token server related data source.// Register dynamic rule data source supplier for token server:ClusterRuleSupplierInitializer.doInit();// Token server transport config extracted from assign map:ServerTransportConfigInitializer.doInit();// Init cluster state property for extracting mode from cluster map data source.ClusterStateInitializer.doInit();// ServerFlowConfig 配置ServerFlowConfigInitializer.doInit();} }

把?SPI?的擴(kuò)展切入類(lèi)放置?\resources\META-INF\services\com.alibaba.csp.sentinel.init.InitFunc?文件中,內(nèi)容為

com.zhangmen.solar.sentinel.SentinelApolloTokenClusterInitFunc

作者介紹

任浩軍,掌門(mén)基礎(chǔ)架構(gòu)部研發(fā)經(jīng)理。曾就職于平安銀行、萬(wàn)達(dá)、惠普,曾負(fù)責(zé)平安銀行平臺(tái)架構(gòu)部?PaaS?平臺(tái)基礎(chǔ)服務(wù)框架研發(fā)。10 多年開(kāi)源經(jīng)歷,Github?ID:@HaojunRen,Nepxion?開(kāi)源社區(qū)創(chuàng)始人,Nacos?Group Member,Spring Cloud Alibaba?&?Nacos?&?Sentinel?&?OpenTracing?Committer。

張彬彬,掌門(mén)基礎(chǔ)架構(gòu)部架構(gòu)師。主要負(fù)責(zé)公司微服務(wù)架構(gòu)以及開(kāi)源項(xiàng)目的開(kāi)發(fā)和實(shí)踐,開(kāi)源項(xiàng)目愛(ài)好者,多年互聯(lián)網(wǎng)開(kāi)發(fā)經(jīng)驗(yàn)。

非常感謝阿里巴巴?Sentinel?項(xiàng)目負(fù)責(zé)人宿何在落地過(guò)程中的支持和幫助。

監(jiān)控?Java?中間件?API?Nacos?開(kāi)發(fā)工具?時(shí)序數(shù)據(jù)庫(kù)?Sentinel?微服務(wù)?Spring

版權(quán)聲明:本文首發(fā)在云棲社區(qū),遵循云棲社區(qū)版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),版權(quán)歸用戶作者所有,云棲社區(qū)不為本文內(nèi)容承擔(dān)相關(guān)法律責(zé)任。云棲社區(qū)已升級(jí)為阿里云開(kāi)發(fā)者社區(qū)。如果您發(fā)現(xiàn)本文中有涉嫌抄襲的內(nèi)容,歡迎發(fā)送郵件至:developer2020@service.aliyun.com?進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),阿里云開(kāi)發(fā)者社區(qū)將協(xié)助刪除涉嫌侵權(quán)內(nèi)容。

原文鏈接

本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的《掌门1对1微服务体系 Solar | 阿里巴巴 Sentinel 落地实践》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

国产精品21区 | 国产伦精品一区二区三区无广告 | 亚洲激情小视频 | 天天干国产 | 美女久久视频 | 综合婷婷丁香 | av丝袜天堂 | 蜜桃麻豆www久久囤产精品 | 久草在线久草在线2 | 亚洲电影影音先锋 | 精品国产一区二区三区在线 | 久久观看| 国产精品成人在线 | 国产麻豆视频在线观看 | www.色午夜.com| 免费看精品久久片 | 成人免费视频播放 | 成人黄色电影在线观看 | 国产精品第十页 | 色网站在线观看 | 丁香六月网 | 婷婷久久五月 | 特黄色大片 | 六月久久婷婷 | 美女av免费看 | 久久综合狠狠综合久久激情 | 91精品国产高清自在线观看 | 99久久久久久国产精品 | 免费黄av | 欧美午夜精品久久久久久浪潮 | 日韩理论片在线 | www.69xx| 久久久久久久亚洲精品 | 亚洲综合激情小说 | 色成人亚洲| 久久久久国产精品视频 | 日韩亚洲在线视频 | 亚洲第一av在线播放 | 欧美国产日韩在线观看 | 国色天香第二季 | 国产精品免费视频久久久 | 波多在线视频 | 最近高清中文在线字幕在线观看 | 在线观看免费av片 | 婷婷综合导航 | 日韩精品视频免费看 | 国产精品精品国产色婷婷 | 99精品一区二区三区 | 黄av在线 | 精品国产综合区久久久久久 | 中文字幕乱码亚洲精品一区 | 欧美激情另类文学 | 久草久视频 | 免费在线观看午夜视频 | 国产精品美女999 | 91精品夜夜 | 视频一区亚洲 | 天天干 夜夜操 | 久草在线手机观看 | 色网免费观看 | 欧美极度另类 | 在线www色| 久久深夜福利免费观看 | 日韩欧美一区二区不卡 | 91看片在线看片 | 天天干夜夜干 | 在线色亚洲 | 色资源二区在线视频 | 久久久久久久网站 | 一区二区三区四区影院 | 精壮的侍卫呻吟h | 成人aaa毛片 | 射综合网| 欧美va日韩va | www夜夜操com | 婷婷色 亚洲 | 美女久久精品 | 国产福利资源 | 操操爽 | 久久五月婷婷丁香 | www亚洲精品| 日韩精品2区| 国产麻豆电影在线观看 | 五月婷婷综合网 | 国产精品99久久久精品免费观看 | 色偷偷网站视频 | 中文字幕在线观看完整版电影 | 97在线影院 | 99高清视频有精品视频 | 国产 字幕 制服 中文 在线 | 美女网站色 | 久久在线| 天天射天天操天天干 | 成 人 黄 色 片 在线播放 | 国产一级小视频 | 欧美精品一区二区性色 | 亚洲成色777777在线观看影院 | 欧美在线free | www.日本色 | 激情视频在线高清看 | 精品久久国产精品 | 在线观看日韩精品 | 国产91粉嫩白浆在线观看 | 免费进去里的视频 | 成人免费在线观看电影 | 97视频在线观看播放 | 香蕉网站在线观看 | 狠狠躁夜夜躁人人爽超碰91 | 成人三级网站在线观看 | 婷婷深爱五月 | 免费网站污 | 日韩综合视频在线观看 | 91新人在线观看 | 国产精品女教师 | 欧美福利久久 | 成人在线观看日韩 | 日韩一区二区三区高清在线观看 | 91精品区 | 亚州欧美精品 | 欧美一区二区三区免费观看 | www.久久久精品| av大全免费在线观看 | 国产精品综合在线 | 久热免费在线观看 | 色天天综合网 | 涩涩色亚洲一区 | 国产色在线视频 | 麻豆91精品91久久久 | 玖玖玖影院| av成人在线网站 | 日本爱爱免费 | 亚洲最大色 | 久久激五月天综合精品 | 特级毛片在线免费观看 | 亚洲精品午夜国产va久久成人 | 欧美日韩在线观看一区二区 | 久久av中文字幕片 | 国内成人精品视频 | 欧美激情xxxx| 狠狠干,狠狠操 | 久久女教师 | 91精品国产乱码在线观看 | www日韩| 午夜 久久 tv| 久久久久久国产精品 | 91精品视频网站 | 久久夜色精品国产欧美乱极品 | 麻花豆传媒mv在线观看网站 | 2019中文字幕网站 | 免费网址你懂的 | 婷婷色狠狠| 久久免费国产电影 | 免费在线观看91 | 天天摸日日操 | 国产黄影院色大全免费 | 国产精品a久久 | 欧美成人理伦片 | 久久玖 | 久草久草在线观看 | 伊人中文网 | 久久99网站 | 欧美精品小视频 | 狠狠操天天干 | www黄色| 人人爽人人澡 | 久久成人黄色 | 九九热有精品 | 中文字幕一二 | 中文字幕在线播放视频 | 最新一区二区三区 | 视频一区视频二区在线观看 | 丁香五月亚洲综合在线 | 亚洲三级在线播放 | 免费看片网址 | 国产在线不卡一区 | 在线视频1卡二卡三卡 | 亚洲天天在线日亚洲洲精 | 99精品视频免费看 | 天天操天天色天天 | www色com| 在线91精品 | 99精品视频免费观看 | 99精品欧美一区二区三区黑人哦 | 国产一级在线观看 | 国产欧美精品一区二区三区 | 亚洲全部视频 | 五月婷婷丁香 | 亚洲天堂香蕉 | 色综合久久久久综合体桃花网 | 免费在线激情电影 | 欧美色婷 | 亚洲一区二区三区精品在线观看 | 婷婷精品在线视频 | 国产九九热视频 | 天天综合网在线观看 | 日本三级人妇 | 亚洲精品91天天久久人人 | 996久久国产精品线观看 | 色吊丝在线永久观看最新版本 | 一区二区三区在线免费观看视频 | 在线观看精品 | 天天草天天 | 一区二区精品视频 | 久青草影院| 久久精品国产免费看久久精品 | 2023亚洲精品国偷拍自产在线 | 亚州国产精品 | 日日爽视频| 国产专区视频在线 | 日韩视频免费在线 | 一区二区三区播放 | 欧美激情xxxx性bbbb | 91视频传媒 | 一区二区三区视频 | 91精品国产乱码久久桃 | 国产精品第一页在线 | 亚洲激情一区二区三区 | 久久a v电影 | 欧美精品少妇xxxxx喷水 | 免费情趣视频 | 国产成人三级三级三级97 | 国产精品aⅴ | 久久综合色天天久久综合图片 | 国产不卡精品 | 中文字幕婷婷 | 中文国产成人精品久久一 | 日产乱码一二三区别免费 | 天天操天天射天天 | 国产成人综合图片 | 色多多视频在线 | 最近中文字幕免费av | 91亚色在线观看 | 国产又粗又猛又爽又黄的视频先 | 亚洲一区二区视频在线 | 热久久免费国产视频 | 免费在线国产视频 | 亚洲精品久久久久久中文传媒 | 国产只有精品 | 在线看黄色av | 欧美无极色 | 午夜视频久久久 | 久久国产视屏 | 黄色精品一区 | 91av在线免费| 成年人免费观看在线视频 | 91久久久国产精品 | 国产福利91精品一区 | 国产亚洲激情视频在线 | 99色在线观看 | 狠狠干狠狠久久 | 国产a视频免费观看 | 92精品国产成人观看免费 | 久久久精品成人 | 少妇性bbb搡bbb爽爽爽欧美 | 亚洲国产午夜视频 | 国产日本三级 | av免费在线观看网站 | 日韩亚洲在线视频 | 精品黄色在线观看 | 国产精品免费久久久 | 欧美一区二区三区四区夜夜大片 | 天天操 夜夜操 | 色五月成人 | 看国产黄色片 | 久久久视频在线 | 久久国产精彩视频 | 亚洲 成人 欧美 | 在线中文日韩 | 黄色大片日本免费大片 | 在线看日韩av | 伊人成人激情 | 91精品久久久久久久久 | 丁香视频全集免费观看 | 久久久久北条麻妃免费看 | 国产日本高清 | 亚洲动漫在线观看 | 在线免费观看黄色 | 97人人模人人爽人人喊网 | a在线免费观看视频 | 中文字幕永久在线 | 国产精品久久久亚洲 | 久久综合在线 | 手机看片福利 | 中文字幕一区二区三区四区在线视频 | 婷婷视频在线观看 | 久久国产精品久久久久 | 日韩一区二区免费在线观看 | 欧美精品久久久久久久久免 | 一本色道久久综合亚洲二区三区 | 国产精品毛片一区二区三区 | 色全色在线资源网 | 日韩区欠美精品av视频 | 欧美一级特黄高清视频 | 亚洲一区二区三区毛片 | 探花视频免费在线观看 | 国产片网站 | 日本久久高清视频 | 亚洲自拍偷拍色图 | 在线a亚洲视频播放在线观看 | 中文字幕区 | 香蕉视频在线网站 | 午夜视频在线观看一区二区三区 | 99久久999久久久精玫瑰 | 国产99一区| 中文字幕第一页av | 色综合久久综合中文综合网 | 超碰97国产精品人人cao | 亚洲热久久 | 91成人免费看 | 亚洲理论在线观看电影 | 中文字幕日韩免费视频 | 欧美成人xxxxxxxx | 成人啪啪18免费游戏链接 | 免费av一级电影 | 99热国内精品 | 婷婷色视频| 91在线区| 日韩女同一区二区三区在线观看 | 欧美性大胆 | 在线观看a视频 | 99自拍视频在线观看 | 国产男女爽爽爽免费视频 | 亚洲一区二区视频在线播放 | 久久亚洲福利视频 | 色婷婷久久久 | 少妇资源站 | 日韩videos| 午夜精品久久久久久久99水蜜桃 | 欧美91精品久久久久国产性生爱 | 久久九九国产视频 | 国产高清一 | 国产黄色一级片在线 | 色视频成人在线观看免 | 久久精品视频日本 | 狠狠狠狠狠狠干 | 天天在线操 | 欧美精品免费在线 | 天天天天爱天天躁 | 久久999精品 | 日日日操操 | 精品中文字幕在线 | 国产精品免费一区二区 | 亚洲成人av免费 | www久草| 国产成人性色生活片 | 最近中文字幕免费av | 欧美一二三区播放 | 国产精品自产拍 | 国产成人不卡 | 欧美久久久影院 | 91久久偷偷做嫩草影院 | 中文字幕有码在线观看 | 久久久久久久久影视 | 五月婷婷丁香在线观看 | 免费无遮挡动漫网站 | 中文字幕黄网 | 国产精品大全 | 国产69精品久久久久久 | 日韩精品欧美一区 | 99综合电影在线视频 | 色综合在| 欧美国产日韩一区二区三区 | 日本高清久久久 | 国内一区二区视频 | 成人免费在线视频 | 免费男女羞羞的视频网站中文字幕 | 天天干天天射天天插 | 中文字幕免费观看 | 亚洲天天在线日亚洲洲精 | 久久夜色精品国产欧美一区麻豆 | 国产精品成人a免费观看 | 亚洲区精品视频 | 久久草 | 最新91在线视频 | 色综合天天做天天爱 | 久久精品一区二区三 | 中文字幕日韩免费视频 | 久久久久国产一区二区三区 | 欧美aa一级 | 日日弄天天弄美女bbbb | 91九色视频在线观看 | 91九色在线视频观看 | 中文字幕在线观看视频网站 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 色国产精品一区在线观看 | 天天干人人干 | 国产精品麻豆一区二区三区 | 精品视频专区 | 亚洲精品国产综合久久 | 久久a视频 | 中文在线免费一区三区 | 国产亚洲一区 | 91av视频在线播放 | 亚洲欧美视频在线观看 | 久久黄色精品视频 | 乱男乱女www7788| 日韩成人一级大片 | 国产中文字幕网 | 亚洲精品激情 | 去干成人网 | 久久综合天天 | 色婷婷免费视频 | 一区二区电影在线观看 | 在线观看中文字幕2021 | 午夜精品导航 | 国产韩国精品一区二区三区 | 一区二区三区电影 | 免费看十八岁美女 | 国产高清不卡一区二区三区 | 国产精品久久久久久久久久ktv | 国产精品麻豆99久久久久久 | 91成年视频 | 看毛片网站 | 久久1区 | 69久久夜色精品国产69 | 91免费的视频在线播放 | 中文乱幕日产无线码1区 | 欧美久久久久久久久久久 | 91资源在线免费观看 | 少妇搡bbbb搡bbb搡忠贞 | 久久99精品一区二区三区三区 | 在线天堂8√ | 美女精品在线 | 国产精品美女久久久久久久久久久 | 91免费网 | 美女免费黄网站 | 丁香综合网 | 国产精品高 | 三级av在线播放 | 国产在线视频一区二区 | 成人影片在线免费观看 | 久久伊人色综合 | 激情综合五月天 | 四虎亚洲精品 | 日韩伦理片一区二区三区 | 久草网首页 | 最新在线你懂的 | 久草视频首页 | 精品国产一二区 | 手机av在线网站 | 国产一级高清 | 久久久久高清 | 国产亚洲小视频 | 欧美激情视频在线免费观看 | 国产网红在线 | 九色91在线视频 | 国产热re99久久6国产精品 | 五月天激情视频在线观看 | 婷婷五天天在线视频 | 亚洲精品毛片一级91精品 | 又污又黄的网站 | 日韩午夜高清 | 91精品国产欧美一区二区 | 国产成人精品一区二区三区网站观看 | 超碰在线中文字幕 | 日韩在线视频观看 | www五月婷婷 | 久久久久久久久久亚洲精品 | 天天综合久久 | 青春草视频在线播放 | 色综合天天色综合 | 亚洲一级免费观看 | 玖玖在线播放 | 精品视频不卡 | 亚洲国产成人精品在线观看 | 精品在线二区 | 93久久精品日日躁夜夜躁欧美 | 麻豆91在线看 | 国内精品久久天天躁人人爽 | 狠狠艹夜夜干 | 国产成人久久精品一区二区三区 | 精品久久久久久久 | 日韩一区二区三区观看 | 99久久这里有精品 | 久久精品国产一区二区三 | 超碰国产在线 | 日韩av看片 | 日韩小视频网站 | 亚洲精品国产精品国自产观看 | 日本中文字幕网址 | 在线欧美国产 | 亚洲女同ⅹxx女同tv | 亚洲精品中文字幕视频 | 黄色毛片一级片 | 丁香六月伊人 | 日韩三级在线观看 | 新版资源中文在线观看 | 国产精选在线观看 | 成人精品国产 | 国产人免费人成免费视频 | 激情视频在线高清看 | 99精品视频精品精品视频 | 又黄又爽又刺激 | 激情欧美国产 | 99这里有精品 | 久久精品国产免费 | 久久精品这里热有精品 | 国产精品系列在线播放 | 免费一级毛毛片 | 色婷婷av国产精品 | 五月婷婷av | 99国产精品久久久久老师 | 日本特黄一级片 | 日本精品视频网站 | 香蕉影院在线观看 | 制服丝袜亚洲 | 欧美国产高清 | 国产黄色片免费看 | 少妇bbw撒尿 | 在线亚洲欧美日韩 | 欧美日韩亚洲一 | 日韩v欧美v日本v亚洲v国产v | 亚洲欧洲久久久 | 精品福利网站 | 日韩在线观看中文 | 狠狠色噜噜狠狠 | 亚洲精品日韩一区二区电影 | 九九热精品在线 | 国产一区二区精品久久91 | 免费看v片 | 欧美aaa视频 | 精品视频中文字幕 | 成人免费视频免费观看 | av免费看电影 | 亚洲狠狠婷婷 | 国产免费高清视频 | 91大神视频网站 | 亚洲一区二区精品3399 | 国产中文字幕久久 | 超碰九九 | 久草香蕉在线视频 | 国产精品美女久久久久久久 | 中文字幕丰满人伦在线 | 97国产情侣爱久久免费观看 | av久久久久久| 成人亚洲精品国产www | 日韩精品久久久久久久电影99爱 | 在线 高清 中文字幕 | 亚洲天堂网站视频 | 中文字幕一二 | 国产在线播放观看 | 精品国产一区二区三区久久久久久 | www黄在线 | 激情久久一区二区三区 | 91豆麻精品91久久久久久 | 亚洲国产剧情 | 国产精品久久久久永久免费观看 | 91在线播放国产 | 去看片| 天天干天天干天天干天天干天天干天天干 | zzijzzij亚洲成熟少妇 | 免费观看av| 91精品在线免费视频 | 国产+日韩欧美 | av三级在线看 | 狠狠操操网 | 国产黄色av影视 | 欧美在线视频日韩 | 五月天婷婷综合 | 少妇性bbb搡bbb爽爽爽欧美 | 亚洲极色 | 国产精品日韩久久久久 | 国产在线视频一区二区三区 | 亚洲黄色免费网站 | 亚洲精品91天天久久人人 | 又黄又爽又湿又无遮挡的在线视频 | a在线观看国产 | 国产色视频一区 | 中文字幕色网站 | 亚洲涩涩一区 | 久久视频一区 | 成人超碰在线 | 免费观看性生交 | 亚洲国产美女精品久久久久∴ | 97精产国品一二三产区在线 | 麻豆国产视频下载 | 国产成人精品一区二区三区网站观看 | 中文字幕在线观看完整版电影 | 日韩在线二区 | 久久影视网 | 日韩av资源站 | 91视频最新网址 | 麻豆视频一区二区 | 日本h视频在线观看 | 手机看片1042| 国产精品国产亚洲精品看不卡15 | 四虎成人av| 久久黄色网址 | 丁香狠狠 | 日韩免费高清在线观看 | 97国产| 精品国内自产拍在线观看视频 | 黄色www在线观看 | 性日韩欧美在线视频 | 在线看国产一区 | 中文在线字幕免费观看 | 天天夜夜狠狠操 | 欧美天天射 | 激情五月婷婷综合 | 黄网站免费久久 | 亚洲视频网站在线观看 | 成人免费一区二区三区在线观看 | 中文字幕区| 色中文字幕在线观看 | 久久久精选 | 日韩精品无码一区二区三区 | 久久久久久国产精品久久 | 久久国内精品视频 | 成人免费观看视频大全 | 久青草视频 | 99这里有精品 | 亚洲免费av观看 | 91资源在线视频 | 国产视频1 | 天天操天天添 | 国产中文字幕在线免费观看 | 日本黄色大片免费 | 久久久国产99久久国产一 | 久艹视频在线免费观看 | 色六月婷婷 | 精品国产欧美一区二区 | 在线观看黄污 | 国产美女黄网站免费 | 中文字幕在线国产精品 | 国产一级黄色免费看 | 午夜免费福利视频 | 在线亚洲成人 | 免费看国产曰批40分钟 | 成年人黄色av| 日韩理论在线 | japanesexxxhd奶水| 国产美女视频 | 五月天激情综合 | 亚洲婷婷在线 | 久久久久草| 日韩av一区在线观看 | 亚洲精品在线观看网站 | 久久精品牌麻豆国产大山 | 丁香花在线观看免费完整版视频 | 久久久久久久电影 | 91久久丝袜国产露脸动漫 | 91精品国自产拍天天拍 | 天天爽人人爽夜夜爽 | av大全在线 | 99久久久久国产精品免费 | 中文字幕一区二区三区在线视频 | 国产麻豆视频在线观看 | 久久久国产精品一区二区三区 | 久久久免费 | 中文字幕在线观看你懂的 | 婷婷色 亚洲 | 国产成人精品国内自产拍免费看 | 国产在线理论片 | 999久久| 五月丁婷婷 | 国产亚洲小视频 | 国产看片 色 | 天天色播 | 久久 地址| 婷婷丁香色 | 香蕉91视频| 91丨精品丨蝌蚪丨白丝jk | 中文字幕电影网 | 毛片网在线播放 | 中文字幕日韩高清 | 成年人视频在线观看免费 | 91视频下载 | 色九九在线 | 精品久久久久亚洲 | 日韩成人在线一区二区 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 高清av在线免费观看 | 国产精品一区二区三区久久 | 免费a级黄色毛片 | 日本h在线播放 | 天天综合成人网 | 日韩手机在线观看 | 午夜精品福利影院 | 国产韩国日本高清视频 | 狠狠色丁香久久婷婷综合五月 | 手机色在线 | 久久久久免费精品 | 视频一区视频二区在线观看 | 91高清在线 | 亚洲精品国产综合久久 | 亚洲va欧美 | 少妇bbb搡bbbb搡bbbb′ | 亚洲激情综合 | 亚洲三级av | 伊人手机在线 | 天堂视频中文在线 | 色片网站在线观看 | 黄p网站在线观看 | 福利视频第一页 | 久久99国产精品久久99 | 99av在线视频 | 国产成人av一区二区三区在线观看 | 欧美日韩国产一区 | 天天爱天天射天天干天天 | 成人av在线一区二区 | 亚洲欧美国产视频 | 在线观看中文 | 日本最大色倩网站www | 97品白浆高清久久久久久 | 中文字幕乱视频 | 国产在线一区二区 | 国产高清日韩 | av在线播放国产 | 国产福利91精品张津瑜 | 色综合色综合久久综合频道88 | 亚洲电影网站 | 一级黄色在线免费观看 | 久久成人综合视频 | 欧美亚洲精品在线观看 | 欧美日韩视频在线 | 久久亚洲私人国产精品 | 婷婷九九| 亚洲日本韩国一区二区 | 国产精品va在线播放 | www国产亚洲精品久久麻豆 | 99视频 | 69绿帽绿奴3pvideos | 99精品免费久久久久久久久日本 | 国产一级在线观看 | 午夜狠狠操 | 久久久国产视频 | 丁香激情视频 | 午夜在线免费观看视频 | 美女免费视频观看网站 | 日韩久久精品一区二区三区 | 最新日韩电影 | 久久久久久久久久亚洲精品 | 亚洲视频网站在线观看 | 国产精品久久久久久久久久久久午夜 | 欧美性久久久 | 一级片视频在线 | 91精品久久久久久综合乱菊 | 最近中文字幕国语免费高清6 | av免费播放 | 国产亚洲精品久久久久久无几年桃 | 久久久久久亚洲精品 | 在线播放第一页 | 在线观看黄色小视频 | 国产精品免费在线视频 | 久章草在线 | 欧美激情精品久久久 | 国产精品18久久久久久首页狼 | 亚洲免费av在线播放 | 最近中文字幕免费视频 | 国产免费久久 | 欧美日韩中文视频 | 免费色网 | 99免费国产 | 在线a人v观看视频 | 欧美激情视频一区 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 久久综合国产伦精品免费 | 中文字幕在线免费观看视频 | 国产成人a亚洲精品v | 久久久夜色 | 中文字幕国内精品 | 欧美日韩成人 | av官网在线 | 午夜美女wwww | 久久精品电影 | 亚洲在线网址 | 久草视频免费观 | 在线成人免费电影 | 久久网站免费 | 一本色道久久精品 | 国产在线精品二区 | 国产一区二区精品久久 | 午夜精品视频免费在线观看 | 免费视频 三区 | 亚洲最新av网站 | 日韩在线观看中文 | 一区二区三区在线视频观看58 | av丝袜制服 | 亚洲一级黄色 | 日韩在线观看一区二区 | 日日干激情五月 | 日韩在线观看视频网站 | 欧美另类交人妖 | 亚洲日本中文字幕在线观看 | 五月婷婷视频在线 | 亚洲精品久久久久久国 | 在线国产一区二区 | 91成人精品在线 | 午夜精品av在线 | 欧美一区二区在线 | 成人avav| 东方av在线免费观看 | 天天躁日日躁狠狠躁av中文 | 国产亚洲精品久久网站 | 日韩精品最新在线观看 | 国产精品丝袜 | 久久草草热国产精品直播 | 又色又爽又激情的59视频 | 黄色电影小说 | 一区二区三区在线免费观看视频 | 色射色| 一区二区三区在线不卡 | 狠狠操狠狠插 | 天天综合网久久综合网 | 国产在线精品一区 | 亚洲精品久 | 18国产精品福利片久久婷 | 国产精品久久久久久久久久久久午夜 | 人人精久 | 五月婷婷导航 | 精品国自产在线观看 | 日韩黄色在线 | 在线免费观看成人 | 中文字幕中文字幕中文字幕 | 奇米四色影狠狠爱7777 | 日韩精品久久一区二区 | 亚洲人成在线观看 | 在线激情网 | 国产小视频免费在线观看 | av成人免费在线观看 | 天天噜天天色 | 成人午夜精品 | 久久久国产精品成人免费 | 亚洲免费精彩视频 | 日本公妇色中文字幕 | av在线网站免费观看 | 青青河边草手机免费 | 午夜国产福利在线观看 | 亚洲免费专区 | 在线免费亚洲 | 手机成人av | 久久兔费看a级 | 中文字幕久久久精品 | 久久久久久久久久网 | 中文字幕在线有码 | 在线激情影院一区 | 91免费高清视频 | 69精品 | 午夜精品久久久久久久久久久久 | av在线免费在线 | 中文字幕在线国产 | 久久久综合香蕉尹人综合网 | 91视频麻豆视频 | 美女视频又黄又免费 | 91视频三区 | 中文字幕在线第一页 | 99免费在线视频观看 | 麻豆视频网址 | 国产理论一区二区三区 | 久久伦理电影网 | 欧美在线视频日韩 | av在线精品| 日日摸日日 | 久久看片网| 99视频精品免费视频 | 日本在线观看黄色 | 在线观看网站黄 | 在线观看视频黄色 | 国内三级在线 | 日韩在线视频在线观看 | 97超碰在线视 | 麻豆视频在线看 | 国产美女无遮挡永久免费 | 国产精品麻豆三级一区视频 | 97色在线观看 | 色综合久久88色综合天天6 | 亚洲精品一区二区18漫画 | 婷婷激情在线观看 | 好看的国产精品视频 | 在线一二三四区 | 久久午夜电影 | 97人人添人澡人人爽超碰动图 | 91成年视频 | 亚洲欧美视频在线播放 | 国产原创av在线 | 国产三级久久久 | 天天干天天拍天天操 | 国产在线理论片 | 欧美日韩国产综合网 | 久久综合国产伦精品免费 | 国产成a人亚洲精v品在线观看 | 久久久久久亚洲精品 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 片黄色毛片黄色毛片 | 天天操天天操天天操 | 亚洲一级片免费观看 | 亚洲精品1234区 | 日本中文一区二区 | 中文视频在线播放 | 久久综合精品国产一区二区三区 | 黄色小说18| 免费看色视频 | 97视频在线播放 | 亚洲一区 影院 | 日日爽夜夜操 | 亚洲精品国产精品乱码在线观看 | 日本三级人妇 | 手机在线看a | 欧美 日韩 国产 成人 在线 | 91看片淫黄大片在线播放 | www一起操 | 激情五月婷婷激情 | 欧美日韩性视频在线 | 91亚洲精品久久久蜜桃借种 | 亚洲欧美视频在线 | 欧美九九九 | 久久久免费精品视频 | 久久久久亚洲精品国产 | av高清网站在线观看 | av中文字幕第一页 | av在线日韩 | 成人a级免费视频 | 美女视频国产 | 日韩高清在线一区二区 | 91成人网在线 | 又黄又刺激视频 | 亚洲黄a| av国产网站| 日本精品视频一区 | 国产成人在线一区 | 肉色欧美久久久久久久免费看 | 欧美另类交人妖 | 国产中文字幕在线视频 | 久久久精品99| 亚洲国产高清在线观看视频 | 五月天中文字幕 | 日韩一区在线播放 | 国产精品欧美一区二区三区不卡 | 国产成人在线观看免费 | 欧美日韩高清免费 | 欧美性粗大hdvideo | 亚洲精品自拍 | 久久视屏网| 国产精品亚洲成人 | 日本黄色一级电影 | 国产成人精品综合久久久久99 | 国产成人av | 日韩一二区在线观看 | 97在线精品 | 激情视频一区二区 | 在线观看福利网站 | 久久夜色精品国产欧美乱极品 | 国产精品免费一区二区三区在线观看 | 在线视频一区观看 | 国产精品一区二区久久精品爱涩 | 天天爱天天插 | 国产色网 | 日韩av影片在线观看 | 亚洲一级久久 | 特级毛片在线免费观看 | 日本中文字幕在线免费观看 | 操操操日日| 成人黄大片视频在线观看 | 国产99视频在线观看 | 日韩久久久久久 | 国产一二三四在线观看视频 | 国产99在线| 在线观看av麻豆 | 99爱视频在线观看 | 黄av免费在线观看 | 极品久久久 | 一区二区不卡视频在线观看 | 一本一本久久aa综合精品 | 色婷五月天 | 91丨九色丨91啦蝌蚪老版 | 久久99国产精品久久 | 久久国产欧美日韩 | 激情小说网站亚洲综合网 | 久操免费视频 | 中文字幕第一页在线 | 久保带人| 日韩欧美在线观看 | 亚洲最新在线视频 | 日韩欧美高清一区二区三区 | 国产精品电影一区二区 | www色综合| 久久精品电影 | 国产成a人亚洲精v品在线观看 | 97色资源| 欧美一级艳片视频免费观看 | 色九九在线 | 亚洲经典视频在线观看 | 日本婷婷色 | 视频成人 | 五月视频 | 午夜丁香视频在线观看 | 天天操夜夜操国产精品 | 一区二区av | 国产中文字幕在线视频 | 成人精品一区二区三区中文字幕 | 日日夜夜爱 | 97成人在线观看视频 | 欧美午夜剧场 | 成人全视频免费观看在线看 | 国产乱老熟视频网88av | 亚洲视频,欧洲视频 | 成人国产在线 | 天天玩天天操天天射 |