Trong bài tập này, bạn sẽ tự tạo và cấu hình một serverless microservice. Trong quá trình làm bài thực hành, bạn sẽ sử dụng các kỹ thuật khác nhau để xây dựng và triển khai, khi đó bạn có thể so sánh và đối chiếu hiệu quả của từng cách tiếp cận và phương pháp tự động hóa làm cho việc phát triển ứng dụng trở nên nhanh hơn và hiệu quả hơn cho các developer.
Bạn sẽ tạo thủ công TripSearch microservice. TripSearch microservice cung cấp các hàm sau:
Đây là cùng một microservice mà chúng ta đã xem xét trong bài thực hành trước đây. Nhưng lần này, chúng ta sẽ cung cấp chức năng này trong trang web TravelBuddy của chúng ta và do đó, cần triển khai dịch vụ để chuẩn bị cho trang web. Trước đây, việc cấu hình API Gateway được quản lý bởi pipeline triển khai cho bạn - trong bài tập này, bạn sẽ cấu hình thủ công thiết cho cả hàm Lambda và API Gateway.
set AWS_PROFILE=devaxacademy
set DDB_TABLENAME_TRIPSECTOR=TravelBuddyTripSectors
mvn test
3. Bạn sẽ thấy kết quả:
Nhớ rằng thành phố đi và đến thể hiện ở đây và thời gian, ngày tháng sẽ khác so với môi trường triển khai của bạn vì nó được tạo ngẫu nhiên.
Bạn sẽ thấy không có thông báo lỗi nào khi chạy unit test và điều đó chắc chắn rằng mã nguồn của bạn đã chạy được như dự kiến. Nếu vẫn thấy lỗi, hãy thử kiểm tra thêm.
Khi bạn chạy test trong môi trường Development local, AWS X-RAy agent không khả dụng, và vì như vậy việc gọi từ AWS SDK không được ghi nhận vào X-Ray. Tuy nhiên, thiết lập trong pom.xml xác định sử dụng AWS X-Ray recorder, tất cả các lệnh gọi tới thông qua SDK (VD: gọi tới DynamoDB) sẽ được ghi nhận. Việc này sẽ gây phát sinh lỗi và test sẽ fail.
Chú ý rằng mỗi một lớp Lambda handler đều extend từ một lớp nền tên là LambdaHandlerWithXRayBase. Trong lớp này, có một khởi tạo static và nó xây dựng đối tượng ContextMissingStrategy, ghi đè hành động khi không có AWS X-Ray và thiết lập đó là hành động mặc định. Trong quá trình triển khai contextMissing handler, chúng ta có xuất ra một nội dung ra console, thay vì hành động mặc định là đưa ra exception. Việc triển khai lớp LambdaHandlerWithXRayBase tương tự như sau:
public class LambdaHandlerWithXRayBase
{
static
{
AWSXRayRecorderBuilder builder = AWSXRayRecorderBuilder.standard();
builder.withContextMissingStrategy(new ContextMissingStrategy()
{
@Override
public void contextMissing(String arg0, Class<? extends RuntimeException> arg1)
{
System.out.println("AWS X-ray unavailable - ignoring");
}
});
AWSXRay.setGlobalRecorder(builder.build());
}
}
Là một thử nghiệm tùy chọn, bạn có thể thử xóa trình khởi tạo static khỏi lớp cơ sở LambdaHandlerWithXRayBase và chạy lại Maven build. Bạn sẽ thấy các lỗi như:
com.amazonaws.xray.exceptions.SegmentNotFoundException: Thread failed to begin a subsegment: segment not found. Verify that a segment is in progress, and that the SegmentContextResolverChain is configured correctly in order to discover the segment.
Nếu không có agent, và lệnh gọi hàm Lambda trong trường hợp Id tương quan được chuyển chính xác đến nó, SegmentContextResolverChain không thể xác định phân vùng AWS X-ray để đính kèm metadata đã ghi vào và đưa ra exception. Việc triển khai chúng ta cung cấp trong lớp cơ sở sẽ ghi đè hành vi này, nhằm bỏ qua điều kiện này một cách an toàn trong khi thử nghiệm trên môi trường phát triển của bạn.
mvn package shade:shade
để build
DevAx-06
vào ô tìm kiếm và nhấn Enteraws s3 cp target/tripsearch-1.0.0.jar s3://<S3BucketLambdaCodeBucketName> --region <YOUR_REGION>
Thay <S3BucketLambdaCodeBucketName> bằng giá trị S3BucketLambdaCodeBucketName chúng ta đã lưu trong bước 7
Thay <YOUR_REGION> bằng Region của bạn
aws lambda create-function --function-name idevelopTripSearchFull --runtime java8 --role <LambdaRoleARN> --handler devlounge.lambda.FindAllTripsHandler --code S3Bucket=<S3BucketLambdaCodeBucketName>,S3Key=tripsearch-1.0.0.jar --timeout 15 --description "TravelBuddy TripSearch microservice - FindAllTrips" --memory-size 1024 --region <YOUR_REGION>
Thay <LambdaRoleARN> bằng giá trị LambdaRoleARN chúng ta đã lưu trong bước 7
Thay <S3BucketLambdaCodeBucketName> bằng giá trị S3BucketLambdaCodeBucketName chúng ta đã lưu trong bước 7
Thay <YOUR_REGION> bằng Region của bạn
Mã triển khai chức năng TripSearch của chúng ta có ba handler được cung cấp - một để tìm tất cả các chuyến đi; một để tìm các chuyến đi bắt nguồn từ một thành phố nhất định; và một để tìm các chuyến đi có một thành phố nhất định làm điểm đến. Hiện tại, chúng ta mới chỉ tiếp xúc với một handler - tìm kiếm cho tất cả các chuyến đi. Trong phần này, chúng ta sẽ tạo hai hàm Lambda mới, mỗi hàm cung cấp một trong hai handler còn lại.
aws lambda create-function --function-name idevelopTripSearchFromCity --runtime java8 --role <LambdaRoleARN> --handler devlounge.lambda.FindTripsFromCityHandler --code S3Bucket=<S3BucketLambdaCodeBucketName>,S3Key=tripsearch-1.0.0.jar --timeout 15 --description "TravelBuddy TripSearch microservice - FindTripsFromCity" --memory-size 1024 --region <YOUR_REGION>
Thay <LambdaRoleARN> bằng giá trị LambdaRoleARN chúng ta đã lưu trong bước 7
Thay <S3BucketLambdaCodeBucketName> bằng giá trị S3BucketLambdaCodeBucketName chúng ta đã lưu trong bước 7
Thay <YOUR_REGION> bằng Region của bạn
aws lambda create-function --function-name idevelopFindTripsToCity --runtime java8 --role <LambdaRoleARN> --handler devlounge.lambda.FindTripsToCityHandler --code S3Bucket=<S3BucketLambdaCodeBucketName>,S3Key=tripsearch-1.0.0.jar --timeout 15 --description "TravelBuddy TripSearch microservice - FindTripsToCity" --memory-size 1024 --region <YOUR_REGION>
Thay <LambdaRoleARN> bằng giá trị LambdaRoleARN chúng ta đã lưu trong bước 7
Thay <S3BucketLambdaCodeBucketName> bằng giá trị S3BucketLambdaCodeBucketName chúng ta đã lưu trong bước 7
Thay <YOUR_REGION> bằng Region của bạn
Chắc chắn rằng bạn sẽ được nhận các phản hồi thành công tương tự với hàm Lambda đã tạo đầu tiên.