
2025 Prometheus API 完整指南:基礎查詢、PromQL 高級用法與自定義監控實踐
在開始之前,請確保環境中已安裝以下工具:
建議使用 Java 17 或 21 LTS:
$ java --version
java 17.0.8 2024-04-17 LTS
Java(TM) SE Runtime Environment (build 17.0.8+10-LTS-194)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.8+10-LTS-194, mixed mode)
建議使用 Maven 3.8+:
$ mvn -v
Apache Maven 3.8.8 (f9b9e1a1f9e)
Maven home: /usr/local/apache-maven-3.8.8
Java version: 17, vendor: Oracle Corporation, Java home: /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "13.6", arch: "x86_64"
$ npm install -g serverless
$ serverless --version
Framework Core: 3.x.x
使用 Serverless 框架創建新項目:
$ serverless create --template aws-java-maven --name products-api
生成的項目目錄示例:
/Users/username/projects/serverless/apps/products-api
pom.xml
更新項目名稱為 products-api
。
serverless.yml
provider:
name: aws
runtime: java17
在 serverless.yml
provider
部分添加:
iamRoleStatements:
- Effect: "Allow"
Action:
- "dynamodb:*"
Resource: "*"
resources:
Resources:
ProductsTable:
Type: "AWS::DynamoDB::Table"
Properties:
TableName: "Products"
AttributeDefinitions:
- AttributeName: "id"
AttributeType: "S"
KeySchema:
- AttributeName: "id"
KeyType: "HASH"
BillingMode: "PAY_PER_REQUEST"
public class DynamoDBAdapter {
private static volatile DynamoDBAdapter instance;
private final AmazonDynamoDB client;
private final DynamoDBMapper mapper;
private DynamoDBAdapter() {
this.client = AmazonDynamoDBClientBuilder.standard().build();
this.mapper = new DynamoDBMapper(client);
}
public static DynamoDBAdapter getInstance() {
if (instance == null) {
synchronized (DynamoDBAdapter.class) {
if (instance == null) {
instance = new DynamoDBAdapter();
}
}
}
return instance;
}
public DynamoDBMapper getMapper() {
return this.mapper;
}
}
@DynamoDBTable(tableName = "Products")
public class Product {
private String id;
private String name;
private double price;
@DynamoDBHashKey(attributeName = "id")
public String getId() { return id; }
public void setId(String id) { this.id = id; }
@DynamoDBAttribute(attributeName = "name")
public String getName() { return name; }
public void setName(String name) { this.name = name; }
@DynamoDBAttribute(attributeName = "price")
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
}
POST /products
:創建產品GET /products
:獲取所有產品GET /products/{id}
:根據 ID 獲取產品DELETE /products/{id}
:根據 ID 刪除產品public class CreateProductHandler implements RequestHandler < Map < String, Object > , ApiGatewayResponse > {
@Override
public ApiGatewayResponse handleRequest(Map < String, Object > input, Context context) {
Product product = new ObjectMapper().convertValue(input.get("body"), Product.class);
DynamoDBAdapter.getInstance().getMapper().save(product);
return ApiGatewayResponse.builder()
.setStatusCode(200)
.setObjectBody(product)
.build();
}
}
其他端點處理程序邏輯類似。
$ mvn clean install
$ serverless deploy
部署成功后,Serverless 會提供完整 API URL,例如:
https://xxxxxx.execute-api.us-east-1.amazonaws.com/dev/products
$ curl -X POST https://xxxxxx.execute-api.us-east-1.amazonaws.com/dev/products \
-H "Content-Type: application/json" \
-d '{"name":"Product1","price":9.99}'
$ curl https://xxxxxx.execute-api.us-east-1.amazonaws.com/dev/products
$ curl https://xxxxxx.execute-api.us-east-1.amazonaws.com/dev/products/{id}
$ curl -X DELETE https://xxxxxx.execute-api.us-east-1.amazonaws.com/dev/products/{id}
本文講解了如何使用 Java、DynamoDB 與 Serverless 框架 創建一個完整的 REST API。我們從環境配置、項目創建、DynamoDB 管理、Lambda 函數實現到最終部署,逐步展示了實踐過程。希望本文對您有所幫助,歡迎在評論區分享問題和反饋。
原文鏈接: Serverless 官方博客