R2DBC 및 서버 없는 데이터베이스를 사용하여 Spring 어플리케이션의 완전 반응

10175 단어 springjavamssqlazure

관계 데이터베이스를 이용하여 진정한 반응식 마이크로서비스를 구축하는 도전


2011년에 반응식 응용 프로그램이 자바에서 점점 보편화되었을 때 저는 JDBC로 SQL 데이터베이스에 접근하는 것은 완전히 막힌 메커니즘이라고 농담을 자주 했습니다.물론 당시 사람들은 SQL 데이터베이스가 시대에 뒤떨어졌고 패턴이 없는 NoSQL 솔루션이 향후 5년의 표준이 될 것이라고 생각했다.봄이 죽었어!SQL 데이터베이스 다음이 사라집니다!
이상한 역사의 전환에서, 몇 년 후, 우리는 여전히 Spring과 SQL 데이터베이스가 세계를 지배하고 있다...하지만 지금은 반응식, 클라우드 로컬, 서버 없는 구조에서 잘 작동합니다!
이 논문에서는 다음과 같은 기술을 사용하여 이러한 애플리케이션을 구축하는 방법에 대해 설명합니다.
  • Spring Webflux, 반응성 REST 노드

  • R2DBC, 그래서 우리는 새로운 반응식 SQL 드라이버를 사용하여 응용 프로그램이 데이터베이스에서 나머지 단점까지 완전히 반응할 수 있도록 하였다
  • SQL Server의 서버 버전이 없으므로 필요에 따라 데이터베이스 확장
  • 경고: 우리가 이곳에서 사용하는 많은 기술은 R2DBC를 포함하여 모두 매우 새롭고 아직 생산에 들어가지 않았다.우리는 효과적인 응용 프로그램을 구축하고 있다. 우리는 이 글이 이러한 기술을 전파하고 안정시키는 데 도움이 될 것이라고 희망하지만, 그들의 위험을 스스로 부담하기를 바란다.

    예제 응용 프로그램


    우리는 이곳에서 SQL 데이터베이스와 대화하는 간단한 Spring Webflux 마이크로 서비스를 개발했다.최종 코드는 GitHub에서 사용할 수 있습니다https://github.com/jdubois/spring-reactive-sql-server.

    서버 SQL Server 없음


    모든 데이터베이스에 R2DBC의 반응식 드라이버가 있는 것은 아닙니다. 이것이 바로 우리가 여기서 SQL Server를 선택하는 이유입니다.또 다른 이유는 "서버 없음"옵션이 있기 때문에 원가가 매우 낮다.SQL Server의 확장성 옵션은 다음과 같은 세 가지 옵션이 있는 유일한 클라우드 데이터베이스이기 때문에 매우 인상적입니다.
  • 성능, 가용성 및 스토리지 성능(최대 100 대 이상!),벨트hyperscale option
  • 사용elastic pools of databases 가격 대비 및 확장성 최적화
  • 사용 (내가 제일 좋아하는 것!)serverless database instances
  • "서버 없음"옵션을 사용할 예정이므로 낮은 가격으로 모든 것을 구축할 수 있습니다. the Azure portal 으로 이동하여 "SQL 데이터베이스"를 선택하십시오.

    우리는 가장 저렴한 옵션을 선택했다. 우리의 데이터베이스는 매달 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초 이상) 메모리 사용이 제한되어 있음을 의미한다.따라서 우리의 최종 결과는 고도의 확장성과 효율이다!

    좋은 웹페이지 즐겨찾기