日韩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ò),歡迎將生活随笔推薦給好友。

国产v欧美| 久久永久视频 | 波多野结衣网址 | 在线天堂日本 | 欧美日韩国产精品一区 | 日韩剧情 | 国产成人三级一区二区在线观看一 | 久久精彩 | 色婷婷97 | 亚洲国产日韩欧美 | 狠狠色丁香久久婷婷综 | 国产精品激情偷乱一区二区∴ | 免费下载高清毛片 | 日韩国产欧美视频 | 国产一级特黄电影 | 久久久国产一区二区三区四区小说 | 久久成人18免费网站 | 99精品乱码国产在线观看 | 欧美日本不卡 | 亚洲精品久久视频 | 亚洲最快最全在线视频 | 在线综合 亚洲 欧美在线视频 | av免费电影网站 | 国产免费xvideos视频入口 | 亚洲精品国产电影 | 日韩成人欧美 | 日韩二区在线观看 | 成人网页在线免费观看 | 久久久久亚洲国产精品 | 日韩久久激情 | 国产精品手机播放 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 婷婷久月 | 国产高清中文字幕 | 五月黄色 | 亚洲丁香久久久 | 国产手机精品视频 | 91麻豆网站 | 亚洲午夜av久久乱码 | 国产一级二级在线观看 | 黄色的视频网站 | 国产综合在线观看视频 | 婷婷色综合色 | 中文字幕国语官网在线视频 | 国产精品毛片久久久 | 毛片888| 亚洲国产偷 | 国产精品麻豆果冻传媒在线播放 | 狠狠色伊人亚洲综合成人 | 一级精品视频在线观看宜春院 | 国产在线视频一区二区三区 | 亚在线播放中文视频 | 四季av综合网站 | 97精品欧美91久久久久久 | 99精品一区二区三区 | 亚洲无吗视频在线 | www.狠狠操.com | 中文字幕在线精品 | 亚州av免费 | 日韩在线观看视频网站 | 中文字幕永久 | 亚洲三级视频 | 狠狠操操 | av电影亚洲 | 91精品欧美一区二区三区 | 免费视频在线观看网站 | 亚洲日本va午夜在线电影 | 亚洲午夜小视频 | 黄色成品视频 | 久久av在线 | 国产剧情在线一区 | 欧美久久电影 | 天天操天天弄 | 成人a免费看 | 片黄色毛片黄色毛片 | 亚洲精品自在在线观看 | 91精品在线免费观看 | 91中文在线视频 | 婷婷性综合 | 激情 婷婷| av免费看在线 | 色婷婷国产精品 | 欧美成人h版| 国产精品久久久久久久久久久久午夜片 | 免费在线91| 91九色蝌蚪国产 | 国产精品免费视频久久久 | 久久国产精品99久久久久久进口 | 99爱精品在线 | 久久精品久久国产 | 最新精品视频在线 | 国产黄色a | 天天做天天爱夜夜爽 | 成年人黄色在线观看 | 亚洲高清精品在线 | 97超碰人人澡人人爱学生 | 亚洲天天摸日日摸天天欢 | 久草综合在线 | 探花视频在线版播放免费观看 | 中文字幕一区av | 又黄又网站 | 99精品国产视频 | 成人在线视频一区 | 超碰在线观看av.com | 亚洲高清精品在线 | 成人欧美在线 | 国产中文字幕在线观看 | 久久久91精品国产一区二区三区 | 99re视频在线观看 | 精品久久电影 | 伊人一级 | 精品久久久一区二区 | 亚洲一区欧美精品 | 91av超碰| 激情五月婷婷激情 | 久久丁香网 | 久久天堂影院 | 97国产精品 | 久久97久久97精品免视看 | 久久免费的视频 | 91污污| 91高清视频免费 | www黄色大片 | 国产精品露脸在线 | 日韩网站中文字幕 | www.久久99| 亚洲无线视频 | 国产手机视频在线观看 | 美女网站黄在线观看 | 伊人资源站| 97电影在线观看 | 天天插夜夜操 | 97超视频 | 国产精品18久久久久久首页狼 | 丁香网婷婷 | 在线最新av | 黄色中文字幕 | www免费视频com | 黄色a级片在线观看 | 国产一线二线三线在线观看 | 五月天.com| 精品久久久久一区二区国产 | 国产一区免费视频 | 日韩手机视频 | av黄色亚洲 | 97人人艹| 国产午夜精品一区二区三区欧美 | 免费网站在线观看成人 | 91精品在线播放 | 狠狠狠色狠狠色综合 | 日韩视频图片 | 不卡的av电影 | 五月天,com | 色婷婷激情综合 | 日韩在线观看网址 | 亚洲午夜电影网 | 色爽网站 | 黄色大片av| www夜夜 | 亚洲黄a | 日韩a级免费视频 | 911在线| 午夜久草 | 精品久久九九 | 中文字幕高清在线 | 国产精品久久久久久久久久直播 | 天堂视频中文在线 | 日韩一区二区三区不卡 | 国产一区二区在线免费播放 | 天堂中文在线播放 | 久久99热久久99精品 | 香蕉网在线播放 | a天堂在线看 | 色在线免费| www.黄色片网站 | 国产亚洲精品久久久久久无几年桃 | 国产小视频在线观看 | 亚洲视频 在线观看 | 99视频在线精品国自产拍免费观看 | 天天综合网 天天综合色 | 久久国产影视 | 中文字幕一区二区三区四区在线视频 | 奇米777777 | 在线亚洲高清视频 | 日本在线中文在线 | 91久久精品一区二区二区 | av日韩在线网站 | 网站在线观看你们懂的 | 亚洲精品国偷拍自产在线观看 | 国产精品大全 | 天天想夜夜操 | 久草在线中文视频 | 午夜国产一区二区 | 手机看片福利 | 午夜免费电影院 | 亚洲理论电影网 | 久久天堂影院 | 国产又粗又猛又爽 | 国产美女网站在线观看 | 婷婷精品在线视频 | www.色就是色 | 久草在线手机观看 | 天天色天天射天天干 | 激情五月激情综合网 | 亚洲欧美成人在线 | 日韩视频欧美视频 | 香蕉成人在线视频 | 久久久99国产精品免费 | 99人久久精品视频最新地址 | 美女黄久久 | 500部大龄熟乱视频使用方法 | 97精品欧美91久久久久久 | 免费网站黄 | 欧美热久久 | 91人人澡人人爽人人精品 | www.com.黄 | 97在线精品国自产拍中文 | 久久久久国产视频 | 99国产一区| 国产午夜精品一区二区三区嫩草 | 91九色国产在线 | 国产手机视频在线播放 | 有码中文在线 | 99久久精品免费看 | 久久香蕉影视 | 亚洲精品国产第一综合99久久 | 美州a亚洲一视本频v色道 | 人人射人人爱 | 4p变态网欧美系列 | 99精品免费久久久久久久久日本 | 麻豆视频国产在线观看 | 欧洲精品码一区二区三区免费看 | av成人动漫在线观看 | 精品一区精品二区高清 | 免费人成在线观看网站 | 欧美精品在线观看 | 99久久精品电影 | 亚洲精品美女久久17c | 福利在线看片 | 激情综合国产 | 中文区中文字幕免费看 | 亚洲视频 一区 | 中文字幕电影高清在线观看 | 久草免费手机视频 | 中文字幕三区 | 高清中文字幕av | 国产99免费 | se视频网址| 福利片免费看 | 欧美极品在线播放 | 99热手机在线观看 | 国产69精品久久久久99尤 | 日韩中文字幕免费看 | 2023年中文无字幕文字 | 99久久久国产精品免费观看 | 国产精品久久人 | 久草在线网址 | 91手机视频| 69热国产视频 | 国产亚洲成av片在线观看 | 精品一区二区综合 | 91成人精品在线 | 久久爱影视i| 亚洲在线精品视频 | 韩国精品一区二区三区六区色诱 | 欧美久草视频 | 久久久久久免费毛片精品 | 国产视频一区二区在线观看 | 97国产情侣爱久久免费观看 | 在线观看岛国av | 伊人婷婷激情 | 日韩激情久久 | 99精品视频一区 | 国产精品久久久久9999吃药 | 亚洲小视频在线 | 成人免费在线观看电影 | 亚洲激情 | 国产护士hd高朝护士1 | 玖玖玖在线| 亚洲精品视频久久 | 又黄又网站 | 超碰国产97| 69av视频在线观看 | 中文字幕av在线 | 久久国产一区 | 免费看片网址 | 亚洲国产精品一区二区久久,亚洲午夜 | 久久99国产综合精品 | 在线一二三四区 | 欧美亚洲另类在线视频 | 国产不卡网站 | 四季av综合网站 | 人人玩人人添人人 | 国产高清中文字幕 | 在线观看岛国av | 免费网站在线 | 国产精品久久久av久久久 | 日韩在线观看 | 97视频资源 | 亚洲国产成人精品电影在线观看 | 五月的婷婷 | a v在线视频 | 51久久成人国产精品麻豆 | 国产91亚洲精品 | 美女免费视频一区二区 | 在线观看av麻豆 | 国产精品久久久免费看 | 亚洲成人资源在线观看 | 日韩69视频 | 911久久香蕉国产线看观看 | 亚洲特级毛片 | 又黄又刺激又爽的视频 | 日本婷婷色| 最近中文字幕视频完整版 | jizz欧美性9| 日韩中文字幕视频在线观看 | 人人爽人人射 | 久久婷婷开心 | 九九视频精品免费 | 国产精品亚洲片在线播放 | 午夜久久久久久久久久影院 | 国产91在线观| 久久精品99久久久久久 | 日韩av一卡二卡三卡 | 久久99热国产 | 久久精品男人的天堂 | 91成人免费观看视频 | 日韩黄色一级电影 | 激情在线免费视频 | 亚洲经典视频在线观看 | 久久精品站 | 免费手机黄色网址 | 国产精品久久久久久久久久久久久 | 日韩av成人免费看 | 在线免费观看羞羞视频 | 91久久国产自产拍夜夜嗨 | 久草热久草视频 | 久久精品女人毛片国产 | 国产小视频免费在线网址 | 天天射天天射天天 | 日本丶国产丶欧美色综合 | 免费成人黄色片 | 午夜三级理论 | 最新av在线免费观看 | 91精品婷婷国产综合久久蝌蚪 | 精品久久久精品 | 久久99久久99精品免观看粉嫩 | 久久国产精品成人免费浪潮 | 欧美日韩一区二区在线观看 | www免费| 日韩av综合网站 | 九九九视频在线 | 91精品国产99久久久久 | 在线观看免费观看在线91 | 久久人人97超碰com | 美女视频黄免费网站 | 日韩网站免费观看 | 亚洲综合视频在线播放 | 香蕉视频在线免费 | 欧美日韩国产综合网 | 亚洲国产日韩欧美在线 | 国产高清久久久久 | 欧美日韩精品影院 | 国产精品免费在线视频 | 中文字幕免费高清av | 国产精品美女毛片真酒店 | 久久久久久毛片精品免费不卡 | 国产999精品久久久久久绿帽 | 91看片淫黄大片一级在线观看 | 亚洲精品欧洲精品 | 黄污网站在线 | 免费成人av网站 | 美女久久99 | 国产精品理论片在线观看 | 亚洲婷婷丁香 | 欧美成人xxxxx| 久久精品9| 国产高清av免费在线观看 | 中文字幕一区二区三区四区 | 激情网婷婷| 久久久福利影院 | 精品毛片在线 | 狠狠色噜噜狠狠狠狠2022 | 天天干天天在线 | 欧美另类高清 videos | 日韩黄色中文字幕 | 黄色免费电影网站 | 久久亚洲在线 | 黄色小说视频网站 | www.色午夜 | 在线免费黄色片 | 亚洲自拍自偷 | 国产黄色片免费观看 | 黄色大全在线观看 | 夜夜干夜夜 | 国产综合91 | 欧美巨大荫蒂茸毛毛人妖 | 亚洲黄色高清 | 亚洲自拍偷拍色图 | 激情欧美一区二区三区免费看 | 免费v片| 国产在线精品视频 | 色婷丁香 | 91成人网在线观看 | 婷婷精品国产一区二区三区日韩 | 久久99免费观看 | 综合网伊人 | 97在线观看视频国产 | 九九九电影免费看 | 国产1级视频 | 成人黄色小说在线观看 | www99久久 | 天天草天天草 | 婷婷在线看 | 久久精品精品 | 99资源网 | 成人亚洲欧美 | 最近免费在线观看 | 99久久久国产免费 | 黄色片网站免费 | 日韩精品久久久久 | 中文字幕你懂的 | 97超碰福利久久精品 | 中文字幕二区 | 成人精品影视 | 亚洲精品小视频在线观看 | 亚洲三级黄色 | 99久热在线精品视频成人一区 | 国产精品美女久久久久久网站 | 在线欧美小视频 | 在线免费观看视频一区 | 日日碰狠狠添天天爽超碰97久久 | 一级淫片a| www.午夜 | 91污污视频在线观看 | 免费日韩 精品中文字幕视频在线 | 色橹橹欧美在线观看视频高清 | 午夜精品久久久久久久久久久久久久 | 香蕉影院在线 | 最近日本中文字幕a | 国产亚洲精品久久久久久网站 | 丁香六月婷 | 91午夜精品| 国产91精品一区二区麻豆网站 | 最新中文在线视频 | 欧美日韩精品免费观看视频 | 国产99久久九九精品免费 | 四虎8848免费高清在线观看 | 久久66热这里只有精品 | 一级α片免费看 | 在线视频精品 | 国产高清专区 | 一级片免费视频 | 亚洲激情 欧美激情 | 99免费在线观看视频 | 中文字幕在线观看视频一区二区三区 | 一区在线电影 | 天天天操天天天干 | 九九视频热 | 色婷婷综合久久久中文字幕 | 九九九九九九精品任你躁 | 成人av电影在线 | 99re中文字幕 | 国产亚洲精品久久久久久久久久久久 | 午夜免费久久看 | 亚洲成人av在线 | 亚洲无人区小视频 | 久久99精品久久久久久三级 | 色九九视频 | 久久国产精品影视 | 国产一区欧美在线 | 三级av在线播放 | 国产成人精品久久久 | 欧美日韩国产页 | 97精品欧美91久久久久久 | 97成人在线免费视频 | 美女免费网站 | 久久精彩视频 | av片免费播放 | 日韩啪啪小视频 | 久久永久视频 | 日韩av在线免费看 | 中文av影院| 久草视频2| 激情在线五月天 | 亚洲成人第一区 | 国内久久久久 | 久久久久久久久久久久国产精品 | 91在线色 | 国产精品一区二区三区在线免费观看 | 久久婷婷一区二区三区 | 九九热只有这里有精品 | 毛片区 | 欧美日韩一级视频 | 国产九九精品视频 | 亚洲第一久久久 | 色姑娘综合天天 | 国产免费观看久久黄 | 久久免费av电影 | avlulu久久精品| 日韩午夜视频在线观看 | 五月婷网 | 在线 欧美 日韩 | 久草视频免费在线观看 | av一区在线 | 欧美美女激情18p | 91精品视频免费在线观看 | 波多野结衣久久精品 | 日韩超碰 | 欧洲亚洲女同hd | av电影中文字幕在线观看 | 国产伦精品一区二区三区照片91 | 久久天天综合网 | 韩国av一区二区三区 | 丁香六月网 | 国产成人精品久久二区二区 | 天天天射 | 99久久精品国产毛片 | 69精品视频| 日韩区欠美精品av视频 | 国产精品麻豆果冻传媒在线播放 | 狠狠色伊人亚洲综合网站野外 | 精品一区二区在线看 | 美女黄网久久 | 涩涩网站在线播放 | 亚洲成人中文在线 | 开心激情久久 | 国产亚洲精品电影 | 日韩视频www | 国产精品福利在线 | 欧美va日韩va| 黄色视屏免费在线观看 | 最新动作电影 | 欧美精品久久久久性色 | 久久一区二区三区超碰国产精品 | 色美女在线| 999男人的天堂| 中文字幕欧美日韩va免费视频 | 久久免费国产视频 | 国产麻豆精品95视频 | 中文字幕色播 | 亚洲精品视频在线观看视频 | 国产精品网红福利 | 国产精品99久久久 | 91精品1区2区| 美腿丝袜一区二区三区 | 国产午夜三级一区二区三桃花影视 | 视频国产区 | 在线观看免费av网 | wwwwwww色| 日韩精品视频在线观看网址 | 免费黄色小网站 | 麻豆国产精品视频 | 欧美一级艳片视频免费观看 | 九九免费在线观看 | 国产色拍拍拍拍在线精品 | 国产精品久久久999 国产91九色视频 | 免费电影一区二区三区 | 精品欧美在线视频 | 亚洲草视频 | 波多野结衣精品 | 日韩欧美在线观看一区二区 | 深爱激情亚洲 | 99c视频在线 | 九草视频在线 | 日韩电影中文字幕在线 | 在线视频一区二区 | 久久久久国产一区二区三区四区 | 18av在线视频 | 日韩天天操| 天堂va在线观看 | 亚色视频在线观看 | 人人插人人搞 | 性色av一区二区三区在线观看 | 四虎永久网站 | 97电影手机版 | 久久久久久久久久久网 | 91超碰免费在线 | 欧美性生活免费看 | 日日操操操 | 青草视频在线看 | 高清av影院 | av资源免费观看 | 免费在线激情视频 | 一区二区三区 亚洲 | 久久亚洲福利 | 91视频91自拍| 激情网综合 | 日韩欧美有码在线 | 成人a在线观看 | 色av婷婷 | 五月天婷婷在线观看视频 | 亚洲一区二区精品视频 | 久久91久久久久麻豆精品 | 99久久精品国产免费看不卡 | 国产精品久久久久永久免费观看 | 久久久精品视频网站 | 国内一区二区视频 | 色综合咪咪久久网 | 国产精品久久久久久久久岛 | 深夜免费福利网站 | 久久激情五月激情 | 国产成人在线免费观看 | 精品中文字幕在线观看 | 三级黄色网址 | 日韩美女一级片 | 97视频人人免费看 | 97电影在线| 欧美最猛性xxx | 色久天 | 亚洲人人av | 久久久久 免费视频 | 天天天操操操 | 日韩在线第一 | 日本护士撒尿xxxx18 | 欧美日韩中文在线视频 | 在线视频国产区 | 黄色av免费看 | 国产91亚洲精品 | 最新av电影网址 | 超碰成人av | 黄色小网站免费看 | 岛国av在线不卡 | 九九热视频在线播放 | 最新中文字幕在线资源 | 最近能播放的中文字幕 | 色操插| 国产精品中文在线 | 日韩高清在线一区 | 又长又大又黑又粗欧美 | 91麻豆网 | 麻豆系列在线观看 | 欧美人牲| 中文字幕影片免费在线观看 | 天天夜夜操 | 国产精品欧美日韩在线观看 | 激情婷婷在线 | 777奇米四色 | 亚洲在线精品视频 | 免费的国产精品 | 视频国产在线观看18 | 免费在线播放av电影 | 国产一区二区三区黄 | a久久免费视频 | 日本一区二区不卡高清 | 精品国产网址 | 色综合www | 国产成人精品在线观看 | 在线观看网站黄 | 日韩av中文字幕在线 | 免费午夜视频在线观看 | 黄网站污| 国产精品小视频网站 | 国产精品免费一区二区三区在线观看 | 亚洲精品在线观看不卡 | 中文在线字幕免费观看 | 亚洲精品资源在线 | 91精品久久香蕉国产线看观看 | 91香蕉视频在线下载 | 亚洲乱码一区 | 国产亚洲精品久久久久久久久久久久 | 在线视频国产区 | 国产五月色婷婷六月丁香视频 | 精品视频资源站 | 国产在线观看h | 99视频免费观看 | 日韩精品在线免费观看 | 在线视频麻豆 | 在线观看日韩一区 | 五月天丁香亚洲 | 久久任你操 | www.av在线播放 | 国产成人在线综合 | 日韩精品偷拍 | 午夜视频不卡 | 96亚洲精品久久 | 美女黄频免费 | 99热精品在线 | 成人黄色电影在线播放 | 免费看91的网站 | av激情五月 | 国内免费的中文字幕 | 成人动漫视频在线 | 手机在线永久免费观看av片 | 日韩激情视频在线观看 | 麻豆影视在线免费观看 | 成人小视频免费在线观看 | 国产一区二区高清视频 | 色综合网在线 | 久久免费试看 | 九九在线精品视频 | 一区二区精品视频 | 午夜久久成人 | 性日韩欧美在线视频 | 国产精品1区2区在线观看 | 国产精品久久久久久久久久久久 | 亚洲免费在线视频 | 91亚洲精品在线观看 | 免费观看黄色12片一级视频 | 亚洲精品女人久久久 | 亚洲高清激情 | 亚州av一区 | 激情伊人| 欧美日韩中文字幕视频 | 亚洲电影一区二区 | 国产在线高清 | 91人人揉日日捏人人看 | 激情网五月婷婷 | 亚洲精选99 | 成人国产亚洲 | 欧美一级片播放 | 久久综合狠狠综合久久激情 | 久久男人中文字幕资源站 | 欧美精品资源 | 婷婷开心久久网 | 国产成人久久久久 | se视频网址 | 高清不卡毛片 | 国产精品久久久久aaaa九色 | 久久免费av电影 | 香蕉久久久久久av成人 | 91系列在线观看 | 亚洲日韩欧美视频 | 中文字幕免费高清av | 999电影免费在线观看2020 | 香蕉久草 | 国产精品嫩草影视久久久 | 亚洲热视频 | 久久国产精品免费视频 | 国内精品久久久精品电影院 | 久久久婷 | 免费 在线 中文 日本 | 免费观看高清 | 亚洲国产成人在线观看 | 91天天操 | 四虎www com| 欧美一级免费高清 | 日日操日日操 | 婷婷五天天在线视频 | 日韩欧美视频在线观看免费 | 成人在线视频在线观看 | 免费观看性生交大片3 | 亚洲成人在线免费 | 黄网站污 | 色婷婷丁香 | 亚洲精品免费在线观看 | 欧美国产日韩一区二区三区 | 免费99视频| 久99久久| 成年人app网址 | 四虎在线观看精品视频 | 色婷婷亚洲婷婷 | 国产一级免费片 | 亚洲精品在线观看中文字幕 | 99久久精品无码一区二区毛片 | 欧美日韩高清一区二区三区 | 在线精品视频免费观看 | 国产精品毛片一区视频播不卡 | 国产又粗又猛又黄又爽 | 欧美一区二区三区特黄 | 久久综合色天天久久综合图片 | www.com.黄| 日韩久久精品一区二区三区下载 | 欧美黄色成人 | 网站在线观看你们懂的 | 国产精品免费在线视频 | 国产精品理论在线观看 | 成人资源在线播放 | 久久精品一二三 | 午夜视频免费播放 | 在线免费视频你懂的 | 久久99深爱久久99精品 | 激情欧美xxxx| 国产精品99久久免费观看 | 免费av高清| 黄色大全免费网站 | 在线视频福利 | 日韩免费网站 | 91麻豆文化传媒在线观看 | 97色噜噜| 亚洲人片在线观看 | 国产在线视频一区二区三区 | 午夜婷婷网 | 最近中文字幕 | 婷婷网站天天婷婷网站 | 最近中文字幕视频网 | 国产一区视频在线 | 日韩av电影网站在线观看 | 国产热re99久久6国产精品 | av电影 一区二区 | 免费久久99精品国产婷婷六月 | 狠狠操.com | 欧美成人久久 | 欧美国产日韩一区二区三区 | 国产精品av在线 | 黄色一区二区在线观看 | 在线观看中文字幕av | 在线播放一区 | 日韩黄色软件 | 天天操操操操操操 | 亚洲成成品网站 | 91麻豆精品国产91久久久无需广告 | 在线精品视频免费播放 | 国产精品v欧美精品 | 国内精品久久久久久久久 | 丰满少妇一级 | 丝袜美腿在线视频 | 午夜av片| 国产成人免费精品 | 精品国产乱码久久久久久天美 | 在线国产福利 | av中文字幕免费在线观看 | 五月婷婷在线观看视频 | 在线a人v观看视频 | 成人久久亚洲 | 日日操夜夜操狠狠操 | 成人黄色一级视频 | 欧洲亚洲激情 | 欧美一级电影在线观看 | 天天干 夜夜操 | 亚洲美女在线国产 | 97人人模人人爽人人喊中文字 | 狠狠操精品 | 1区2区视频 | 一区二区三区四区五区在线 | 99色婷婷 | 麻豆视频在线免费 | av一区在线 | 天天操人 | 成人午夜性影院 | 天天插夜夜操 | 色婷婷国产精品一区在线观看 | 亚洲一二三在线 | 国产不卡在线播放 | 五月天天色 | 亚洲精品美女久久17c | 久久www免费视频 | 999抗病毒口服液 | 97**国产露脸精品国产 | 日韩电影一区二区在线观看 | 久久精品99国产国产精 | 欧美亚洲一区二区在线 | 成人影视免费 | 国产九色在线播放九色 | 欧美日韩性视频 | 狠狠干狠狠色 | 天堂va在线高清一区 | 香蕉视频91| 久久国产免费 | 国产精品久久久久久久午夜片 | 日韩av综合网站 | 成人教育av| 亚洲久草在线 | 美女网站在线播放 | 国产精品免费观看久久 | 日韩v在线 | 999热线在线观看 | 久久久久网站 | 免费看片网址 | 97碰在线视频 | 一级黄色片在线免费看 | av电影不卡 | 69视频网站 | 色射爱 | 免费看av在线 | 一区二区三区久久精品 | 亚洲第一伊人 | 六月丁香婷婷网 | 操操日 | 亚洲v欧美v国产v在线观看 | 久久精品96 | 二区三区在线视频 | 日韩成人黄色 | 狠狠狠狠干 | 成人免费网视频 | 国产一级性生活视频 | 欧美日韩国产欧美 | 99中文视频在线 | 超碰国产97| 最新日韩中文字幕 | 丁香综合av | 黄色成人av | 久久综合狠狠综合久久狠狠色综合 | 欧洲精品在线视频 | 免费观看一级一片 | 中文字幕在线视频一区二区 | 久久精品直播 | 色婷婷综合成人av | 91av美女| 很黄很污的视频网站 | 美女黄频网站 | 日韩在线视频观看免费 | 欧美性色黄大片在线观看 | 日本性动态图 | 国产中文字幕视频在线观看 | 色五月情| 999久久久久久久久 69av视频在线观看 | 天天曰天天| 免费观看性生活大片3 | 五月激情久久 | 丝袜足交在线 | 在线观看黄色大片 | 六月天综合网 | 国产自制av | 日韩精品一区二区不卡 | 免费午夜av | 99国产在线观看 | 成人a v视频 | 国产成年免费视频 | 97在线看| 欧美日韩在线视频一区二区 | 成人资源在线 | 成人av亚洲 | 97色综合 | 亚洲少妇天堂 | 欧美精品亚洲二区 | 69国产盗摄一区二区三区五区 | 国产黄色大片免费看 | 国产精品 中文在线 | 99 久久久久 | 香蕉久久国产 | 中文字幕你懂的 | 日本久久成人中文字幕电影 | 日韩高清在线一区二区 | 一区二区中文字幕在线观看 | 国产精品 中文字幕 亚洲 欧美 | 久草在线观看 | 91高清视频在线 | 国产一级免费观看视频 | 中文字幕文字幕一区二区 | 久久国产视屏 | 久久综合干 | 国内久久精品 | 91视频91色 | 亚洲精品国产区 | 欧洲成人av| 亚洲一二三区精品 | 国产精品久久网 | 欧美日韩有码 | 日韩国产在线观看 | 黄色av一区二区三区 | 成人免费在线观看入口 | 黄色特级片 | 色婷婷色 | 黄色片视频免费 | 色婷婷免费视频 | 99亚洲精品 | 一区 二区 精品 | www国产亚洲精品 | 国产黄色精品在线 | 国产精品免费久久久久影院仙踪林 | 久久国产精品二国产精品中国洋人 | 草久草久 | 91在线日韩 | 天天操夜夜看 | 亚洲爱爱视频 | 天天曰天天干 | 91完整视频 | 美国三级黄色大片 | 免费在线成人av | 国产成人av在线 | 成人av电影免费在线播放 | 999久久国产精品免费观看网站 | 亚洲视频在线看 | 欧美人体xx | 99re亚洲国产精品 | 日韩欧美视频一区二区三区 | 国产在线一线 | 激情黄色av| 日本久久91| 手机av永久免费 | 四虎亚洲精品 | 国产精品久久久一区二区 | 最近中文字幕在线播放 | 在线播放av网址 | 在线电影 一区 | 久久69精品 | 伊人久久在线观看 | 天天亚洲| 狠狠五月婷婷 | 国产成人综 | 精品视频123区在线观看 | 日产乱码一二三区别在线 | 久久久国产精品人人片99精片欧美一 | 成人 国产 在线 | 亚洲丁香久久久 | 婷婷综合网 | 国产精品久久久久久久免费 | 就色干综合| 日韩欧美v | 久久久亚洲麻豆日韩精品一区三区 | 国产偷国产偷亚洲清高 | 黄色资源网站 | 高清av中文在线字幕观看1 | 欧美日韩高清一区二区 | av免费线看 | 国产精品二区在线观看 | 成人久久久久久久久久 |