Сверхдетальное начало работы с Sentinel

Java
Сверхдетальное начало работы с Sentinel

Статья была выбрана Github, добро пожаловать в Star:GitHub.com/Yehongqin/Лай…

1. Что такое Сентинел

Sentinel позиционируется как охранник распределенных систем. В настоящее время интернет-приложения в основном используют микросервисы, и стабильность микросервисов является очень важным вопросом.Ограничение тока, понижение номинала предохранителяЭто важное средство для поддержания стабильности микросервисов.

Давайте посмотрим на картинку на официальном сайте, чтобы понять основные возможности Sentinel:

До Sentinel Hystrix действительно объединял и понижал версию.Все мы знаем, что появление новых вещей должно быть связано с недостатками оригинальных вещей.

Так в чем же недостаток Hystrix?

  • Изоляция пула потоков, обычно используемая Hystrix, приводит к тому, что накладные расходы на переключение потоков вверх и вниз будут относительно большими.
  • У Hystrix нет платформы для мониторинга, нам нужно построить ее самостоятельно.
  • Деградация автоматического выключателя, поддерживаемая Hystrix, имеет меньше измерений, недостаточно детализирована и не имеет консоли управления.

Из каких компонентов состоит Sentinel?

  • Базовая библиотека (Java-клиент) не зависит ни от какой платформы/библиотеки, может работать во всех средах выполнения Java, а также имеет хорошую поддержку таких платформ, как Dubbo/Spring Cloud.
  • Консоль (Dashboard) разработана на основе Spring Boot и может запускаться сразу после упаковки без дополнительных контейнеров приложений, таких как Tomcat.

Каковы характеристики Sentinel?

  • Богатые сценарии приложений. Контролируйте пакетный трафик в пределах контролируемого диапазона, пики и спады сообщений, управление кластерным трафиком, приложения Fuse в реальном времени, недоступные в нисходящем направлении, и т. д.

  • Полный мониторинг в режиме реального времени. Sentinel предоставляет возможности мониторинга в режиме реального времени. В консоли можно увидеть данные второго уровня отдельной машины, подключенной к приложению, и даже агрегированную работу кластера с масштабом менее 500.

  • Обширная экосистема с открытым исходным кодом. Sentinel предоставляет готовые модули интеграции с другими платформами/библиотеками с открытым исходным кодом, такие как интеграция с Spring Cloud, Dubbo, gRPC. Вам нужно только ввести соответствующие зависимости и выполнить простую настройку для быстрого доступа к Sentinel.

  • Полная точка расширения SPI. Sentinel предоставляет простой в использовании и полный интерфейс расширения SPI. Вы можете быстро настроить логику, реализовав интерфейсы расширения. Например, управление пользовательскими правилами, адаптация источников динамических данных и т. д.

2. Привет, мир

Как правило, если вы хотите изучить техническую структуру, с которой вы никогда не сталкивались, вы должны сначала ознакомиться с Hello World.

Введение зависимостей Maven

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.1</version>
</dependency>

Следует напомнить, что Sentinel поддерживает только JDK 1.8 или выше.

определить правила

Определив правила для управления количеством запросов в секунду, которые разрешено передавать ресурсу, например, следующий код определяет ресурсHelloWorldВ секунду может быть передано не более 20 запросов.

private static void initFlowRules(){
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule();
    rule.setResource("HelloWorld");
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // Set limit QPS to 20.
    rule.setCount(20);
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}

Напишите код Hello World

На самом деле код написать очень просто: сначала нужно определить запись ресурса, а потом использоватьSphU.entry("HelloWorld")иentry.exit()Объемный код, требующий управления потоком. код показывает, как показано ниже:

