предисловие
Информация о правиле, заданная в консоли Sentinel, по умолчанию хранится в памяти. Итак, перезапустите ли вы дозорный клиент или дозорную консоль. Установленные вами правила будут потеряны. Если вы хотите использовать Sentinel в онлайн-среде, вы можете либо оплатить платную версию на Alibaba Cloud, либо реализовать сохранение правил самостоятельно.Если вы или ваша компания неплохие деньги, то закройте эту статью и заплатите за это напрямую. Версируйте его, сэкономьте много ям, чтобы наступить. Или вы индивидуалист, так что давайте двигаться дальше.
Во-первых, давайте поговорим о причине этой статьи, потому что мне действительно нужно интегрироваться с APLLO, наступить на подозреваемого. Другой момент - найти много статей об интегрированном Аполлоне, все они сделаны Демо, то есть синхронно. Однако в правилах Sentinel также есть много правил, таких как правила предохранителей, ограничения параметров, ограничение тока системы, черные и белые списки.Каждое правило является несогласованным, они не упоминаются, и некоторые клиентские ямы исчезли. Я наступил на столько ям, имея немного опыта и опыта, прочесывая и здесь, надеюсь, помочь читателям.
Извлеките исходный код консоли Sentinel, чтобы изменить
Из-за того, что модификаций слишком много, в этой статье мы не будем вдаваться в подробности.Все скриншоты ниже представляют собой измененное содержимое, а поскольку на момент написания этой статьи версия 1.7 разрабатывалась на мастере, версий снапшотов очень много. Так что обрезана до текущей стабильной ветки 1.6 для модификации. У меня есть форк-страж для моего github, ниже измененный контентадрес
Пункт модификации 1: Реализуйте интерфейсы pull и push для всех правил.
Добавлены и реализованы все правила конфигурации Provider и Publisher pull и push.
Пункт модификации 2: измените API-интерфейс действия правила, используемый консолью.
Преобразование большого количества правил в консоли управления эксплуатацией.
Пункт модификации 3: изменить xxEntity
Последний пункт также является самой жалкой модификацией большого количества классов xxEntity.Эти классы являются обычными классами сущностей, которые сами по себе ничем не являются.Исходный код напрямую сохраняется в json, но spring-cloud-alibaba для клиентской интеграции использует json проверка.Если json, сохраненный apollo, немного отличается от класса сущности клиента, сообщитепреобразовать 0 правил, но есть 1 правило из источника данных.RuleCLass: FlowRule.Вы чувствуете себя сбитым с толку, что эта ошибка имеет с ошибкой преобразования формата json, следующееspring-cloud-alibabajson код преобразования.
Брат, написавший этот код, съел это исключение и добавил другое// won't be happenПримечания, вы можете понять, мне дали, это очень жесткие боевые ямы, позже обнаружили проблему здесь, верно? Позже нашел те же два вопроса по GithubВопрос 1,вопрос 2, добавьте @JSONField(serialize = false) ко всем неиспользуемым полям в xxEntity в соответствии с методом.
Пункт модификации 4: извлечь конфигурацию, чтобы ее можно было передать при запуске
Добавленная конфигурация ниже
Используйте модифицированную консольную версию
- Вы можете разветвить официальный код Sentinel и изменить его самостоятельно, как указано выше, а затем упаковать его.
- Вы можете получить дозорный код моего форка и упаковать его напрямую.
- Вы можете использовать пакет, который я уже сделаладрес
пользовательская конфигурация
| Имя конфигурации | Требуется ли | По умолчанию | эффект |
|---|---|---|---|
| env | нет | DEV | Укажите среду, используемую аполлоном |
| app.id | нет | sentinel-apollo | Указывает идентификатор приложения apollo, в котором сохраняются дозорные правила. |
| cluster.name | нет | default | Указывает кластер Apollo, используемый для сохранения Sentinel. |
| namespace.name | нет | application | Указывает пространство имен Apollo, используемое для сохранения Sentinel. |
| modify.user | да | Учетная запись-модификатор отображается в консоли apollo, эта учетная запись должна иметь разрешение для этого приложения. | |
| modify.comment | нет | modify by sentinel-dashboard | Заметки об изменениях, отображаемые в консоли аполлона |
| release.user | да | Учетная запись издателя отображается в консоли apollo, эта учетная запись должна иметь разрешения для этого приложения. | |
| release.comment | нет | release by sentinel-dashboard | Примечания к выпуску, отображаемые консолью аполлона |
| apollo.portal.url | да | адрес консоли аполлона | |
| apollo.application.token | да | Указывает OpenApi приложения Apollo для сохранения правил Sentinel. | |
| authority.key.suffix | нет | authority | Суффикс ключа, которым правила аутентификации хранятся в apollo |
| degrade.key.suffix | нет | degrade | Суффикс ключа, хранящегося в аполлоне, для правила автоматического выключателя. |
| flow.key.suffix | нет | flow | Суффикс ключа, которым хранится текущее ограничивающее правило в apollo. |
| param.key.suffix | нет | param_flow | Суффикс ключа правила ограничения тока параметра, сохраненного в apollo |
| system.key.suffix | нет | system | Суффикс ключа, хранящийся в аполлоне по текущим правилам ограничения системы |
| auth.username | нет | sentinel | Имя пользователя для входа в консоль Sentinel |
| auth.password | нет | sentinel | Пароль для входа в консоль Sentinel |
| server.port | нет | 8080 | Порт запуска дозорной консоли |
Конфигурация Аполлона
Создать проект для сохранения дозорного
- Нажмите кнопку «Создать проект».
- Введите информацию о проекте
- Идентификатор приложениясоответствует таблице вышеapp.id
- менеджер приложенийсоответствует таблице вышеmodify.userа такжеrelease.user
- Создайте общедоступное пространство имен
- Нажмите кнопку «Добавить пространство имен» в правом нижнем углу.
- Создать пространство имен
- Имена соответствуют указанным в таблице вышеnamespace.name, обратите внимание, что имя должно содержать название отдела, которое здесь не учитывается.
- Тип должен быть выбран public , причина будет объяснена позже
- Нажмите кнопку «Добавить пространство имен» в правом нижнем углу.
- Опубликовать пространство имен
- Личное пространство не может быть унаследовано, приложение бесполезно и может быть удалено
- Цель здесь состоит в том, чтобы мы выделили отдельное приложение apollo для сохранения правил.Поскольку оно является общедоступным, другие приложения apollo могут наследоваться, так что для проектов, которые интегрировали apollo, изменения будут минимальными.
- Обратите внимание на красную подсказку, общественное пространство, которое мы создаем, должно быть опубликовано первым, иначе доступ к API будет невозможен.
- Личное пространство не может быть унаследовано, приложение бесполезно и может быть удалено
- Открытая авторизация платформы для этого проекта
- Нажмите в правом верхнем углуУправление авторизацией на открытой платформе
- Создать приложение
- Идентификатор стороннего приложенияэто appId проекта, который вы создали выше
- Название стороннего приложенияпиши что хочешь
- наделение полномочиями
- tokenСоздается автоматически после того, как вы нажмете «Создать приложение».
- Управляемое приложениеэто appId проекта, который вы создали выше
- Тип авторизацииНеобходимо выбрать приложение
- Нажмите в правом верхнем углуУправление авторизацией на открытой платформе
встроенный часовой Spring Boot
исходный кодадрес
импортировать зависимости
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-apollo</artifactId>
<version>1.5.2</version>
</dependency>
тестовый контроллер
package cn.coder4j.study.example.sentinel;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author buhao
* @version TestController.java, v 0.1 2019-09-19 20:53 buhao
*/
@RequestMapping("/test")
@Controller
public class TestController {
/**
* 没有注解通过自适应的限流
* @return
*/
@GetMapping("/flowRule")
@ResponseBody
public String flowRule(){
return "success";
}
/**
* 通过手动注解的限流
* @return
*/
@GetMapping("/flowRuleWithAnno")
@ResponseBody
@SentinelResource("flowRuleWithAnno")
public String flowRuleWithAnno(){
return "success";
}
/**
* 参数限流规则测试
* @param param
* @return
*/
@GetMapping("/paramFlowRule")
@ResponseBody
@SentinelResource("paramFlowRule")
public String paramFlowRule(String param){
return "success";
}
/**
* 熔断规则测试
* @return
*/
@GetMapping("/degradeRule")
@ResponseBody
@SentinelResource("degradeRule")
public String degradeRule(){
throw new RuntimeException("服务器异常");
}
}
настроить application.yml
apollo:
bootstrap:
enabled: true # 开启 apollo
meta: xxx # 指定 apollo 注册地址
app:
id: sentinel-apollo # 指定规则项目在 apollo 的app.id,要与 sentinel 控制台启动参数一致
spring:
application:
name: study-sentinel-example # 应用名称,不同项目要唯一,会把他做为规则 Key 的前缀
cloud:
sentinel:
transport:
dashboard: localhost:8989 # sentinel 控制台的地址
datasource:
ds1:
apollo:
namespace-name: {部门名}.sentinel-rule # 保存规则的 apollo 应用的公共 namespace, 要与 sentinel 控制台启动参数一致
rule-type: flow # 指定该数据源是限流规则
flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds1.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
ds2:
apollo:
namespace-name: {部门名}.sentinel-rule
rule-type: degrade # 指定该数据源是熔断规则
flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds2.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
ds3:
apollo:
namespace-name: {部门名}.sentinel-rule
rule-type: param_flow # 指定该数据源是参数限流规则
flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds3.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
ds4:
apollo:
namespace-name: {部门名}.sentinel-rule
rule-type: system # 指定该数据源是系统限流规则
flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds4.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
ds5:
apollo:
namespace-name: {部门名}.sentinel-rule
rule-type: authority # 指定该数据源是认证限流(黑白名单)规则
flow-rules-key: ${spring.application.name}-${spring.cloud.sentinel.datasource.ds5.apollo.rule-type} # 指定该规则在 apollo 应用中 key 名称
конфигурация дозорной консоли
- Sentinel не имеет данных приложения при первом запуске, просто запросите интерфейс вашего приложения несколько раз.
- После запроса вы можете увидеть, что наше приложение находится в списке справа
- Сначала нажмите на точку мониторинга кластера. Если она пуста, это означает, что интерфейс не был запрошен. Через предоставленный выше скрипт jmeter вы можете быстро получить доступ ко всем интерфейсам, как показано на следующем рисунке после доступа.
- Видно, что в дополнение к именам ресурсов, которые мы определяем вручную с помощью аннотаций, есть также некоторые имена ресурсов, которые проходят через наш путь к контроллеру.Они автоматически адаптируются после того, как наш клиент интегрирует пакет spring-cloud-starter-alibaba-sentinel. . . . На самом деле между ними есть различия
- Он вернется после автоматически адаптированного ограничения токаBlocked by Sentinel (flow limiting)
- Аннотированный будет кидатьUndeclaredThrowableExceptionисключение, мы можем пройтистатьяУпомянутый метод превращается в текущую ограничивающую обработку исключений, которую мы хотим.
- Операция справа — добавление различных правил, после модификации они будут синхронизированы с клиентом в режиме реального времени и сохранены в apollo.
- Видно, что в дополнение к именам ресурсов, которые мы определяем вручную с помощью аннотаций, есть также некоторые имена ресурсов, которые проходят через наш путь к контроллеру.Они автоматически адаптируются после того, как наш клиент интегрирует пакет spring-cloud-starter-alibaba-sentinel. . . . На самом деле между ними есть различия
конфигурация jmeter
jmeter используется для тестирования и проверки правил.Поскольку количество потоков может быть установлено, он может очень хорошо проверить текущую ситуацию ограничения. тестовый скриптскачать
-
Группа потоков должна установить поток равным 100, что удобно для дальнейшей статистики.Кроме того, чтобы завершить выполнение в течение одной секунды, время нарастания устанавливается равным 0.
-
Значение по умолчанию — это адрес, запрашиваемый для заполнения в вашем локальном проекте запуска тестирования.
-
Правило xx заполняет адрес тестового интерфейса, а в параметре current limit пишется два из-за контрольного эксперимента.
-
Просмотрите дерево результатов, чтобы увидеть содержимое и результаты каждого сделанного вами запроса.
-
Вы можете видеть, что на предыдущем рисунке есть красный и зеленый цвета, красный означает, что утверждение не выполнено, зеленый означает, что утверждение выполнено успешно, а содержание утверждения содержит успех.
-
Агрегированная статистика, это может подсчитывать общие результаты после 100 запросов потоков, нам нужно только посмотреть процент отказов Error%. На рисунке видно, что, за исключением ограничения тока предохранителя, другие коэффициенты отказов ограничения тока равны 0
шаги теста
- найдено в ссылке точки кластера/test/flowRuleИ нажмитеУправление потокомкнопка
- Введите 10 для порога для одной машины и нажмите «Добавить».
- После добавления он перейдет на страницу правил процесса
- Запустите jemter, вы увидите, что частота отказов составляет 90%, что означает, что ваш текущий лимит выполнен успешно.
- Выше говорилось, что ошибка произошла из-за того, что утверждение не удалось, то есть оно не вернуло успех, так что же он возвращает сейчас?
- Посмотрите на дерево результатов, найдите запись с красным конвертом и посмотрите количество ответов.
- Вы можете видеть, что возврат "Blocked by Sentinel (flow limiting)", это возвращаемое значение настроенной после интеграции страницы текущего лимита, доступ к которой можно получить черезspring.cloud.sentinel.servlet.block-pageНазначить своей страницей
- Кроме того, откройте apollo, и вы увидите, что есть еще одно правило, это текущее ограничивающее правило, которое вы только что добавили.
Приглашаю обратить внимание на мой паблик "Разбитые мысли КИВИ", там же можно собратьмой блог