微服务架构本质上是一个关于”边界”的哲学问题,而不仅仅是一个技术方案。
每个服务边界的确立,都是在回答一个基本问题:”什么应该在一起,什么应该分离?”这与我们人生中关于人际关系、职业发展的决策何其相似。过度的耦合如同过度依赖的人际关系,让人失去独立性;而过度的拆分则像极端个人主义,导致协作成本激增。
如何使用 Java 搭建微服务系统。以下是完整的微服务架构搭建方案:
1. 技术栈选择核心框架Spring Boot - 快速开发框架Spring Cloud - 微服务全家桶Spring Cloud Alibaba - 阿里微服务解决方案服务治理Nacos - 服务注册与配置中心Spring Cloud Gateway - API网关OpenFeign - 服务间调用LoadBalancer - 负载均衡容错与监控Sentinel - 流量控制与熔断降级Sleuth + Zipkin - 分布式链路追踪2. 项目结构设计代码语言:javascript复制microservices-system/
├── gateway-service/ # API网关
├── user-service/ # 用户服务
├── order-service/ # 订单服务
├── product-service/ # 商品服务
├── common/ # 公共模块
└── pom.xml # 父POM3. 具体实现步骤3.1 父工程配置代码语言:javascript复制
3.2 公共模块 (common)代码语言:javascript复制// 统一响应对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result
private Integer code;
private String message;
private T data;
public static
return new Result<>(200, "success", data);
}
public static
return new Result<>(500, message, null);
}
}
// 全局异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result
return Result.error(e.getMessage());
}
}3.3 用户服务 (user-service)pom.xml
代码语言:javascript复制
application.yml
代码语言:javascript复制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.StdOutImplUserController.java
代码语言:javascript复制@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public Result
User user = userService.getById(id);
return Result.success(user);
}
@PostMapping
public Result
userService.save(user);
return Result.success(user);
}
@GetMapping
public Result> getAllUsers() {
return Result.success(userService.list());
}
}User.java
代码语言:javascript复制@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
代码语言:javascript复制@RestController
@RequestMapping("/orders")
public class OrderController {
@Autowired
private OrderService orderService;
@Autowired
private UserFeignClient userFeignClient;
@PostMapping
public Result
// 调用用户服务验证用户
Result
if (userResult.getCode() != 200) {
throw new RuntimeException("用户不存在");
}
orderService.save(order);
return Result.success(order);
}
@GetMapping("/{id}")
public Result
Order order = orderService.getById(id);
return Result.success(order);
}
}UserFeignClient.java
代码语言:javascript复制@FeignClient(name = "user-service", path = "/users")
public interface UserFeignClient {
@GetMapping("/{id}")
Result
}3.5 API网关 (gateway-service)pom.xml
代码语言:javascript复制
application.yml
代码语言:javascript复制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=13.6 配置中心使用在Nacos中创建 user-service.yaml 配置:
代码语言:javascript复制# user-service 特定配置
logging:
level:
com.example: debug
custom:
config: user-service-config4. 服务注册与发现启动Nacos代码语言:javascript复制# 下载Nacos并启动
sh startup.sh -m standalone服务注册每个微服务通过 @EnableDiscoveryClient 自动注册:
代码语言:javascript复制@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}5. 熔断与降级使用Sentinel代码语言:javascript复制@FeignClient(name = "user-service", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
// ...
}
@Component
public class UserFeignClientFallback implements UserFeignClient {
@Override
public Result
return Result.error("用户服务暂时不可用");
}
}6. 部署与运行使用Docker Compose代码语言:javascript复制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. 监控与运维链路追踪配置代码语言:javascript复制# application.yml
spring:
sleuth:
sampler:
probability: 1.0
zipkin:
base-url: http://localhost:9411总结这个微服务系统提供了:
服务注册发现 - 基于NacosAPI网关 - 统一入口和路由服务间调用 - 基于OpenFeign配置管理 - 集中式配置熔断降级 - 基于Sentinel负载均衡 - 基于LoadBalancer根据实际需求扩展更多功能,如分布式事务、消息队列、监控告警等。
微服务技术栈的更新速度已经超过了大多数团队的实际需求,形成了一种技术的”时尚竞赛”。
很多团队在Spring Cloud、Dubbo、Kubernetes + Istio之间反复横跳,却忽略了最根本的问题:这些技术变革是否真的为业务创造了价值?还是仅仅为了技术人的”简历工程”?
最成功的微服务架构,往往不是技术最超前的,而是与团队能力、业务发展阶段最匹配的。技术决策应该是一场理性的价值投资,而不是感性的时尚追逐。
谢谢你看我的文章,既然看到这里了,如果觉得不错,随手点个赞、转发、在看三连吧,感谢感谢。那我们,下次再见。
您的一键三连,是我更新的最大动力,谢谢
山水有相逢,来日皆可期,谢谢阅读,我们再会
我手中的金箍棒,上能通天,下能探海