- 센티널 세 가지 관리 모식
| 전송 방식 | 설명 | 장점 | 단점 |
|---|---|---|---|
| 기본 방식 | API가 규칙을 클라이언트에 푸시하여 메모리에 저장, 확장 가능한 쓰기 데이터 소스(WritableDataSource) 활용 | 간단하며 의존성 없음 | 일관성 보장 불가, 규칙 지속성 없음, 재시작 시 규칙 소실 |
| Pull 방식 | 확장 가능한 쓰기 데이터 소스(WritableDataSource), 클라이언트가 주기적으로 규칙 관리 센터에서 규칙 가져옴 (RDBS, 파일 등) | 간단하며 의존성 없음, 규칙 지속성 | 일관성 및 실시간성 보장 어려움, 빈번한 폴링 성능 문제 |
| Push 방식 | 확장 가능한 읽기 데이터 소스(ReadableDataSource), 규칙 중앙이 데이터 통일 푸시, 클라이언트가 리스너 등록으로 변경 감시 (Nacos, Zookeeper) | 규칙 지속성, 일관성 보장 | 제3자 도구 의존성 증가 |
- 기본 모드 (테스트 환경 모드)
일관성 보장 불가, 규칙 지속성 없음, 재시작 시 규칙 소실됨.
- Pull 방식
클라이언트가 주기적으로 규칙 관리 센터에서 규칙을 폴링 방식으로 가져옴. 이 규칙 센터는 RDBMS, 파일, 심지어 VCS 등이 될 수 있음. 장점은 구현이 간단하지만, 변경을 즉시 반영하지 못하는 단점이 있음.
Pull 기반: 동적 파일 데이터 소스, Consul, Eureka.
- Push 방식 (프로덕션 환경 모드)
규칙 중앙에서 데이터를 통일 푸시하고, 클라이언트는 리스너 등록 방식으로 변화를 실시간 감시. Nacos, Zookeeper 등 구성 센터를 사용. 더 나은 실시간성과 일관성 보장.
Push 기반: ZooKeeper, Redis, Nacos, Apollo, etcd.
- 클라이언트와 Nacos 연동을 통한 규칙 지속성
5.1 클라이언트와 Nacos 구성 센터 연동
Springcloud 환경에서 Nacos 구성 센터 통합 가이드
5.2 pom.xml에 의존성 추가
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
5.3 설정 파일 (bootstrap.yml)
spring:
application:
name: 사용자-서비스
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
prefix: dubbo-user-api
file-extension: yml
sentinel:
transport:
dashboard: 127.0.0.1:6780
eager: true # 지연 로딩 비활성화
datasource:
ds-user-flow-rule:
nacos:
server-addr: 127.0.0.1:8848
dataId: user-flow-rule
groupId: user-sentinel
namespace: sentinel
rule-type: flow # AUTHORITY(권한 규칙) DEGRADE(서킷 브레이커 규칙) FLOW(트래픽 제어 규칙) GW_API_GROUP GW_FLOW PARAM_FLOW(핫스팟 규칙) SYSTEM(시스템 규칙)
ds-user-degrade-rule:
nacos:
server-addr: 127.0.0.1:8848
dataId: user-degrade-rule
groupId: user-sentinel
namespace: sentinel
rule-type: degrade # AUTHORITY(권한 규칙) DEGRADE(서킷 브레이커 규칙) FLOW(트래픽 제어 규칙) GW_API_GROUP GW_FLOW PARAM_FLOW(핫스팟 규칙) SYSTEM(시스템 규칙)
5.4 Nacos에 구성 파일 추가
5.4.1 user-flow-rule
[
{
"resource": "/api/user/getName",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
5.4.2 user-degrade-rule
[
{
"resource": "/api/user/getName",
"limitApp": "default",
"count": 1,
"timeWindow": 5,
"grade": 0,
"minRequestAmount": 3,
"statIntervalMs": 1000,
"slowRatioThreshold": 0.5
}
]
5.5 요약
Nacos 구성 센터를 주 구성원으로, 센티널 대시보드를 임시 관리 플랫폼(긴급 문제 처리용)으로 사용하는 것이 적합함.
단점: 센티널 대시보드에서 조정된 정보는 Nacos 구성 센터로 동기화되지 않음.
- 센티널 대시보드와 Nacos 구성 센터 연동
트래픽 제어 규칙을 예시로 설명.
6.1 클라이언트 설정 조정
spring:
application:
name: 사용자-서비스
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
prefix: dubbo-user-api
file-extension: yml
sentinel:
transport:
dashboard: 127.0.0.1:6780
eager: true # 지연 로딩 비활성화
datasource:
ds-user-flow-rule:
nacos:
server-addr: 127.0.0.1:8848
#dataId: user-flow-rule
#groupId: user-sentinel
#namespace: sentinel
dataId: user-flow-rules
groupId: SENTINEL_GROUP
rule-type: flow # AUTHORITY(권한 규칙) DEGRADE(서킷 브레이커 규칙) FLOW(트래픽 제어 규칙) GW_API_GROUP GW_FLOW PARAM_FLOW(핫스팟 규칙) SYSTEM(시스템 규칙)
ds-user-degrade-rule:
nacos:
server-addr: 127.0.0.1:8848
dataId: user-degrade-rule
groupId: user-sentinel
namespace: sentinel
rule-type: degrade # AUTHORITY(권한 규칙) DEGRADE(서킷 브레이커 규칙) FLOW(트래픽 제어 규칙) GW_API_GROUP GW_FLOW PARAM_FLOW(핫스팟 규칙) SYSTEM(시스템 규칙)
6.2 소스코드 다운로드
깃허브 주소: https://github.com/alibaba/Sentinel
소스코드 주소: https://github.com/alibaba/Sentinel.git
6.3 수정 (sentinel-dashboard)
6.3.1 pom.xml 파일 수정
<!-- Nacos 규칙 발행자 샘플을 위한 의존성 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!-- Nacos 연동 시 <scope>test</scope> 주석 처리 -->
</dependency>
6.3.2 코드 이동
test 디렉토리의 nacos 폴더를 main 디렉토리의 해당 위치로 복사.
6.3.3 NacosConfig.java 수정
자신의 Nacos 구성 센터 주소 추가.
@Bean
public ConfigService nacosConfigService() throws Exception {
return ConfigFactory.createConfigService("127.0.0.1:8848");
}
6.3.4 FlowControllerV2.java 수정
// Nacos 연동 수정 - 기존 코드 주석 처리
// @Autowired
// @Qualifier("flowRuleDefaultProvider")
// private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
// @Autowired
// @Qualifier("flowRuleDefaultPublisher")
// private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
// Nacos 연동 수정 - 새 코드 추가
@Autowired
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
6.3.5 sidebar.html 수정
주석 처리된 코드 활성화
다음 코드 주석 처리
6.4 빌드 및 실행
java -Dserver.port=6780 -jar sentinel-dashboard.jar