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

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

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

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

如何使用 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复制

4.0.0

com.example

microservices-system

1.0.0

pom

gateway-service

user-service

order-service

product-service

common

2.7.0

2021.0.3

2021.0.1.0

org.springframework.boot

spring-boot-dependencies

${spring-boot.version}

pom

import

org.springframework.cloud

spring-cloud-dependencies

${spring-cloud.version}

pom

import

com.alibaba.cloud

spring-cloud-alibaba-dependencies

${spring-cloud-alibaba.version}

pom

import

3.2 公共模块 (common)代码语言:javascript复制// 统一响应对象

@Data

@AllArgsConstructor

@NoArgsConstructor

public class Result {

private Integer code;

private String message;

private T data;

public static Result success(T data) {

return new Result<>(200, "success", data);

}

public static Result error(String message) {

return new Result<>(500, message, null);

}

}

// 全局异常处理

@RestControllerAdvice

public class GlobalExceptionHandler {

@ExceptionHandler(Exception.class)

public Result handleException(Exception e) {

return Result.error(e.getMessage());

}

}3.3 用户服务 (user-service)pom.xml

代码语言:javascript复制

org.springframework.boot

spring-boot-starter-web

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

org.springframework.cloud

spring-cloud-starter-loadbalancer

mysql

mysql-connector-java

com.baomidou

mybatis-plus-boot-starter

3.5.2

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 getUserById(@PathVariable Long id) {

User user = userService.getById(id);

return Result.success(user);

}

@PostMapping

public Result createUser(@RequestBody User user) {

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 createOrder(@RequestBody Order order) {

// 调用用户服务验证用户

Result userResult = userFeignClient.getUserById(order.getUserId());

if (userResult.getCode() != 200) {

throw new RuntimeException("用户不存在");

}

orderService.save(order);

return Result.success(order);

}

@GetMapping("/{id}")

public Result getOrderById(@PathVariable Long id) {

Order order = orderService.getById(id);

return Result.success(order);

}

}UserFeignClient.java

代码语言:javascript复制@FeignClient(name = "user-service", path = "/users")

public interface UserFeignClient {

@GetMapping("/{id}")

Result getUserById(@PathVariable("id") Long id);

}3.5 API网关 (gateway-service)pom.xml

代码语言:javascript复制

org.springframework.cloud

spring-cloud-starter-gateway

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

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 getUserById(Long id) {

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

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

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

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

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

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

相关推荐

您的呼叫已被转接:占线、关机或被阻止?(2025)
亚洲365bet官网

您的呼叫已被转接:占线、关机或被阻止?(2025)

📅 09-23 👁️ 9840
星云手表笔记
365bet足球直播

星云手表笔记

📅 01-14 👁️ 851
仓鼠为什么会打架(仓鼠争斗原因解析)
365体育ribo88

仓鼠为什么会打架(仓鼠争斗原因解析)

📅 09-19 👁️ 7842