R2DBC 및 서버 없는 데이터베이스를 사용하여 Spring 어플리케이션의 완전 반응
관계 데이터베이스를 이용하여 진정한 반응식 마이크로서비스를 구축하는 도전
2011년에 반응식 응용 프로그램이 자바에서 점점 보편화되었을 때 저는 JDBC로 SQL 데이터베이스에 접근하는 것은 완전히 막힌 메커니즘이라고 농담을 자주 했습니다.물론 당시 사람들은 SQL 데이터베이스가 시대에 뒤떨어졌고 패턴이 없는 NoSQL 솔루션이 향후 5년의 표준이 될 것이라고 생각했다.봄이 죽었어!SQL 데이터베이스 다음이 사라집니다!
이상한 역사의 전환에서, 몇 년 후, 우리는 여전히 Spring과 SQL 데이터베이스가 세계를 지배하고 있다...하지만 지금은 반응식, 클라우드 로컬, 서버 없는 구조에서 잘 작동합니다!
이 논문에서는 다음과 같은 기술을 사용하여 이러한 애플리케이션을 구축하는 방법에 대해 설명합니다.
R2DBC, 그래서 우리는 새로운 반응식 SQL 드라이버를 사용하여 응용 프로그램이 데이터베이스에서 나머지 단점까지 완전히 반응할 수 있도록 하였다
예제 응용 프로그램
우리는 이곳에서 SQL 데이터베이스와 대화하는 간단한 Spring Webflux 마이크로 서비스를 개발했다.최종 코드는 GitHub에서 사용할 수 있습니다https://github.com/jdubois/spring-reactive-sql-server.
서버 SQL Server 없음
모든 데이터베이스에 R2DBC의 반응식 드라이버가 있는 것은 아닙니다. 이것이 바로 우리가 여기서 SQL Server를 선택하는 이유입니다.또 다른 이유는 "서버 없음"옵션이 있기 때문에 원가가 매우 낮다.SQL Server의 확장성 옵션은 다음과 같은 세 가지 옵션이 있는 유일한 클라우드 데이터베이스이기 때문에 매우 인상적입니다.
우리는 가장 저렴한 옵션을 선택했다. 우리의 데이터베이스는 매달 0.15유로를 쓰고 초당 0.00067유로를 사용한다. 따라서 한 시간에 약 0.24유로를 사용한다.이것은 개발이나 테스트 환경에 있어서 정말 좋다. 왜냐하면 사용할 때만 비용을 받기 때문이다.
데이터베이스 모드를 만들기 위해 간단한 스크립트available here가 있습니다.
CREATE TABLE person (
id BIGINT NOT NULL IDENTITY PRIMARY KEY,
first_name VARCHAR(100),
last_name VARCHAR(100),
company VARCHAR(100)
)
데이터베이스에서 이 스크립트를 실행하는 데는 여러 가지 옵션이 있지만, 가장 간단한 옵션은 온라인 편집기를 사용하는 것입니다. 이 편집기는 the Azure portal를 통해 얻을 수 있습니다.R2DBC 사용 및 구성
R2DBC는 Java를 위한 반응식 드라이버의 규범입니다.더 구체적으로 말하자면, 우리는 RD2BC SQL Server를 사용할 것이다. 이것은 마이크로소프트 SQL 서버에서 실현된 것이다.
우리는 그것을 사용할 때 많은 문제에 부딪혔다. 예를 들어 this annoying SSL bug 이것이 바로 우리가 여기서 스냅샷 버전을 사용하는 이유이다.
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-mssql</artifactId>
<version>0.8.0.BUILD-20190819.142517-35</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-r2dbc</artifactId>
<version>1.0.0.gh-151-SNAPSHOT</version>
</dependency>
이 문제들은 현재 Spring 팀에서 해결하고 있으며, 우리는 안정적인 버전을 사용할 수 있는 후에 가능한 한 빨리 예시 항목을 업데이트할 것이다.R2DBC의 Spring 구성
Spring Boot을 사용하여 R2DBC를 자동으로 구성하거나 여기에서 설명한 것처럼 R2DBC를 수동으로 구성할 수 있습니다.
@Bean
public MssqlConnectionFactory connectionFactory() {
log.info("Connecting to database '{}'...", host);
return new MssqlConnectionFactory(MssqlConnectionConfiguration.builder()
.host(host)
.port(1433)
.database(database)
.username(username)
.password(password)
.build());
}
스프링 부팅 장치 Spring 데이터 및 R2DBC가 있는 데이터 액세스 코드
좋은 소식은 Spring 데이터는 어느 정도 R2DBC와 협동하여 작업할 수 있다는 것입니다. 즉각적인 SQL 쿼리 생성과 같은 모든 기능은 가지고 있지 않지만 대부분의 프레임워크가 작동할 수 있다는 것입니다. 이것은 우리가 다음과 같은 간단한 저장소를 가지고 있다는 것을 의미합니다.
@Repository
public interface PersonRepository extends ReactiveCrudRepository<Person, Long> {
}
따라서 이 저장소는 일반적인 Spring JDBC 또는 Spring JPA 저장소로 REST 노드에서 사용할 수 있습니다.@RestController
public class PersonController {
private final PersonRepository personRepository;
public PersonController(PersonRepository personRepository) {
this.personRepository = personRepository;
}
@GetMapping("/persons")
public Flux<Person> list() {
return personRepository.findAll();
}
}
결론과 최종 생각
우리가 이곳에서 개발한 예시 프로젝트는 에서 얻을 수 있다.미래에 이 프로젝트는 안정적인 버전의 R2DBC와 스타터와 https://github.com/jdubois/spring-reactive-sql-server 프로젝트를 사용해야 하지만, 이미 완전히 사용할 수 있다.
좋은 소식은 비록 매우 최첨단 기능을 사용했지만, 우리의 코드는 여전히 일반적인 스프링 가이드 응용 프로그램처럼 보인다는 것이다. 스프링 사용자는 대부분의 설정과 API를 익숙하게 사용해야 한다. 이것은 어떠한 일반적인 스프링 가이드 응용 프로그램과 같이 실행된다.
이 설정의 치명적인 특징은 SQL Server의 "서버 없음"버전, R2DBC와 Spring Webflux 덕분에 우리는 사용 상황에 따라 비용이 달라지는 매우 확장 가능한 응용 프로그램을 가질 수 있다는 것이다.응용 프로그램의 경우, Spring Webflux를 사용하는 것은 우리의 응용 프로그램이 매우 빨리 시작되고 (MacBook Pro에서 1초 이상) 메모리 사용이 제한되어 있음을 의미한다.따라서 우리의 최종 결과는 고도의 확장성과 효율이다!
Reference
이 문제에 관하여(R2DBC 및 서버 없는 데이터베이스를 사용하여 Spring 어플리케이션의 완전 반응), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/azure/building-a-fully-reactive-and-scalable-spring-application-with-r2dbc-and-a-serverless-database-1jke텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)