在 Ubuntu 上落地 Java 微服务架构的实操方案
一 架构与组件选型
- 核心框架:优先选用 Spring Boot 作为微服务基础,结合 Spring Cloud 实现服务治理(如 Eureka 注册中心、OpenFeign 声明式调用)。若追求云原生与极致启动性能,可考虑 Quarkus / Micronaut / Vert.x 等新一代框架。
- 数据与中间件:关系型数据库(如 MySQL)、缓存(如 Redis)、消息队列(如 ActiveMQ)、文档库(如 MongoDB)按业务选型与隔离部署。
- 网关与反向代理:使用 Spring Cloud Gateway 统一路由、鉴权、限流;在边缘接入层可用 Nginx 做静态资源与端口转发。
- 运维与可观测:开启 Spring Boot Actuator 暴露健康检查与指标,结合日志聚合与链路追踪完善可观测性。
- 容器化与编排:优先 Docker 打包镜像,单机多服务用 Docker Compose;多节点与弹性伸缩采用 Kubernetes。
二 在 Ubuntu 搭建最小可用环境
- 安装基础运行环境(以 JDK 11 为例):
- 更新与安装:
sudo apt-get update && sudo apt-get install -y openjdk-11-jdk maven
- 验证:
java -version、mvn -version
- 准备示例服务骨架(以 Spring Boot 为例):
- 使用 Spring Initializr 创建两个服务:registry(Eureka 注册中心)、provider(业务服务),按需添加 Spring Web / Eureka Client / OpenFeign 依赖。
- 配置 Eureka 注册中心(示例关键配置):
- application.properties:
server.port=8761
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
- 配置服务提供者(示例关键配置):
- application.properties:
spring.application.name=provider
server.port=8081
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
- 提供一个简单 REST 端点:
@RestController @RequestMapping("/api/v1/hello") public String hello() { return "Hello from provider"; }
- 配置服务消费者(示例关键配置与调用):
- application.properties:
spring.application.name=consumer
server.port=8082
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
- 启用 Feign:
@EnableFeignClients
- Feign 客户端:
@FeignClient("provider") public interface HelloClient { @GetMapping("/api/v1/hello") String sayHello(); }
- 控制器调用:
@RestController public class ConsumerController { @Autowired private HelloClient helloClient; @GetMapping("/consume") public String consume() { return helloClient.sayHello(); } }
- 本地验证:
- 启动顺序:registry → provider → consumer
- 访问 Eureka 控制台:http://localhost:8761
- 访问消费者:http://localhost:8082/consume 应返回 provider 的响应。
三 打包与部署到 Ubuntu 服务器
- 构建产物:在项目根目录执行
mvn clean package -DskipTests,在 target/ 下生成可执行 JAR。
- 上传与目录:将各服务的 JAR 上传至服务器(如 /data/ms/ 下按服务名分目录)。
- 运行服务(示例脚本思路):
cd /data/ms/registry && nohup java -jar target/*.jar > nohup.out 2>&1 &
cd /data/ms/provider && nohup java -jar target/*.jar > nohup.out 2>&1 &
cd /data/ms/consumer && nohup java -jar target/*.jar > nohup.out 2>&1 &
- 说明:
nohup ... > nohup.out 2>&1 & 用于后台运行并收集日志;如需开机自启,可结合 systemd 或进程管理工具(如 supervisord)。
- 边缘接入与端口规划:
- 将 Gateway 端口设为 80,通过 Nginx 暴露 80/443;Eureka 默认 8761 仅内网访问。
- 示例 Nginx 配置片段:
server { listen 80; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; } }
- 生产建议:
- 使用 .env / application-{profile}.yml 管理不同环境配置(数据库、注册中心地址等)。
- 为各服务配置合理的 JVM 参数(如
-Xms/-Xmx、GC 策略)与 优雅停机。
四 容器化与编排
- Docker 化示例(每个服务根目录放置 Dockerfile):
- Dockerfile:
FROM openjdk:11-jre-slim
COPY target/*.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app/app.jar"]
- 构建与运行:
docker build -t myorg/provider:1.0 .
docker run -d -p 8081:8080 --name provider myorg/provider:1.0
- Docker Compose 编排(简化多服务本地/测试环境):
- docker-compose.yml(示例片段):
- version: ‘3.8’
- services:
- registry:
- image: myorg/registry:1.0
- ports: [“8761:8761”]
- provider:
- image: myorg/provider:1.0
- environment:
- EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://registry:8761/eureka/
- depends_on: [“registry”]
- consumer:
- image: myorg/consumer:1.0
- environment:
- EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://registry:8761/eureka/
- depends_on: [“registry”]
- 启动:
docker-compose up -d
- 生产编排:将镜像推送至 镜像仓库(如 Harbor/ACR/ECR),在 Kubernetes 中通过 Deployment / Service / Ingress 部署与暴露服务,结合 ConfigMap / Secret 管理配置与敏感信息。
五 框架选型与演进建议
- 团队已有 Spring 技术栈:继续使用 Spring Boot + Spring Cloud,生态成熟、开发效率高,适合大多数企业场景。
- 极致启动与内存、云原生优先:选择 Quarkus / Micronaut,支持 GraalVM 原生镜像,适合容器与 Serverless。
- 高并发、事件驱动与实时场景:选择 Vert.x(非阻塞 I/O、事件总线),适合低延迟与高吞吐。
- 演进路径建议:从 单机多服务 + Docker Compose 起步,完善健康检查/指标/日志后,迁移到 Kubernetes;按需引入 配置中心、链路追踪、熔断限流 等治理能力。