手把手搭建Java微服务:从技术选型到生产部署

简介: 每个服务边界的确立,都是在回答一个基本问题:"什么应该在一起,什么应该分离?"这与我们人生中关于人际关系、职业发展的决策何其相似。

微服务架构本质上是一个关于”边界”的哲学问题,而不仅仅是一个技术方案。

每个服务边界的确立,都是在回答一个基本问题:”什么应该在一起,什么应该分离?”这与我们人生中关于人际关系、职业发展的决策何其相似。过度的耦合如同过度依赖的人际关系,让人失去独立性;而过度的拆分则像极端个人主义,导致协作成本激增。

如何使用 Java 搭建微服务系统。以下是完整的微服务架构搭建方案:

1. 技术栈选择

核心框架

  • Spring Boot - 快速开发框架
  • Spring Cloud - 微服务全家桶
  • Spring Cloud Alibaba - 阿里微服务解决方案

服务治理

  • Nacos - 服务注册与配置中心
  • Spring Cloud Gateway - API网关
  • OpenFeign - 服务间调用
  • LoadBalancer - 负载均衡

容错与监控

  • Sentinel - 流量控制与熔断降级
  • Sleuth + Zipkin - 分布式链路追踪

2. 项目结构设计

microservices-system/
├── gateway-service/          # API网关
├── user-service/            # 用户服务
├── order-service/           # 订单服务
├── product-service/         # 商品服务
├── common/                  # 公共模块
└── pom.xml                  # 父POM

3. 具体实现步骤

3.1 父工程配置

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>microservices-system</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    
    <modules>
        <module>gateway-service</module>
        <module>user-service</module>
        <module>order-service</module>
        <module>product-service</module>
        <module>common</module>
    </modules>
    
    <properties>
        <spring-boot.version>2.7.0</spring-boot.version>
        <spring-cloud.version>2021.0.3</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            
            <!-- Spring Cloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            
            <!-- Spring Cloud Alibaba -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

3.2 公共模块 (common)

// 统一响应对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
    private Integer code;
    private String message;
    private T data;
    
    public static <T> Result<T> success(T data) {
        return new Result<>(200, "success", data);
    }
    
    public static <T> Result<T> error(String message) {
        return new Result<>(500, message, null);
    }
}
// 全局异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(Exception.class)
    public Result<String> handleException(Exception e) {
        return Result.error(e.getMessage());
    }
}

3.3 用户服务 (user-service)

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.2</version>
    </dependency>
</dependencies>

application.yml

server:
  port: 8081
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml
  datasource:
    url: jdbc:mysql://localhost:3306/user_db?useSSL=false
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

UserController.java

@RestController
@RequestMapping("/users")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/{id}")
    public Result<User> getUserById(@PathVariable Long id) {
        User user = userService.getById(id);
        return Result.success(user);
    }
    
    @PostMapping
    public Result<User> createUser(@RequestBody User user) {
        userService.save(user);
        return Result.success(user);
    }
    
    @GetMapping
    public Result<List<User>> getAllUsers() {
        return Result.success(userService.list());
    }
}

User.java

@Data
@TableName("users")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String username;
    private String email;
    private String phone;
    private Date createTime;
    private Date updateTime;
}

3.4 订单服务 (order-service)

OrderController.java

@RestController
@RequestMapping("/orders")
public class OrderController {
    
    @Autowired
    private OrderService orderService;
    
    @Autowired
    private UserFeignClient userFeignClient;
    
    @PostMapping
    public Result<Order> createOrder(@RequestBody Order order) {
        // 调用用户服务验证用户
        Result<User> userResult = userFeignClient.getUserById(order.getUserId());
        if (userResult.getCode() != 200) {
            throw new RuntimeException("用户不存在");
        }
        
        orderService.save(order);
        return Result.success(order);
    }
    
    @GetMapping("/{id}")
    public Result<Order> getOrderById(@PathVariable Long id) {
        Order order = orderService.getById(id);
        return Result.success(order);
    }
}

UserFeignClient.java

@FeignClient(name = "user-service", path = "/users")
public interface UserFeignClient {
    
    @GetMapping("/{id}")
    Result<User> getUserById(@PathVariable("id") Long id);
}

3.5 API网关 (gateway-service)

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

application.yml

server:
  port: 8080