public static void main(String[] args) throws Exception {
    initFlowRules();
    while (true) {
        Entry entry = null;
        try {
            entry = SphU.entry("HelloWorld");
            /*您的业务逻辑 - 开始*/
            System.out.println("hello world");
            /*您的业务逻辑 - 结束*/
        } catch (BlockException e1) {
            /*流控逻辑处理 - 开始*/
            System.out.println("block!");
            /*流控逻辑处理 - 结束*/
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
    }
}

Результаты приведены ниже:

Просматриваем лог по директории, формат имени файла ${appName}-metrics.log.xxx:

|--timestamp-|------date time----|-resource-|p |block|s |e|rt
1616607101000|2021-03-25 01:31:41|HelloWorld|20|11373|20|0|1|0|0|0
1616607102000|2021-03-25 01:31:42|HelloWorld|20|24236|20|0|0|0|0|0

pПредставляет переданный запрос.

blockПредставляет заблокированный запрос.

sПредставляет количество успешно выполненных запросов.

eПредставляет определяемое пользователем исключение.

rtпредставляет среднее время отклика.

3. Как использовать Стража

Следующее в сочетании с реальным случаем, напишите интерфейс контроллера для демонстрационных упражнений.

@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private UserService userService;

    @RequestMapping("/list")
    public List<User> getUserList() {
        return userService.getList();
    }
}

@Service
public class UserServiceImpl implements UserService {
    //模拟查询数据库数据,返回结果
    @Override
    public List<User> getList() {
        List<User> userList = new ArrayList<>();
        userList.add(new User("1", "周慧敏", 18));
        userList.add(new User("2", "关之琳", 20));
        userList.add(new User("3", "王祖贤", 21));
        return userList;
    }
}

Предположим, мы хотим ограничить ток этого интерфейса запроса, как это сделать?

1) Как бросить исключение

SphUСодержит API в стиле try-catch. Таким образом, когда ресурс дросселируется, он выбрасываетBlockException. В это время можно перехватить исключение и выполнить логическую обработку после текущего ограничения.

@RestController
@RequestMapping("/user")
public class UserController {
	//资源名称
    public static final String RESOURCE_NAME = "userList";

    @Resource
    private UserService userService;

    @RequestMapping("/list")
    public List<User> getUserList() {
        List<User> userList = null;
        Entry entry = null;
        try {
            // 被保护的业务逻辑
            entry = SphU.entry(RESOURCE_NAME);
            userList = userService.getList();
        } catch (BlockException e) {
            // 资源访问阻止,被限流或被降级
            return Collections.singletonList(new User("xxx", "资源访问被限流", 0));
        } catch (Exception e) {
            // 若需要配置降级规则,需要通过这种方式记录业务异常
            Tracer.traceEntry(e, entry);
        } finally {
            // 务必保证 exit,务必保证每个 entry 与 exit 配对
            if (entry != null) {
                entry.exit();
            }
        }
        return userList;
    }

}

На самом деле он еще не написан, а правила ограничения тока должны быть определены.

@SpringBootApplication
public class SpringmvcApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SpringmvcApplication.class, args);
        //初始化限流规则
        initFlowQpsRule();
    }
	//定义了每秒最多接收2个请求
    private static void initFlowQpsRule() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule(UserController.RESOURCE_NAME);
        // set limit qps to 2
        rule.setCount(2);
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setLimitApp("default");
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

Затем запустите проект и протестируйте. После нескольких быстрых обновлений мы видим логику, запускающую текущий лимит.

2) Способ вернуть логическое значение

Способ выбрасывания исключения воспринимать в виде выбрасывания исключения при ограничении тока.Обрабатываем ограничение тока перехватом исключения.Этот метод отличается от вышеописанного тем,что он не выбрасывает исключение,а возвращает логическое значение We Текущая логика ограничения обрабатывается путем оценки логического значения. Таким образом, мы можем легко написатьif-elseкод структуры.

public static final String RESOURCE_NAME_QUERY_USER_BY_ID = "queryUserById";

@RequestMapping("/get/{id}")
public String queryUserById(@PathVariable("id") String id) {
    if (SphO.entry(RESOURCE_NAME_QUERY_USER_BY_ID)) {
        try {
            //被保护的逻辑
            //模拟数据库查询数据
            return JSONObject.toJSONString(new User(id, "Tom", 25));
        } finally {
            //关闭资源
            SphO.exit();
        }
    } else {
        //资源访问阻止,被限流或被降级
        return "Resource is Block!!!";
    }
}

