기본 서비스 - 사용자 센터
사용자 센터란 무엇인가요?
사용자 센터, 사용자 정보, 계정 정보 및 테넌트 정보 관리 제어를 포함한 더 넓은 범위의 개념에서 전체 설계에서 경계의 설계가 더 타이트하면 RBAC 부서의 기능 권한의 일부가 비즈니스가 급격히 증가하는 시점으로 나눌 수 있습니다.
사용자 센터 기능의 범위
사용자 서비스 센터
계정 서비스 센터
테넌트 서비스 센터
RBAC서비스 센터
위의 서비스 센터는 i와 독립적으로 또는 모놀리식 배포 모드로 배포할 수 있지만 결과적으로 도메인 세분화 원칙은 변경되지 않습니다.
사용자 서비스 센터
주로 관련 사용자 서비스 정보
- 기본 사용자 정보 관리
- 사용자 기본 정보 검색
- 사용자 정보 확장 기능
계정 서비스 센터
주로 연결된 계정이 있는 서비스의 i 성능에 맞춰져 있습니다.
계정 정보 관리
- 계정 등록 기능을 위한 서비스 인터페이스
- 계정 취소 기능을 위한 서비스 인터페이스
- 계정 상태 제어 할당량 서비스 인터페이스
계정 인증 관리
- 사용자 로그인 서비스 i-인터페이스
- 사용자 로그아웃 서비스 인터페이스
- 계정 JWT 체크섬 인증 서비스 기능
- 계정 클럽화 제어 메커니즘
테넌트 서비스 센터
주로 테넌트 분리 메커니즘 및 테넌트 제어를 포함하여 관련 테넌트 개념과 관련된 i에 중점을 둡니다.
테넌트 정보 유지 관리: 테넌트 정보 데이터를 유지 관리하고 테넌트의 유효 기간 또는 유효 범위를 제어합니다.
테넌트 권한 제어: 테넌트 관련 데이터 권한 격리 메커니즘(예: 스키마 수준, 테이블 수준, 라이브러리 수준 등)을 사용합니다.
Dubbo3RPC 기술 호출 시스템
이 장에서는 Dubbo3의 RPC 서비스 호출 시스템을 사용하여 게이트웨이 센터와 권한 보안 센터를 사용자 센터에 인터페이스하여 게이트웨이 센터 -> 보안 센터 -> 사용자 센터로 만들 계획입니다.
보안 센터는 인증 처리, 사용자 센터는 정보 유지 관리 및 제어, 게이트웨이 센터는 라우팅 서비스 및 필터링 제어 감사를 위해 사용됩니다.
사용자 센터 디자인의 기술 콘텐츠
관련 사용 사례를 위한 Dubbo3 주석 구성
서버 측 구성 제어
먼저 서비스 제공업체의 구성 정보 클래스를 작성합니다.
@Configuration
@EnableDubbo(scanBasePackages = "xx.xx.xx")
@PropertySource("classpath:/spring/dubbo-provider.properties")
static class ProviderConfiguration {
}
EnableDubbo 어노테이션은 Spring xx.xx.xx 패키지 검색 트래버스를 활성화하여 관련 Dubbo 어노테이션과 관련된 모든 클래스를 찾도록 합니다.
서비스 공급자 인터페이스 정의
서비스 공급자 구현으로 @DubboService: 에 의해 수정되는 인터페이스 구현 클래스가 있습니다.
@DubboService
public class AnnotatedGreetingService implements GreetingService {
public String sayHello(String name) {
System.out.println("greeting service received: " + name);
return "hello, " + name;
}
}
소비자 측의 구성 제어
먼저 서비스의 소비자 측에 대한 구성 정보 클래스를 작성합니다.
@Configuration
@EnableDubbo(scanBasePackages = "xx.xx.xx")
@PropertySource("classpath:/spring/dubbo-consumer.properties")
@ComponentScan(value = {"org.apache.dubbo.samples.annotation.action"})
static class ConsumerConfiguration {
}
그런 다음 @DubboReference 어노테이션을 사용하여 해당 인터페이스를 수정하여 관련 원격 서비스 구현 클래스를 삽입합니다.
@Component("annotatedConsumer")
public class GreetingServiceConsumer {
@DubboReference
private GreetingService greetingService;
...
}
사용자 로그인 기능 개발 및 인터페이스 디자인 구현.
주로 사용자 정보 자격 증명 입력, 사용자 이름 + 비밀번호 사용을 통해 로그인 메커니즘을 수행하기 위해 사용자와의 작업 제어 인터페이스 구현에 중점을두고 로그인 작업을 수행합니다.
- 주요 지향 서비스 1: 지속적인 사용자 쿼리 정보를 위한 사용자 중심 서비스
- 주요 지향 서비스 2: 보안 인증 서비스, 스프링 보안 서비스에 대한 인증 제어
사용자 등록, 로그아웃 기능 개발 및 구현, 인터페이스 정의 구현
주로 사용자 중심의 계정 등록 기능
주로 사용자의 계정 취소 기능에 중점을 두고 계정 아래의 모든 관련 정보를 지웁니다.
사용자 로그인 정보 가져오기 및 잊어버린 비밀번호 구현 및 인터페이스 정의
주로 사용자가 로그인한 후 토큰 및 관련 자격 증명을 기반으로 기본 사용자 정보 모델을 획득하며, 이는 시스템의 글로벌 사용자 정보 컨텍스트 역할을 합니다.
비밀번호를 잊어버렸을 때 주로 시스템 인증 자격 증명 채널을 사용하여 사용자 사서함, 휴대폰 번호를 비밀번호 변경 자격 증명으로 사용합니다.
- 식별 코드/인증 코드를 전송할 관련 사용자 이메일 또는 휴대폰 번호를 받습니다.
- 사용자의 비밀번호를 변경하려면 관련 인증 코드/식별 코드에 따라 오!
사용자 개인 정보 업데이트, 인터페이스 정의 및 기능 구현
- 주로 계정 또는 개인 정보 데이터를 업데이트하는 데 사용되며, 일반적으로 기본 정보 및 관련 확장 정보 등으로 확장할 수 있습니다.
관련 비밀번호 재설정에 대한 인터페이스 정의 및 기능 구현이 완료되었습니다.
- 비밀번호 재설정 작업은 일반적으로 시스템 관리자가 사용자의 비밀번호가 불편한 상황에서 사용자의 비밀번호를 기본 임의 비밀번호로 직접 재설정할 수 있는 기능입니다.
데이터 테넌트 격리 메커니즘을 달성하기 위한 MybatisPlus를 통한 멀티 테넌트 운영 구현 메커니즘
마이바티스플러스 프레임워크는 주로 인터셉터 메커니즘을 통해 관련 tenant_id 데이터 값의 주입을 직접 가로채는 데 사용됩니다:
멀티테넌트 사용
핵심 플러그인: 테넌트라인 내부 인터셉터
코어 프로세서: 테넌트라인핸들러-
public interface TenantLineHandler {
/**
* 테넌트 ID 값 가져오기 표현식은 단일 ID 값만 지원합니다.
* <p>
*
* @return 테넌트 ID 값 표현식
*/
Expression getTenantId();
/**
* 테넌트 필드 이름 가져오기
* <p>
* 기본 필드 이름은: tenant_id
*
* @return 테넌트 필드 이름
*/
default String getTenantIdColumn() {
return "tenant_id";
}
/**
* 테이블 이름을 기준으로 스플라이스 멀티테넌시 조건 무시 여부 결정하기
* <p>
* 기본적으로 멀티테넌트 조건 구문 분석 및 연결하기
*
* @param tableName
* @return 무시 여부, true:무시,false:멀티테넌트 조건을 파싱하고 연결해야 하는 경우
*/
default boolean ignoreTable(String tableName) {
return false;
}
}
설명:
멀티 테넌시! = 권한 필터링, 테넌트는 서로 완전히 격리됩니다 !!!! 멀티 테넌시가 활성화되면 실행된 모든 메소드 쿼리가 처리됩니다. 사양에 따라 직접 SQL을 작성하세요.
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 페이징 플러그인을 사용하는 경우에는 먼저 TenantLineInnerInterceptor를 추가한 다음 PaginationInnerInterceptor를 추가해야 한다는 점에 유의하세요.
// 페이징 플러그인을 사용하는 경우 MybatisConfiguration을 설정해야 합니다.#useDeprecatedExecutor = false
// interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(
new TenantLineHandler() {
// manager_id = 1088248166370832385
// 테넌트 ID 값 가져오기 표현식은 단일 ID 값만 지원합니다.
@Override
public Expression getTenantId() {
return new LongValue(1088248166370832385L);
}
// 이것은 기본 방법으로, 모든 테이블에 멀티테넌트 조건의 철자가 필요하다는 것을 나타내는 false를 반환합니다.,
// 이 조건은 여기에서 역할 테이블을 설정하는 데 필요하지 않습니다.
@Override
public boolean ignoreTable(String tableName) {
if ("role".equals(tableName)) {
return true;
}
return false;
}
@Override
public String getTenantIdColumn() {
return "manager_id";
}
}));
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
관련 트리플 통신 프로토콜의 도입 및 구현을 소개합니다.
RPC 프로토콜 선택
프로토콜은 RPC의 핵심으로, 네트워크를 통한 데이터 전송의 내용과 형식을 규제합니다. 필수 요청 및 응답 데이터 외에도 일반적으로 단일 요청의 직렬화 방법, 시간 초과, 압축 및 인증 정보와 같은 추가 제어 데이터가 포함됩니다.
계약의 내용은 다음 세 부분으로 구성됩니다.
- 데이터 교환 형식: 직렬화라고도 하는 네트워크 전송에서 RPC 요청 및 응답 객체의 바이트 스트림의 내용을 정의합니다.
- 프로토콜 구조: 정의에는 필드 목록과 각 필드의 의미, 서로 다른 필드의 배열이 포함되어 있습니다.
- 프로토콜은 규칙, 형식 및 의미를 정의하여 네트워크에서 데이터가 전송되는 방식에 대해 합의합니다. 성공적인 RPC를 위해서는 통신의 양쪽 끝이 프로토콜에 따라 네트워크 바이트 스트림과 개체를 읽고, 쓰고, 변환할 수 있어야 합니다. 양쪽 끝에서 사용할 프로토콜에 동의하지 못하면 원격 통신의 요구 사항을 충족하지 못합니다.
Dubbo3통신 프로토콜
Dubbo3는 Dubbo 프레임워크의 기본 프로토콜인 Triple(Dubbo3) 및 Dubbo2 프로토콜을 제공합니다. 또한 Dubbo3는 gRPC, Thrift, JsonRPC, Hessian2, REST 등 여러 타사 프로토콜을 Dubbo의 프로그래밍 및 서비스 거버넌스에 통합합니다. 다음 섹션에서는 Triple 및 Dubbo2 프로토콜에 대해 중점적으로 설명합니다.
트리플은 Dubbo3에서 도입한 주요 프로토콜입니다. 트리플은 3세대를 의미하며, Dubbo1.0/Dubbo2.0 프로토콜의 진화와 클라우드 네이티브가 가져온 기술 표준화의 물결을 통해 개발된 새로운 프로토콜인 트리플은 Dubbo3를 위해 개발되었습니다.
Triple 프로토콜
트리플 프로토콜은 프로토콜 수준에서 로드 밸런싱 및 흐름 제어 관련 메커니즘을 확장한, HTTP/2를 통한 gRPC와 완벽하게 호환되는 Dubbo3의 기본 프로토콜입니다. 이 문서의 목적은 사용자가 트리플 프로토콜을 올바르게 사용할 수 있도록 안내하는 것입니다.
서비스가 신규 서비스인 경우 더 나은 성능과 언어 간 결과를 위해 기본 직렬화 방법으로 protobuf를 사용하는 것이 좋습니다. 기존 서비스를 업그레이드하려는 경우, 트리플 프로토콜은 이미 헤시안 / JSON과 같은 다른 직렬화 방법을 지원합니다.
서비스 트래픽 관리
더보 정의 라우팅 규칙을 통한 트래픽 분산 제어
트래픽 관리
트래픽 관리의 핵심은 다음 그림과 같이 잘 구성된 라우팅 규칙에 따라 애플리케이션 서비스에 요청을 배포하는 것입니다:
그중에서도:
- 라우팅 규칙은 둘 이상일 수 있으며 서로 다른 라우팅 규칙 간에는 우선순위가 있습니다. 예: 라우터(1) -> 라우터(2) -> ...... -> 라우터(n)
- 라우팅 규칙은 여러 다른 애플리케이션 서비스로 라우팅할 수 있습니다. 예를 들어 라우터(2)는 서비스(1) 또는 서비스(2)로 라우팅할 수 있습니다.
- 여러 개의 서로 다른 라우팅 규칙이 동일한 애플리케이션 서비스로 라우팅할 수 있습니다. 예를 들어 라우터(1)과 라우터(2)는 모두 서비스(2)로 라우팅할 수 있습니다.
- 라우팅 규칙은 어떤 애플리케이션 서비스로도 라우팅하지 않을 수도 있습니다. 예를 들어 라우터가 어떤 서비스로도 라우팅되지 않으면 라우터에 도달하는 모든 요청을 처리할 해당 애플리케이션 서비스가 없기 때문에 오류가 발생합니다.
- 애플리케이션 서비스는 단일 인스턴스 또는 애플리케이션 클러스터일 수 있습니다.
더보 교통 관리 소개
Dubbo는 트래픽 관리 정책의 메시 모드를 지원하여 A/B 테스트, 카나리아 릴리스, 파란색 및 녹색 릴리스 및 기타 기능을 쉽게 구현할 수 있습니다.
- VirtualService는 주로 인바운드 트래픽 분류 규칙을 처리하며 서비스 수준 및 메서드 수준 분류를 모두 지원합니다.
- DubboRoute는 주로 서비스 수준 분류 문제를 해결합니다. 동시에 재시도 메커니즘, 시간 초과, 오류 주입, 이미지 트래픽 및 기타 기능도 제공합니다.
- 주로 특정 서비스에서 메서드 수준 분류 문제를 해결합니다. 메서드 이름, 메서드 매개변수, 매개변수 수, 매개변수 유형, 헤더 및 기타 분류 기능의 다른 차원을 지원합니다. 또한 메서드 수준 재시도 메커니즘 , 시간 초과 , 오류 주입 , 이미지 트래픽 및 기타 기능을 지원합니다.
- DubboDestination은 라우팅된 트래픽의 대상 주소를 설명하는 데 사용되며 호스트, 포트, 서브넷 및 기타 방법을 지원합니다.
- DestinationRule은 주로 호스트, 서브넷 등을 통해 제공자 클러스터에 연결할 수 있는 대상 주소 규칙을 다룹니다. 동시에 트래픽폴리시를 통해 로드 밸런싱을 달성할 수 있습니다.
- 이 설계 개념은 트래픽 우회와 목적지 주소 간의 결합 문제에 대한 좋은 해결책입니다. 구성 규칙이 단순화되어 구성 중복 문제를 효과적으로 피할 수 있을 뿐만 아니라, 다양한 비즈니스 사용 시나리오를 지원하기 위해 매우 유연하게 VirtualService와 DestinationRule의 모든 조합을 지원할 수 있습니다.
gRPC와 호환되며, 전송 계층으로 HTTP2를 사용하는 새로운 프로토콜인 Triple을 구축합니다.
성능: 트리플 프로토콜은 메타데이터와 페이로드를 분리하는 전략을 채택하여 페이로드를 파싱하고 역직렬화하는 게이트웨이와 같은 중간 장치가 필요하지 않으므로 응답 시간이 단축됩니다.
라우팅 지원, 메타데이터는 사용자가 사용자 지정 헤더를 추가할 수 있도록 지원하기 때문에 사용자는 헤더에 따라 클러스터 또는 라우팅을 더 편리하게 나눌 수 있으므로 컷플로우 그레이 스케일 또는 재해 복구의 릴리스가 더 높은 수준의 유연성을 갖습니다.
보안을 위해 양방향 TLS 인증과 같은 암호화된 전송 기능이 지원됩니다.
사용 편의성 측면에서 Triple은 기본 gRPC에서 권장하는 Protobuf 직렬화를 지원할 뿐만 아니라 Hessian/JSON과 같은 다른 직렬화도 일반적인 방식으로 지원하므로 사용자가 Triple 프로토콜로 쉽게 업그레이드할 수 있습니다. 기존 Dubbo 서비스의 경우, 트리플 프로토콜을 수정하거나 추가하려면 선언된 서비스의 코드 블록에 프로토콜 구성 한 줄만 추가하면 되며, 변환 비용은 거의 들지 않습니다.