spring:
  application:
    name: gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1

3.6 配置中心使用

在Nacos中创建 user-service.yaml 配置:

# user-service 特定配置
logging:
  level:
    com.example: debug
custom:
  config: user-service-config

4. 服务注册与发现

启动Nacos

# 下载Nacos并启动
sh startup.sh -m standalone

服务注册

每个微服务通过 @EnableDiscoveryClient 自动注册:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

5. 熔断与降级

使用Sentinel

@FeignClient(name = "user-service", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
    // ...
}
@Component
public class UserFeignClientFallback implements UserFeignClient {
    
    @Override
    public Result<User> getUserById(Long id) {
        return Result.error("用户服务暂时不可用");
    }
}

6. 部署与运行

使用Docker Compose

version: '3.8'
services:
  nacos:
    image: nacos/nacos-server:latest
    environment:
      - MODE=standalone
    ports:
      - "8848:8848"
  
  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=password
    ports:
      - "3306:3306"

7. 监控与运维

链路追踪配置

# application.yml
spring:
  sleuth:
    sampler:
      probability: 1.0
  zipkin:
    base-url: http://localhost:9411

总结

这个微服务系统提供了:

  1. 服务注册发现 - 基于Nacos
  2. API网关 - 统一入口和路由
  3. 服务间调用 - 基于OpenFeign
  4. 配置管理 - 集中式配置
  5. 熔断降级 - 基于Sentinel
  6. 负载均衡 - 基于LoadBalancer

根据实际需求扩展更多功能,如分布式事务、消息队列、监控告警等。

微服务技术栈的更新速度已经超过了大多数团队的实际需求,形成了一种技术的”时尚竞赛”。

很多团队在Spring Cloud、Dubbo、Kubernetes + Istio之间反复横跳,却忽略了最根本的问题:这些技术变革是否真的为业务创造了价值?还是仅仅为了技术人的”简历工程”?

最成功的微服务架构,往往不是技术最超前的,而是与团队能力、业务发展阶段最匹配的。技术决策应该是一场理性的价值投资,而不是感性的时尚追逐。

手把手搭建Java微服务:从技术选型到生产部署.png

谢谢你看我的文章,既然看到这里了,如果觉得不错,随手点个赞、转发、在看三连吧,感谢感谢。那我们,下次再见。

您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

相关文章
|
3月前
|
监控 数据可视化 Java
Spring Boot 整合 Elasticsearch 及实战应用
这次内容详细介绍如何使用 Spring Boot 整合 Elasticsearch,并提供几个实际应用案例。内容涵盖 Elasticsearch 的基本概念、Spring Boot 整合步骤、实战应用示例以及优化建议。
376 0
|
3月前
|
Java 关系型数据库 Docker
Docker + Spring Boot:天生一对的完美部署
使用Docker部署Spring Boot项目能极大简化环境配置和应用分发。要将Spring Boot项目部署到Docker,主要流程是:准备项目、创建Docker镜像、运行Docker容器。
197 0
|
6月前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
1975 0
|
6月前
|
Java 测试技术 编译器
@GrpcService使用注解在 Spring Boot 中开始使用 gRPC
本文介绍了如何在Spring Boot应用中集成gRPC框架,使用`@GrpcService`注解实现高效、可扩展的服务间通信。内容涵盖gRPC与Protocol Buffers的原理、环境配置、服务定义与实现、测试方法等,帮助开发者快速构建高性能的微服务系统。
1191 0
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
1735 3
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
33051 0
|
机器学习/深度学习 人工智能 算法
探索软件测试的前沿技术:AI与自动化的融合
在数字化时代的浪潮中,软件测试领域正经历着前所未有的变革。本文深入探讨了人工智能(AI)和自动化技术如何重塑软件测试的未来。通过分析最新的行业报告、案例研究和专家访谈,我们揭示了这些技术如何提升测试效率、准确性和灵活性。文章还讨论了实施这些技术的可能挑战和解决方案,为读者提供了宝贵的行业见解和实用建议。
588 33
|
存储 消息中间件 弹性计算
统一观测丨借助 Prometheus 监控 ClickHouse 数据库
统一观测丨借助 Prometheus 监控 ClickHouse 数据库
2033 90
统一观测丨借助 Prometheus 监控 ClickHouse 数据库
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。

热门文章

最新文章