Код для добавления правил такой же, как и в предыдущем примере, поэтому я не буду его писать, а потом запущу проект и протестирую.

3) Способ аннотации

Прочитав два вышеуказанных способа, некоторые люди обязательно скажут, что код слишком навязчивый, если нужно подключить исходную старую систему, исходный код нужно изменить. Как мы все знаем, старый код нельзя перемещать, иначе последствия будут серьезными.

Тогда метод аннотации очень хорошо решает эту проблему. Как писать аннотации?

@Service
public class UserServiceImpl implements UserService {
    //资源名称
    public static final String RESOURCE_NAME_QUERY_USER_BY_NAME = "queryUserByUserName";

    //value是资源名称,是必填项。blockHandler填限流处理的方法名称
    @Override
    @SentinelResource(value = RESOURCE_NAME_QUERY_USER_BY_NAME, blockHandler = "queryUserByUserNameBlock")
    public User queryByUserName(String userName) {
        return new User("0", userName, 18);
    }

    //注意细节,一定要跟原函数的返回值和形参一致,并且形参最后要加个BlockException参数
    //否则会报错,FlowException: null
    public User queryUserByUserNameBlock(String userName, BlockException ex) {
        //打印异常
        ex.printStackTrace();
        return new User("xxx", "用户名称:{" + userName + "},资源访问被限流", 0);
    }
}

После написания этого основного кода добавьте конфигурацию, иначе она не вступит в силу.

вводитьsentinel-annotation-aspectjМавен зависимости.

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>1.8.1</version>
</dependency>

потомSentinelResourceAspectЗарегистрируйтесь как бин.

@Configuration
public class SentinelAspectConfiguration {
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

Не забудьте добавить правила, можете сослаться на первый пример, который здесь писаться не будет.

Наконец, запустите проект, протестируйте, несколько раз обновите интерфейс, запустите текущий лимит, и вы увидите следующие результаты.

4) Переход на более раннюю версию

В дополнение к ограничению тока интерфейса, Sentinel также может обеспечивать функцию плавления и деградации, когда интерфейс неисправен.

существует@SentinelResourceВ аннотации есть атрибутfallback, когда выдается исключение, отличное от BlockException, он вводит резервный метод для реализации механизма прерывателя цепи, который чем-то похож на FallBack от Hystrix.

Давайте возьмем приведенный выше пример в качестве демонстрации. Если имя пользователя пусто, будет выдано исключение RuntimeException. Затем мы устанавливаем значение атрибута fallback, то есть метод fallback, и возвращаем системное исключение.

@Override
@SentinelResource(value = RESOURCE_NAME_QUERY_USER_BY_NAME, blockHandler = "queryUserByUserNameBlock", fallback = "queryUserByUserNameFallBack")
public User queryByUserName(String userName) {
    if (userName == null || "".equals(userName)) {
        //抛出异常
        throw new RuntimeException("queryByUserName() command failed, userName is null");
    }
    return new User("0", userName, 18);
}

public User queryUserByUserNameFallBack(String userName, Throwable ex) {
    //打印日志
    ex.printStackTrace();
    return new User("-1", "用户名称:{" + userName + "},系统异常,请稍后重试", 0);
}

Затем запустите проект, намеренно не передавая имя пользователя, и протестируйте его, вы можете увидеть логику метода отката.

Консоль IDEA также может отображать пользовательскую информацию об исключениях.

В-четвертых, консоль управления

Базовое использование Sentinel было описано выше, но на самом деле основным моментом является консоль управления Sentinel, которая предоставляет множество практических функций. Давайте посмотрим, как его использовать.

Сначала загрузите jar-пакет консоли, конечно, вы также можете скомпилировать его, загрузив исходный код.

//下载页面地址
https://github.com/alibaba/Sentinel/releases

Затем начните с:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar

После успешного запуска посетитеhttp://localhost:8080, имя пользователя и пароль для входа по умолчанию обаsentinel.

После входа в систему вы можете увидеть главную страницу, там много меню функций, и я не буду приводить их здесь по одному.

Консоль клиентского доступа

