Rental Application (React & Spring boot Microservice) - 16 : rental-service(2)
11441 ワード
#1 service, repository
RentalService、RentalRepositoryを実装します.
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);
}
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();
}
}
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)-異種ソース
Reference
この問題について(Rental Application (React & Spring boot Microservice) - 16 : rental-service(2)), 我々は、より多くの情報をここで見つけました https://velog.io/@biuea/Rental-Application-React-Spring-boot-Microservice-16-rental-service2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol