Rental Application (React & Spring boot Microservice) - 16 : rental-service(2)

11441 ワード

#1 service, repository


RentalService、RentalRepositoryを実装します.
  • RentalService
  • package com.microservices.rentalservice.service;
    
    import com.microservices.rentalservice.dto.RentalDto;
    
    public interface RentalService {
        RentalDto createRental(RentalDto rentalDto);
    
        RentalDto getRentalByRentalId(String rentalId);
    
        Iterable<RentalDto> getRentalsByOwner(String owner);
    
        Iterable<RentalDto> getRentalsByBorrower(String borrower);
    
        RentalDto deleteRental(String rentalId);
    }
  • RentalServiceImpl
  • package com.microservices.rentalservice.service;
    
    import com.microservices.rentalservice.dto.RentalDto;
    import com.microservices.rentalservice.entity.RentalEntity;
    import com.microservices.rentalservice.repository.RentalRepository;
    import com.microservices.rentalservice.util.DateUtil;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import javax.transaction.Transactional;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    @Service
    @Slf4j
    public class RentalServiceImpl implements RentalService {
        private RentalRepository rentalRepository;
    
        @Autowired
        public RentalServiceImpl(RentalRepository rentalRepository) {
            this.rentalRepository = rentalRepository;
        }
    
        @Transactional
        @Override
        public RentalDto createRental(RentalDto rentalDto) {
            log.info("Rental Service's Service Layer :: Call createRental write Method!");
    
            RentalEntity rentalEntity = RentalEntity.builder()
                                                    .rentalId(UUID.randomUUID().toString())
                                                    .postId(rentalDto.getPostId())
                                                    .price(rentalDto.getPrice())
                                                    .owner(rentalDto.getOwner())
                                                    .borrower(rentalDto.getBorrower())
                                                    .startDate(rentalDto.getStartDate())
                                                    .endDate(rentalDto.getEndDate())
                                                    .createdAt(DateUtil.dateNow())
                                                    .build();
    
            rentalRepository.save(rentalEntity);
    
            return RentalDto.builder()
                            .rentalId(rentalEntity.getRentalId())
                            .postId(rentalEntity.getPostId())
                            .price(rentalEntity.getPrice())
                            .owner(rentalEntity.getOwner())
                            .borrower(rentalEntity.getBorrower())
                            .startDate(rentalEntity.getStartDate())
                            .endDate(rentalEntity.getEndDate())
                            .createdAt(rentalEntity.getCreatedAt())
                            .build();
        }
    
        @Transactional
        @Override
        public RentalDto getRentalByRentalId(String rentalId) {
            log.info("Rental Service's Service Layer :: Call getRentalByRentalId Method!");
    
            RentalEntity rentalEntity = rentalRepository.findByRentalId(rentalId);
    
            return RentalDto.builder()
                            .rentalId(rentalEntity.getRentalId())
                            .postId(rentalEntity.getPostId())
                            .price(rentalEntity.getPrice())
                            .owner(rentalEntity.getOwner())
                            .borrower(rentalEntity.getBorrower())
                            .startDate(rentalEntity.getStartDate())
                            .endDate(rentalEntity.getEndDate())
                            .createdAt(rentalEntity.getCreatedAt())
                            .build();
        }
    
        @Transactional
        @Override
        public Iterable<RentalDto> getRentalsByOwner(String owner) {
            log.info("Rental Service's Service Layer :: Call getRentalsByOwner Method!");
    
            Iterable<RentalEntity> rentals = rentalRepository.findAllByOwner(owner);
            List<RentalDto> rentalList = new ArrayList<>();
    
            rentals.forEach(v -> {
                rentalList.add(RentalDto.builder()
                                        .rentalId(v.getRentalId())
                                        .postId(v.getPostId())
                                        .price(v.getPrice())
                                        .owner(v.getOwner())
                                        .borrower(v.getBorrower())
                                        .startDate(v.getStartDate())
                                        .endDate(v.getEndDate())
                                        .createdAt(v.getCreatedAt())
                                        .build());
            });
    
            return rentalList;
        }
    
        @Transactional
        @Override
        public Iterable<RentalDto> getRentalsByBorrower(String borrower) {
            log.info("Rental Service's Service Layer :: Call getRentalsByBorrower Method!");
    
            Iterable<RentalEntity> rentals = rentalRepository.findAllByBorrower(borrower);
            List<RentalDto> rentalList = new ArrayList<>();
    
            rentals.forEach(v -> {
                rentalList.add(RentalDto.builder()
                                        .rentalId(v.getRentalId())
                                        .postId(v.getPostId())
                                        .price(v.getPrice())
                                        .owner(v.getOwner())
                                        .borrower(v.getBorrower())
                                        .startDate(v.getStartDate())
                                        .endDate(v.getEndDate())
                                        .createdAt(v.getCreatedAt())
                                        .build());
            });
    
            return rentalList;
        }
    
        @Transactional
        @Override
        public RentalDto deleteRental(String rentalId) {
            log.info("Rental Service's Service Layer :: Call deleteRental Method!");
    
            RentalEntity rentalEntity = rentalRepository.findByRentalId(rentalId);
    
            rentalRepository.delete(rentalEntity);
    
            return RentalDto.builder()
                            .rentalId(rentalEntity.getRentalId())
                            .build();
        }
    }
  • RentalRepository
  • package com.microservices.rentalservice.repository;
    
    import com.microservices.rentalservice.entity.RentalEntity;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface RentalRepository extends JpaRepository<RentalEntity, Long> {
        RentalEntity findByRentalId(String rentalId);
    
        Iterable<RentalEntity> findAllByOwner(String owner);
    
        Iterable<RentalEntity> findAllByBorrower(String borrower);
    }
    コード自体はpost-serviceと似ています.メソッドの説明は、前の号でRentalControllerを実装しています.を参照してください.

    #2 kafka


    rental-serviceはpost-serviceとメッセージベースの通信を行うためのサービスである.シナリオは次のとおりです.
    1)投稿を通じてリースを受け入れる場合、リース-サービスはリースに関する情報を生成します.
    2)リースがキャンセルされた場合、リース-サービスはリースに関する情報をキャンセルします.
    これは簡単なスキームであるが,メッセージベースの通信には多くの利点がある.まずはApache Kafkaについて
    Apache Kafkaはオープンソースメッセージエージェントプロジェクトです.

    上図に示すように、サービス-x~zをサービス-a~cに要求しているとします.すべてのリクエストがうまく処理されている場合が望ましいが、実際にはサービスaのサーバダウンタイム、サービスbの過剰処理による応答遅延などがある.私たちが導入したのはMessage Brokerで、代表的なオープンソースプロジェクトはApache Kafkaです.

    上の図に示すように、Kafka Message Brokerを中央に配置すると、次のカフカを使用するメリットを処理できます.
    1)サービス−a上のサーバがダウンタイムしている間にカードにメッセージを送信した場合、カードを購読したサービス−aは、サーバの再起動時に自分のメッセージを読み出して要求を処理することができる.
    2)service-bは現在処理すべき要求が多すぎて,直ちに要求を受け取ることが難しい.したがって、Kafkaを購読し、現在のリクエストを順番に処理してから、他のリクエストを処理することができます.
    3)サービス-zはサービス-b,サービス-cを要求したい.誰もが直接要求する必要がある場合、service-zは2回の要求を必要とし、2回の応答を必要とする.ただし、Kafka Message Brokerにメッセージを送信し、bとcがBrokerを購読した場合、service-zは1回のリクエストと2回の応答しか必要ありません.すなわち,資源の浪費を減らすことができる,すなわち2回の要求→1回の要求である.
    Apache Kafkaの利点は次のとおりです.
    1)低遅延:低遅延.すなわち,メッセージを送信する際に移動に要する時間が低い.
    2)高スループット:高スループット.
    3)障害フォールトトレランス:クラスタ内の一部のノードで障害が発生しても、ノードが正常または部分的に動作するようにします.
    それ以外にも、いろいろなメリットがあります.

    #3 kafkaを取り付ける



    kafka_2.13-2.8.0.tgzファイルをダウンロードし、MyRentalKafkaというディレクトリを作成して解凍します.


    次に、次のコマンドを使用してKafka Connectをインストールおよび解凍します.
    curl -O http://packages.confluent.io/archive/6.1/confluent-community-6.1.0.tar.gz
    tar xvf confluent-community-6.1.0.tar.gz
    https://docs.confluent.io/kafka-connect-jdbc/current/index.html(下図のDownload and extract the ZIPファイル)に移動し、ファイルをダウンロードし、Kafka-connect-jdbcを解凍します.

    次に、標準/home/biuea/desktop/myRentalKafka/コネクタ-kafka接続-jdbc-10.2.1/libパスをコピーし、/home/biuea/desktop/myRentalKafka/コネクタ-6.1.0/etc/kafka/connect-dributedをコピーします.properties設定ファイルの下部にあるpluginに入ります.次のようにpathをpluginします.path=/home/biuea/desktop/myRentalKafka/mincumentinc-kafka-connect-jdbc-10.2.1/lib.
    最後にメインディレクトリの/home/biuea/です.m 2/repository/org/mariadb/jdbc/mariadb-java-client/2.7.2 cp./mariadb-java-client-2.7.2.ファイルをjar/home/biuea/desktop/myRentalKafka/confluent-6.1.0/share/java/kafkaにコピーします.
    kafkaを使用するファイルをダウンロードしました.以下の文章ではpost-serviceとrent-serviceの間でメッセージ通信を行います.

    リファレンス


    インフラストラクチャ:Spring Cloudを使用して開発されたマイクロサービスアプリケーション(MSA)-異種ソース