Итак, как наши собственные приложения подключаются к консоли и используют консоль для мониторинга трафика приложений, господа, пожалуйста, продолжайте читать.

Сначала добавьте зависимости maven, клиент должен представить модуль Transport для связи с консолью Sentinel.

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.8.1</version>
</dependency>

Настройте фильтр для автоматического подсчета всех посещаемых веб-URL-адресов как ресурсов Sentinel.

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean sentinelFilterRegistration() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new CommonFilter());
        registration.addUrlPatterns("/*");
        registration.setName("sentinelFilter");
        registration.setOrder(1);

        return registration;
    }
}

Добавьте следующую конфигурацию в команду запуска,-Dcsp.sentinel.dashboard.server=consoleIp:portуказать адрес консоли и порт,-Dcsp.sentinel.api.port=xxxxУказываем порт клиентского API мониторинга (по умолчанию 8019, т.к. консоль уже использовала 8719, а на стороне приложения для предотвращения конфликтов используется 8720):

-Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dcsp.sentinel.api.port=8720 -Dproject.name=sentinelDemo

Запустив проект, мы можем увидеть дополнительное имя приложения sentinelDemo, нажмите на список машин, чтобы просмотреть состояние работоспособности.

просить/user/listинтерфейс, а затем мы можем видеть ситуацию с QPS на отслеживаемом интерфейсе в режиме реального времени.

Это означает, что клиентский доступ к консоли выполнен успешно!

динамические правила

Философия Sentinel заключается в том, что разработчикам нужно обращать внимание только на определение ресурсов, и когда определение ресурса выполнено успешно, можно динамически добавлять различные правила деградации управления потоком. Sentinel предоставляет два способа изменения правил:

  • Изменить напрямую через API (loadRules)
  • пройти черезDataSourceАдаптироваться к различным модификациям источника данных

Вручную определить правила через API. Предыдущий пример Hello World был написан. Это жестко закодированная форма. Поскольку она недостаточно гибкая, ее нельзя применять в производственной среде.

Итак, чтобы представитьDataSource, настройки правил могут храниться в источнике данных.Обновляя правила, хранящиеся в источнике данных, и отправляя их в центр правил Sentinel, клиент может получать самые последние правила в режиме реального времени, а также ограничивать и понижать текущие в соответствии с последние правила.

в целомDataSourceОбщие реализации расширений:

  • Режим вытягивания:Клиент регулярно опрашивает и извлекает правила из центра управления правилами., этим центром правил может быть SQL, файл и т. д. Преимущество в том, что это относительно просто, а недостаток в том, что изменения нельзя получить вовремя.
  • Режим принудительной отправки: центр правил равномерно распределяет изменения, а клиент постоянно отслеживает изменения, регистрируя слушателей, например, используя центры конфигурации, такие как Nacos и Zookeeper. Этот метод имеет лучшие гарантии реального времени и согласованности, и его рекомендуется использовать.

режим вытягивания

Источники данных в режиме извлечения обычно доступны для записи (например, локальные файлы). Сначала зарегистрируйте источник данных на клиенте, зарегистрируйте соответствующий источник данных чтения в соответствующем RuleManager, затем зарегистрируйте источник данных записи в транспорте.WritableDataSourceRegistryсередина.

Видно, что это двусторонний процесс чтения и записи.Мы можем либо напрямую изменить файл локально, чтобы обновить правила, либо протолкнуть правила через консоль Sentinel. На следующем рисунке показана блок-схема правила отправки консоли.

Сначала введите зависимости maven.

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-extension</artifactId>
    <version>1.8.1</version>
</dependency>

Для расширения с помощью механизма SPI создайте класс реализации, реализующий метод init() интерфейса InitFunc.

public class FileDataSourceInit implements InitFunc {

    public FileDataSourceInit() {
    }

    @Override
    public void init() throws Exception {
        String filePath = System.getProperty("user.home") + "\\sentinel\\rules\\sentinel.json";
        ReadableDataSource<String, List<FlowRule>> ds = new FileRefreshableDataSource<>(
            filePath, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {
            })
        );
        // 将可读数据源注册至 FlowRuleManager.
        FlowRuleManager.register2Property(ds.getProperty());

