云原生Java应用开发
云原生Java应用开发
概述
云原生是现代应用开发的主流方式。本教程介绍云原生Java应用的开发。
1. 12因子应用
// 12因子应用原则
// 1. 代码库:一份代码,多份部署
// 2. 依赖:显式声明依赖
// 3. 配置:在环境中存储配置
// 4. 后端服务:把后端服务当作附加资源
// 5. 构建,发布,运行:严格分离构建和运行
// 6. 进程:以一个或多个无状态进程运行应用
// 7. 端口绑定:通过端口绑定提供服务
// 8. 并发:通过进程模型进行扩展
// 9. 易处理:快速启动和优雅终止可最大化健壮性
// 10. 开发环境与线上等价:尽可能保持开发,发布,线上环境相同
// 11. 日志:把日志当作事件流
// 12. 管理进程:后台管理任务当作一次性进程运行
@Configuration
public class CloudNativeConfig {
@Bean
public ConfigurableEnvironment environment() {
return new StandardEnvironment();
}
}
2. 容器化最佳实践
# 多阶段构建
FROM maven:3.8-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
3. 实际应用示例
Kubernetes部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "cloud"
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 60
periodSeconds: 30
配置管理
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: my-app-config
data:
application-cloud.yml: |
spring:
cloud:
kubernetes:
discovery:
enabled: true
datasource:
url: jdbc:mysql://mysql-service:3306/mydb
4. 最佳实践
- 无状态设计:确保应用无状态
- 外部化配置:配置存储在环境中
- 健康检查:实现健康检查端点
- 优雅关闭:正确处理关闭信号
- 日志管理:将日志输出到标准输出
总结
云原生是现代应用开发的主流方式。掌握云原生Java应用的开发,可以构建可扩展、高可用的应用系统。