当前位置: 首页 > news >正文

微服务的使用

Java 微服务架构是将传统单体应用拆分为多个独立、可自治的小型服务,每个服务专注于特定业务能力。这些服务通过轻量级通信协议协作,共同完成整体业务。下面从核心组件的作用和配置两方面详细讲解:

一、服务注册与发现

作用:解决服务间 “如何找到彼此” 的问题。微服务实例会动态扩缩容(IP / 端口变化),无法通过硬编码地址通信。注册中心负责维护服务列表,服务启动时注册自己,下线时注销,其他服务通过注册中心获取目标服务地址。

常用技术:Eureka、Nacos、Consul、Zookeeper
配置示例(以 Nacos 为例)
Nacos 是主流的注册中心(兼具配置中心功能),分为服务端和客户端。

  1. 服务端部署
    下载 Nacos 服务器,启动后默认端口 8848,访问http://localhost:8848/nacos可进入控制台(默认账号密码 nacos/nacos)。

  2. 客户端配置(微服务接入)
    在微服务的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)

  1. 引入依赖:

    <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>
    
  2. 配置路由规则(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 配置中心)

  1. 在 Nacos 控制台添加配置:

    • 命名空间:区分环境(如 dev/test/prod)
    • 配置集 ID:user-service-dev.yml(格式:服务名 - 环境.yml)
    • 配置内容:
      spring:datasource:url: jdbc:mysql://localhost:3306/user_dbusername: rootpassword: 123456
      
  2. 微服务接入配置中心:
    引入依赖:

    <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 请求代码。

  1. 引入依赖:

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 定义 Feign 接口(调用 user-service):

    @FeignClient(name = "user-service")  // 目标服务名(从注册中心获取)
    public interface UserFeignClient {// 声明要调用的接口(与user-service的Controller方法一致)@GetMapping("/users/{id}")User getUserById(@PathVariable("id") Long id);
    }
    
  3. 启动类添加@EnableFeignClients

    @SpringBootApplication
    @EnableFeignClients
    public class OrderServiceApplication { ... }
    
  4. 使用 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 配置示例

  1. 引入依赖:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    
  2. 配置 RabbitMQ 连接(application.yml):

    spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest
    
  3. 生产者(发送消息):

    @Service
    public class OrderService {@Autowiredprivate RabbitTemplate rabbitTemplate;public void createOrder(Order order) {// 保存订单...// 发送消息到队列(通知服务消费)rabbitTemplate.convertAndSend("order-exchange", "order.created", order.getId());}
    }
    
  4. 消费者(接收消息):

    @Component
    public class NotificationConsumer {@RabbitListener(queues = "order-notify-queue")  // 监听指定队列public void handleOrderCreated(Long orderId) {// 处理消息:发送短信/邮件通知System.out.println("订单" + orderId + "已创建,准备发送通知");}
    }
    

五、熔断与降级

作用:防止 “服务雪崩”。当某个服务故障(如响应慢、超时),调用方如果持续请求会耗尽资源,进而影响其他服务。熔断会在故障时 “断开” 调用,降级则返回默认结果(如 “系统繁忙,请稍后再试”)。

常用技术:Resilience4j(推荐)、Sentinel、Hystrix(已停更)

Resilience4j 配置示例

  1. 引入依赖:

    <dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId>
    </dependency>
    
  2. 配置熔断规则(application.yml):

    resilience4j:circuitbreaker:instances:userService:  # 熔断实例名(对应@CircuitBreaker的name)failureRateThreshold: 50  # 失败率阈值(超过50%触发熔断)waitDurationInOpenState: 10000  # 熔断后10秒内拒绝请求slidingWindowSize: 10  # 统计最近10个请求的失败率
    
  3. 在 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 配合使用,自动从注册中心获取服务实例列表并分发请求。

  1. 引入依赖(已包含在 OpenFeign 中,无需额外添加):

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    
  2. 配置负载均衡策略(application.yml):

    spring:cloud:loadbalancer:configurations: round-robin  # 轮询策略(默认),可选:random(随机)
    
  3. 自动生效:
    当使用 Feign 调用user-service时,LoadBalancer 会自动从 Nacos 获取所有实例(8081、8082),按轮询策略分发请求。

七、分布式事务

作用:保证跨服务操作的数据一致性。例如 “下单” 需同时修改订单库和库存库,若其中一个失败,需全部回滚。

常用技术:Seata(简单易用)、Saga 模式
Seata 配置示例

  1. 部署 Seata 服务器(TC,事务协调者),修改registry.conf指定注册中心(如 Nacos)。

  2. 微服务接入 Seata:
    引入依赖:

    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    </dependency>
    
  3. 配置 Seata(application.yml):

    seata:tx-service-group: my_test_tx_group  # 事务组(需与Seata服务器配置一致)registry:type: nacosnacos:server-addr: localhost:8848
    
  4. 使用@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 链路追踪配置示例

  1. 启动 Zipkin 服务器(收集追踪数据):
    java -jar zipkin-server-2.24.3-exec.jar(默认端口 9411,访问http://localhost:9411)。

  2. 微服务接入 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>
    
  3. 配置 Zipkin(application.yml):

    spring:sleuth:sampler:probability: 1.0  # 采样率(1.0表示全部采样,生产环境可设0.1)zipkin:base-url: http://localhost:9411  # Zipkin服务器地址
    

总结

Java 微服务各组件协同工作流程:

  1. 服务启动时注册到 Nacos,从 Nacos 配置中心拉取配置;
  2. 客户端通过 Spring Cloud Gateway 调用服务,网关路由到目标服务;
  3. 服务间通过 Feign(同步)或 RabbitMQ(异步)通信,LoadBalancer 负责负载均衡;
  4. 若服务调用失败,Resilience4j 触发熔断降级;
  5. 跨服务事务由 Seata 保证一致性;
  6. 全链路监控通过 Zipkin 和 Prometheus 实现。

每个组件的配置核心是 “接入注册中心”“声明自身角色”“指定协作规则”,通过 Spring Cloud 生态可快速整合这些能力。

http://www.dtcms.com/a/312898.html

相关文章:

  • java中Optional类的使用和注意采坑
  • DBMS设计 之2 从数据中台到三种中台
  • 常见的框架漏洞(Thinkphp,spring,Shiro)
  • 常见的框架漏洞
  • IO流-对象流
  • MCP革命:AI世界的“USB-C”接口如何重塑智能体与外部工具的连接
  • 均线:从市场脉搏到量子计算的时空密码
  • K8S几种常见CNI深入比较
  • Qt::AA_DontCreateNativeWidgetSiblings使用注意事项
  • 游戏设计原理
  • Flutter开发 dart异步
  • Linux网络编程 ---五种IO模型
  • 基于 Spring Boot + Vue 实现人脸采集功能全流程
  • Python----大模型(从预训练到分布式优化的核心技术解析)
  • 2、RabbitMQ的5种模式基本使用(Maven项目)
  • 迈向透明人工智能: 可解释性大语言模型研究综述
  • ubuntu apt安装与dpkg安装相互之间的关系
  • Python 实例属性与方法命名冲突:一次隐藏的Bug引发的思考
  • 途游Android面试题及参考答案
  • 【GitHub探索】Agent开发平台CozeStudio开源版本踩坑体验
  • pycharm上如何添加conda环境
  • 嵌入式 C 语言入门:多文件编程实践笔记 —— 从文件创建到调用
  • 为何:内存数据断电即逝,硬盘数据牢笼长存
  • LangChain框架概念及简单的使用案例
  • ABP VNext + CloudEvents:事件驱动微服务互操作性
  • 计算机核心概念辨析与解析
  • 24SpringCloud黑马商城部署Java应用后浏览器访问数据库不显示数据的解决办法
  • 可持久化线段树 系列 题解
  • 【Python✨】解决 Conda 安装 MoviePy 报错问题
  • GitCode疑难问题诊疗