        WritableDataSource<List<FlowRule>> wds = new FileWritableDataSource<>(filePath, this::encodeJson);
        // 将可写数据源注册至 transport 模块的 WritableDataSourceRegistry 中.
        // 这样收到控制台推送的规则时,Sentinel 会先更新到内存,然后将规则写入到文件中.
        WritableDataSourceRegistry.registerFlowDataSource(wds);
    }

    private <T> String encodeJson(T t) {
        return JSON.toJSONString(t);
    }
}

в проектеresources/META-INF/servicesСоздайте файл в каталоге с именемcom.alibaba.csp.sentinel.init.InitFunc, содержимое представляет собой полное имя FileDataSourceInit:

io.github.yehongzhi.springmvc.config.FileDataSourceInit

Затем в каталоге ${home} создайте\sentinel\rulesкаталог, а затем создайте файл sentinel.json.

Затем запустите проект, отправьте запрос, и когда клиент получит запрос, будет запущена операция инициализации. После завершения инициализации заходим в консоль, а затем устанавливаем правила ограничения трафика.

После добавления локальный файлsentinel.jsonПри этом сохраняется и содержимое правила (json, сжатый в одну строку).

[{"clusterConfig":{"acquireRefuseStrategy":0,"clientOfflineTime":2000,"fallbackToLocalWhenFail":true,"resourceTimeout":2000,"resourceTimeoutStrategy":0,"sampleCount":10,"strategy":0,"thresholdType":0,"windowIntervalMs":1000},"clusterMode":false,"controlBehavior":0,"count":3.0,"grade":1,"limitApp":"default","maxQueueingTimeMs":500,"resource":"userList","strategy":0,"warmUpPeriodSec":10}]

Мы можем обновить содержимое правила, изменив файл, или мы можем передать правило в файл через консоль, что является режимом извлечения. Недостатком является то, что согласованность не гарантируется, производительность в реальном времени не гарантируется, а слишком частые извлечения могут вызвать проблемы с производительностью.

толкающий режим

Я только что сказал, что производительность режима pull в реальном времени не может быть гарантирована, а режим push решает эту проблему. Кроме того, он также может быть сохранен, то есть данные сохраняются в источнике данных, и предыдущая конфигурация не будет потеряна даже при его перезапуске, что также решает проблему невозможности сохранения исходного режима в памяти.

Существует множество источников данных, которые можно использовать с Sentinel, например ZooKeeper, Nacos, Apollo и т. д. Вот как использовать Nacos.

Сначала запустите сервер Nacos, затем войдите в консоль Nacos, добавьте пространство имен и добавьте конфигурации.

Затем нам нужно изменить исходный код Sentinel. Поскольку jar-файл Sentinel, предоставленный на официальном веб-сайте, находится в исходном режиме, его необходимо изменить, поэтому нам нужно извлечь исходный код и изменить его, а затем самостоятельно скомпилировать пакет jar.

Адрес источника:GitHub.com/alibaba/s ru…

Потянув его вниз, импортируйте его в IDEA, после чего мы увидим следующую структуру каталогов.

Сначала измените дозорную панельpom.xmlдокумент:

Второй шаг — переместить четыре класса, связанных с Nacos, из тестового каталога в каталог правил.

FlowRuleNacosProvider и FlowRuleNacosPublisher изменять не нужно, мне не очень нравится суффикс имени, поэтому я удалил последний суффикс.

Затем NacosConfig добавляет конфигурацию адреса Nacos.

Наиболее важным является преобразование FlowControllerV1, который представляет собой несколько интерфейсов для добавления, удаления, изменения и проверки конфигурации правил.

Добавьте две службы, перемещенные в каталог правил, в класс FlowControllerV1.

@Autowired
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

Добавьте закрытый метод publishRules() для отправки конфигурации:

private void publishRules(/*@NonNull*/ String app) throws Exception {
    List<FlowRuleEntity> rules = repository.findAllByApp(app);
    rulePublisher.publish(app, rules);
}

Измените метод apiQueryMachineRules().

Измените метод apiAddFlowRule().

