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

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之间反复横跳,却忽略了最根本的问题:这些技术变革是否真的为业务创造了价值?还是仅仅为了技术人的"简历工程"?

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值