微服务的使用
Java 微服务架构是将传统单体应用拆分为多个独立、可自治的小型服务,每个服务专注于特定业务能力。这些服务通过轻量级通信协议协作,共同完成整体业务。下面从核心组件的作用和配置两方面详细讲解:
一、服务注册与发现
作用:解决服务间 “如何找到彼此” 的问题。微服务实例会动态扩缩容(IP / 端口变化),无法通过硬编码地址通信。注册中心负责维护服务列表,服务启动时注册自己,下线时注销,其他服务通过注册中心获取目标服务地址。
常用技术:Eureka、Nacos、Consul、Zookeeper
配置示例(以 Nacos 为例):
Nacos 是主流的注册中心(兼具配置中心功能),分为服务端和客户端。
服务端部署:
下载 Nacos 服务器,启动后默认端口 8848,访问http://localhost:8848/nacos
可进入控制台(默认账号密码 nacos/nacos)。客户端配置(微服务接入):
在微服务的pom.xml
中引入依赖:<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
在
application.yml
中配置 Nacos 地址和服务名:spring:application:name: user-service # 服务名(核心,其他服务通过该名称调用)cloud:nacos:discovery:server-addr: localhost:8848 # Nacos服务端地址 server:port: 8081 # 当前服务端口
启动类添加
@EnableDiscoveryClient
注解开启服务发现:@SpringBootApplication @EnableDiscoveryClient public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);} }
二、API 网关
作用:微服务的 “统一入口”,负责请求路由、认证授权、限流熔断、日志监控等横切功能。客户端无需记住每个服务的地址,只需调用网关地址。
常用技术:Spring Cloud Gateway(推荐,非阻塞)、Zuul(渐被淘汰)
配置示例(Spring Cloud Gateway):
引入依赖:
<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>
配置路由规则(
application.yml
):spring:cloud:gateway:routes:- id: user-service-route # 路由唯一标识uri: lb://user-service # 目标服务(lb表示负载均衡,user-service是服务名)predicates: # 路由条件(当请求满足条件时转发)- Path=/users/** # 当请求路径以/users/开头时,转发到user-servicefilters: # 过滤器(可选,处理请求)- StripPrefix=1 # 去除路径中的第一个前缀(如请求/users/1 -> 转发到/user-service/1)- name: RequestRateLimiter # 限流过滤器args:redis-rate-limiter.replenishRate: 10 # 每秒允许10个请求redis-rate-limiter.burstCapacity: 20 # 突发允许20个请求
三、配置中心
作用:集中管理所有微服务的配置(如数据库连接、第三方 API 密钥),支持动态更新配置(无需重启服务),解决 “配置分散在各服务、修改需重启” 的问题。
常用技术:Nacos、Spring Cloud Config、Apollo
配置示例(Nacos 配置中心):
在 Nacos 控制台添加配置:
- 命名空间:区分环境(如 dev/test/prod)
- 配置集 ID:
user-service-dev.yml
(格式:服务名 - 环境.yml) - 配置内容:
spring:datasource:url: jdbc:mysql://localhost:3306/user_dbusername: rootpassword: 123456
微服务接入配置中心:
引入依赖:<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
创建
bootstrap.yml
(优先级高于 application.yml,用于加载配置中心信息):spring:application:name: user-servicecloud:nacos:config:server-addr: localhost:8848 # Nacos地址file-extension: yml # 配置文件格式namespace: dev # 环境(对应Nacos的命名空间ID)group: DEFAULT_GROUP # 配置分组
在代码中使用配置:
@RestController @RefreshScope // 支持配置动态刷新 public class UserController {@Value("${spring.datasource.url}") // 注入配置中心的参数private String dbUrl;@GetMapping("/db/url")public String getDbUrl() {return dbUrl;} }
四、服务通信
微服务间需要协作完成业务(如 “下单” 需调用 “库存服务” 扣减库存),通信方式分为同步和异步。
1. 同步通信(实时响应)
作用:适用于需要即时结果的场景(如查询用户信息),常用 REST 或 RPC。
常用技术:Spring Cloud OpenFeign(REST)、Dubbo(RPC)
OpenFeign 配置示例:
Feign 是声明式 REST 客户端,通过接口定义服务调用,简化 HTTP 请求代码。
引入依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
定义 Feign 接口(调用 user-service):
@FeignClient(name = "user-service") // 目标服务名(从注册中心获取) public interface UserFeignClient {// 声明要调用的接口(与user-service的Controller方法一致)@GetMapping("/users/{id}")User getUserById(@PathVariable("id") Long id); }
启动类添加
@EnableFeignClients
:@SpringBootApplication @EnableFeignClients public class OrderServiceApplication { ... }
使用 Feign 调用:
@Service public class OrderService {@Autowiredprivate UserFeignClient userFeignClient;public Order createOrder(Long userId) {User user = userFeignClient.getUserById(userId); // 调用user-service// 业务逻辑...} }
2. 异步通信(解耦削峰)
作用:适用于非实时场景(如订单创建后发送通知),通过消息队列传递消息,降低服务耦合,应对流量峰值。
常用技术:RabbitMQ、Kafka、RocketMQ
RabbitMQ 配置示例:
引入依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>
配置 RabbitMQ 连接(
application.yml
):spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest
生产者(发送消息):
@Service public class OrderService {@Autowiredprivate RabbitTemplate rabbitTemplate;public void createOrder(Order order) {// 保存订单...// 发送消息到队列(通知服务消费)rabbitTemplate.convertAndSend("order-exchange", "order.created", order.getId());} }
消费者(接收消息):
@Component public class NotificationConsumer {@RabbitListener(queues = "order-notify-queue") // 监听指定队列public void handleOrderCreated(Long orderId) {// 处理消息:发送短信/邮件通知System.out.println("订单" + orderId + "已创建,准备发送通知");} }
五、熔断与降级
作用:防止 “服务雪崩”。当某个服务故障(如响应慢、超时),调用方如果持续请求会耗尽资源,进而影响其他服务。熔断会在故障时 “断开” 调用,降级则返回默认结果(如 “系统繁忙,请稍后再试”)。
常用技术:Resilience4j(推荐)、Sentinel、Hystrix(已停更)
Resilience4j 配置示例:
引入依赖:
<dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId> </dependency>
配置熔断规则(
application.yml
):resilience4j:circuitbreaker:instances:userService: # 熔断实例名(对应@CircuitBreaker的name)failureRateThreshold: 50 # 失败率阈值(超过50%触发熔断)waitDurationInOpenState: 10000 # 熔断后10秒内拒绝请求slidingWindowSize: 10 # 统计最近10个请求的失败率
在 Feign 调用中使用熔断:
@Service public class OrderService {@Autowiredprivate UserFeignClient userFeignClient;// 熔断注解:name对应配置,fallback指定降级方法@CircuitBreaker(name = "userService", fallbackMethod = "getUserFallback")public User getUser(Long userId) {return userFeignClient.getUserById(userId);}// 降级方法(参数和返回值需与原方法一致)public User getUserFallback(Long userId, Exception e) {System.out.println("调用user-service失败,触发降级:" + e.getMessage());return new User(-1L, "默认用户"); // 返回默认结果} }
六、负载均衡
作用:当一个服务部署多个实例(如 user-service 有 8081、8082 两个端口),请求需要均匀分发到各实例,避免单实例过载。
常用技术:Spring Cloud LoadBalancer(客户端负载均衡,推荐)、Ribbon(渐被淘汰)
配置示例(Spring Cloud LoadBalancer):
LoadBalancer 通常与 Feign/RestTemplate 配合使用,自动从注册中心获取服务实例列表并分发请求。
引入依赖(已包含在 OpenFeign 中,无需额外添加):
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
配置负载均衡策略(
application.yml
):spring:cloud:loadbalancer:configurations: round-robin # 轮询策略(默认),可选:random(随机)
自动生效:
当使用 Feign 调用user-service
时,LoadBalancer 会自动从 Nacos 获取所有实例(8081、8082),按轮询策略分发请求。
七、分布式事务
作用:保证跨服务操作的数据一致性。例如 “下单” 需同时修改订单库和库存库,若其中一个失败,需全部回滚。
常用技术:Seata(简单易用)、Saga 模式
Seata 配置示例:
部署 Seata 服务器(TC,事务协调者),修改
registry.conf
指定注册中心(如 Nacos)。微服务接入 Seata:
引入依赖:<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>
配置 Seata(
application.yml
):seata:tx-service-group: my_test_tx_group # 事务组(需与Seata服务器配置一致)registry:type: nacosnacos:server-addr: localhost:8848
使用
@GlobalTransactional
注解标记分布式事务:@Service public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate InventoryFeignClient inventoryFeignClient;// 标记为分布式事务,若库存扣减失败,订单会回滚@GlobalTransactionalpublic void createOrder(Order order) {// 1. 保存订单orderMapper.insert(order);// 2. 调用库存服务扣减库存inventoryFeignClient.deduct(order.getProductId(), order.getCount());} }
八、监控与追踪
作用:实时监控服务健康状态、性能指标(如响应时间、错误率),追踪跨服务调用链路(如 “下单” 调用了哪些服务,哪个环节耗时最长)。
常用技术:
- 监控:Spring Boot Actuator + Micrometer + Prometheus + Grafana
- 追踪:Sleuth + Zipkin
Zipkin 链路追踪配置示例:
启动 Zipkin 服务器(收集追踪数据):
java -jar zipkin-server-2.24.3-exec.jar
(默认端口 9411,访问http://localhost:9411
)。微服务接入 Zipkin:
引入依赖:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sleuth-zipkin</artifactId> </dependency>
配置 Zipkin(
application.yml
):spring:sleuth:sampler:probability: 1.0 # 采样率(1.0表示全部采样,生产环境可设0.1)zipkin:base-url: http://localhost:9411 # Zipkin服务器地址
总结
Java 微服务各组件协同工作流程:
- 服务启动时注册到 Nacos,从 Nacos 配置中心拉取配置;
- 客户端通过 Spring Cloud Gateway 调用服务,网关路由到目标服务;
- 服务间通过 Feign(同步)或 RabbitMQ(异步)通信,LoadBalancer 负责负载均衡;
- 若服务调用失败,Resilience4j 触发熔断降级;
- 跨服务事务由 Seata 保证一致性;
- 全链路监控通过 Zipkin 和 Prometheus 实现。
每个组件的配置核心是 “接入注册中心”“声明自身角色”“指定协作规则”,通过 Spring Cloud 生态可快速整合这些能力。