Измените метод apiUpdateFlowRule().

Измените метод apiDeleteFlowRule().

Проект консоли Sentinel был преобразован, и он скомпилирован в jar-пакет для запуска в производственной среде, а если он обучаемый, то его можно запустить прямо в IDEA.

Добавляем зависимости в файл pom.xml созданного ранее проекта HelloWord.

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.1</version>
</dependency>

Затем добавьте следующую конфигурацию в файл application.yml:

spring:
  cloud:
    sentinel:
      datasource:
        flow:
          nacos:
            server-addr: localhost:8848
            namespace: 05f447bc-8a0b-4686-9c34-344d7206ea94
            dataId: springmvc-sentinel-flow-rules
            groupId: SENTINEL_GROUP
            # 规则类型,取值见:
            # org.springframework.cloud.alibaba.sentinel.datasource.RuleType
            rule-type: flow
            data-type: json
  application:
    name: springmvc-sentinel-flow-rules

Вышеупомянутое завершает всю настройку и преобразование, запускает консоль Sentinel и приложение Java.

Открываем консоль Nacos, добавляем текущую ограничивающую конфигурацию следующим образом:

Содержание конфигурации следующее:

[{"app":"springmvc-sentinel-flow-rules","clusterConfig":{"acquireRefuseStrategy":0,"clientOfflineTime":2000,"fallbackToLocalWhenFail":true,"resourceTimeout":2000,"resourceTimeoutStrategy":0,"sampleCount":10,"strategy":0,"thresholdType":0,"windowIntervalMs":1000},"clusterMode":false,"controlBehavior":0,"count":1.0,"grade":1,"limitApp":"default","maxQueueingTimeMs":500,"resource":"userList","strategy":0,"warmUpPeriodSec":10},{"app":"springmvc-sentinel-flow-rules","clusterConfig":{"acquireRefuseStrategy":0,"clientOfflineTime":2000,"fallbackToLocalWhenFail":true,"resourceTimeout":2000,"resourceTimeoutStrategy":0,"sampleCount":10,"strategy":0,"thresholdType":0,"windowIntervalMs":1000},"clusterMode":false,"controlBehavior":0,"count":3.0,"grade":1,"limitApp":"default","maxQueueingTimeMs":500,"resource":"queryUserByUserName","strategy":0,"warmUpPeriodSec":10}]

Затем мы открываем консоль Sentinel и видим конфигурацию, которая доказывает, что загрузка конфигурации Nacos прошла успешно.

Мы пытаемся вызвать интерфейс Java-приложения, чтобы проверить, работает ли оно.

Вы можете увидеть, что текущее ограничение действует, а затем посмотреть количество запросов в секунду, отслеживаемых Sentinel.

Из мониторинга QPS самый высокий QPS составляет всего 3, а все остальные запросы отклоняются, что доказывает, что текущая конфигурация ограничения действует в режиме реального времени.

Информация о конфигурации также сохраняется в таблицах конфигурации, связанных с Nacos.

На данный момент понятнее взглянуть на архитектурную схему режима push на официальном сайте Sentinel.

Суммировать

В этой статье в основном представлены основы использования Sentinel, а также два способа динамических правил.Кроме того, есть, конечно, много функций.Из-за недостатка места я не буду представлять их по одному.Заинтересованные друзья могут изучить его по самих себя. Лично я считаю, что Sentinel — очень хороший компонент, это действительно большое улучшение по сравнению с оригинальным Hystrix, и его стоит рекомендовать.

Мы видели список компаний, зарегистрированных на официальном сайте, и многие известные компании используют его, я верю, что Sentinel будет становиться все лучше и лучше в будущем.

Это все, что касается этой статьи, спасибо за чтение, я надеюсь, что вы сможете что-то получить после ее прочтения!

Ставьте лайки, если считаете это полезным, ваши лайки — самая большая мотивация для моего творчества.~

Я программист, который изо всех сил старается запомниться. Увидимся в следующий раз! ! !

Возможности ограничены, если есть какие-то ошибки или неуместности, просьба критиковать и исправлять их, учиться и обмениваться вместе!