Spring Cloud / Alibaba 微服务架构实战

51 阅读6分钟

一、微服务架构优势

  1. 拆分业务,降低复杂度:将复杂的单体应用拆分成多个简单的微服务,每个服务专注于单一的业务功能,使得开发、测试和维护更加容易。
  2. 独立部署,快速迭代:每个微服务可以独立部署,当某个服务需要更新时,无需重新部署整个应用,从而加快了开发和发布的速度,提高了系统的灵活性和可扩展性。
  3. 技术选型灵活:每个微服务可以根据自身的业务需求选择合适的技术栈,例如不同的编

Spring Cloud / Alibaba 微服务架构实战--- “夏のke” ---www.---bcwit.---top/1910/

2.程语言、框架、数据库等,从而充分发挥各种技术的优势。 5. 容错性强:由于微服务是独立运行的,当某个服务出现故障时,不会影响其他服务的正常运行,从而提高了整个系统的容错性和可靠性。 6. 便于团队协作:微服务架构将应用程序拆分成多个独立的服务,每个服务可以由不同的团队负责开发和维护,从而提高了团队的协作效率。

(三)Spring Cloud 与 Alibaba 微服务框架

  1. Spring Cloud:是一个基于 Spring Boot 的微服务架构开发工具,它为微服务架构中的服务治理、配置管理、负载均衡、断路器、网关等提供了一整套的解决方案。Spring Cloud 集成了众多优秀的开源项目,如 Eureka、Ribbon、Feign、Hystrix、Zuul 等,使得开发者可以快速构建微服务架构。
  2. Alibaba 微服务框架:是阿里巴巴集团开源的一套微服务框架,它基于 Spring Cloud 生态,提供了更加适合中国国情的微服务解决方案。Alibaba 微服务框架包括 Nacos、Sentinel、Dubbo、Seata 等组件,分别用于服务注册与发现、流量控制与熔断降级、服务调用、分布式事务等场景。

二、环境准备

(一)开发工具

  1. JDK:建议使用 JDK 1.8 及以上版本,下载地址为Oracle JDK 下载或OpenJDK 下载。
  2. Maven:用于项目依赖管理和构建,下载地址为Maven 下载。安装完成后,配置 Maven 环境变量,确保在命令行中可以执行mvn命令。
  3. IDE:推荐使用 IntelliJ IDEA,下载地址为IntelliJ IDEA 下载。也可以使用 Eclipse 等其他 IDE。

(二)中间件

  1. Nacos:用于服务注册与发现和配置管理,下载地址为Nacos 下载。按照官方文档的说明,启动 Nacos 服务器。
  2. Redis:用于分布式缓存,下载地址为Redis 下载。安装并启动 Redis 服务。
  3. MySQL:用于存储业务数据,下载地址为MySQL 下载。创建数据库和相关表。

三、项目初始化

(一)创建父工程

  1. 打开 IntelliJ IDEA,选择 "Create New Project",在弹出的窗口中选择 "Maven" 项目,点击 "Next"。
  2. 输入项目的 GroupId、ArtifactId 和 Version,例如 GroupId 为 "com.example",ArtifactId 为 "microservices-parent",Version 为 "1.0.0"。
  3. 选择 Maven 的配置文件,确保使用正确的 Maven 版本。
  4. 点击 "Finish",创建父工程。

(二)配置父工程 Pom 文件

在父工程的 Pom.xml 文件中,添加 Spring Boot 和 Spring Cloud 的依赖管理:

xml



    4.0.0

    com.example
    microservices-parent
    1.0.0
    pom

    microservices-parent
    Spring Cloud / Alibaba 微服务架构父工程

    
        1.8
        2.7.12
        2021.0.6
        2021.0.4.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
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

(三)创建子模块

在父工程上右键,选择 "New Module",创建多个子模块,分别用于不同的微服务,例如用户服务(user-service)、订单服务(order-service)、网关服务(gateway-service)等。每个子模块都是一个 Spring Boot 项目,在子模块的 Pom.xml 文件中,继承父工程的依赖管理,并添加自己的业务依赖。

四、服务注册与发现(Nacos)

(一)服务提供者

  1. 在用户服务子模块中,添加 Nacos 客户端依赖:

xml


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery
  1. 在 application.yml 文件中,配置 Nacos 服务器地址和服务名称:

yaml

server:
  port: 8081

spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  1. 创建用户服务接口和实现类,例如提供获取用户信息的接口。

(二)服务消费者

  1. 在订单服务子模块中,同样添加 Nacos 客户端依赖,并配置 Nacos 服务器地址和服务名称。

  2. 使用 RestTemplate 或 Feign 客户端来调用用户服务。RestTemplate 方式:在订单服务的配置类中注入 RestTemplate,并使用@LoadBalanced注解开启负载均衡:

  3. java

  4. @Configuration public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }

  5. 在订单服务中,通过 RestTemplate 调用用户服务:

  6. java

  7. @Service public class OrderService { @Autowired private RestTemplate restTemplate; public String getUserInfo(String userId) { return restTemplate.getForObject("http://user-service/users/" + userId, String.class); } }

  8. Feign 方式:在订单服务中添加 Feign 依赖:

  9. xml

  10. org.springframework.cloud spring-cloud-starter-openfeign

  11. 在启动类上添加@EnableFeignClients注解,开启 Feign 客户端功能。创建 Feign 接口,指定要调用的服务名称和接口路径:

  12. java

  13. @FeignClient(name = "user-service") public interface UserFeignClient { @GetMapping("/users/{userId}") String getUserInfo(@PathVariable("userId") String userId); }

  14. 在订单服务中注入 Feign 接口并调用:

  15. java

  16. @Service public class OrderService { @Autowired private UserFeignClient userFeignClient; public String getUserInfo(String userId) { return userFeignClient.getUserInfo(userId); } }

(三)服务注册与发现验证

启动 Nacos 服务器、用户服务和订单服务,在 Nacos 的管理界面中可以看到注册的服务列表。订单服务能够成功调用用户服务,说明服务注册与发现功能正常。

五、服务调用与负载均衡(Ribbon)

(一)Ribbon 简介

Ribbon 是 Spring Cloud 提供的一个客户端负载均衡器,它可以在多个服务实例之间进行负载均衡,提高系统的性能和可用性。Ribbon 支持多种负载均衡策略,如轮询、随机、根据响应时间加权等。

(二)配置负载均衡策略

在订单服务的 application.yml 文件中,可以配置 Ribbon 的负载均衡策略,例如设置为随机策略:

yaml

user-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

也可以通过 Java 配置的方式来设置负载均衡策略:

java

@Configuration
public class RibbonConfig {
    @Bean
    public IRule ribbonRule() {
        return new RandomRule();
    }
}

(三)负载均衡验证

启动多个用户服务实例,模拟不同的服务节点。订单服务在调用用户服务时,会根据配置的负载均衡策略选择不同的服务实例,通过日志可以查看调用的服务实例端口,验证负载均衡功能是否正常。

六、服务降级与熔断(Sentinel)

(一)Sentinel 简介

Sentinel 是 Alibaba 开源的一款流量控制与熔断降级组件,它可以对微服务的调用进行实时监控和流量控制,防止服务因流量过大而导致故障,同时提供熔断降级功能,在服务出现异常时自动进行熔断,避免故障扩散。

(二)服务提供者集成 Sentinel

  1. 在用户服务子模块中,添加 Sentinel 依赖:

xml


    com.alibaba.cloud
    spring-cloud-starter-alibaba-sentinel
  1. 在 application.yml 文件中,配置 Sentinel 服务器地址:

yaml

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
  1. 启动 Sentinel Dashboard,按照官方文档的说明进行安装和启动。

(三)服务消费者熔断降级配置

在订单服务中,使用 Feign 客户端调用用户服务时,可以结合 Sentinel 进行熔断降级处理。在 Feign 接口中,通过fallback属性指定熔断降级的处理类:

java

@FeignClient(name = "user-service", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
    @GetMapping("/users/{userId}")
    String getUserInfo(@PathVariable("userId") String userId);
}

public class UserFeignClientFallback implements UserFeignClient {
    @Override
    public String getUserInfo(String userId) {
        return "用户服务调用失败,当前服务已降级!";
    }
}

同时,在 application.yml 文件中,开启 Feign 的 Sentinel 支持:

yaml

feign:
  sentinel:
    enabled: true

(四)Sentinel 规则配置

在 Sentinel Dashboard 中,可以为服务配置流量控制规则、熔断规则、热点规则等。例如,设置用户服务的调用超时时间、最大并发数等,当达到阈值时,Sentinel 会自动进行流量控制或熔断降级。

七、服务网关(Gateway)

(一)Gateway 简介

Spring Cloud Gateway 是一个基于 Spring Boot 的反应式、非阻塞式网关,它可以作为微服务架构的入口,统一处理请求路由、请求转发、权限验证、限流、日志记录等功能。

(二)创建网关服务

  1. 创建网关服务子模块,添加 Gateway 依赖:

xml


    org.springframework.cloud
    spring-cloud-starter-gateway
  1. 在 application.yml 文件中,配置网关的路由规则,将请求转发到对应的微服务:

yaml

server:
  port: 8080

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - RewritePath=/user/(?.*), /${segment}
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**
          filters:
            - RewritePath=/order/(?.*), /${segment}

其中,lb://user-service表示使用负载均衡的方式转发到用户服务,Path predicate 用于匹配请求路径,RewritePath filter 用于重写请求路径。

(三)网关功能扩展

可以在网关中添加权限验证过滤器、限流过滤器、日志记录过滤器等,实现更多的功能。例如,使用 Spring Security 进行认证授权,使用 Sentinel 进行网关限流。

八、配置中心(Nacos Config)

(一)Nacos Config 简介

Nacos 除了提供服务注册与发现功能外,还提供了配置中心功能,用于统一管理微服务的配置信息。配置信息可以在 Nacos 服务器上进行集中管理和动态更新,微服务可以实时获取最新的配置信息,无需重启应用。

(二)服务集成 Nacos Config

  1. 在用户服务和订单服务等子模块中,添加 Nacos Config 依赖:

xml


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-config
  1. 创建 bootstrap.yml 文件,配置 Nacos Config 的基本信息,包括服务器地址、命名空间、配置文件名称和格式等:

yaml

spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        namespace:
        group: DEFAULT_GROUP
        file-extension: yml
  1. 在 Nacos 服务器上,创建对应的配置文件,例如user-service.yml,并添加配置内容。微服务启动时会自动从 Nacos Config 获取配置信息。

(三)动态更新配置

当 Nacos Config 中的配置信息发生变化时,微服务可以通过添加@RefreshScope注解来实现配置的动态更新。例如,在用户服务的某个 Bean 中添加该注解,当配置更新时,Bean 会自动重新加载配置。

九、分布式链路追踪(Sleuth + Zipkin)

(一)链路追踪简介

在微服务架构中,一个请求可能会经过多个微服务的调用,形成一条复杂的调用链。分布式链路追踪可以帮助开发者追踪请求的调用路径,定位故障和性能瓶颈,提高系统的可维护性和调试效率。

(二)集成 Sleuth 和 Zipkin

  1. 在各个微服务子模块中,添加 Sleuth 和 Zipkin 依赖:

xml


    org.springframework.cloud
    spring-cloud-starter-sleuth


    org.springframework.cloud
    spring-cloud-starter-zipkin
  1. 在 application.yml 文件中,配置 Zipkin 服务器地址:

yaml

spring:
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    sampler:
      probability: 1.0 # 采样率,1.0表示全部采样
  1. 启动 Zipkin 服务器,访问 Zipkin 的管理界面,可以查看请求的调用链路信息,包括各个服务的调用时间、耗时、状态码等。

十、实战案例:电商平台微服务架构

(一)案例背景

构建一个简单的电商平台微服务架构,包括用户服务、商品服务、订单服务、支付服务、网关服务等。各个服务之间通过 Nacos 进行服务注册与发现,使用 Feign 进行服务调用,通过 Sentinel 进行流量控制和熔断降级,利用 Gateway 进行网关路由和功能扩展,使用 Nacos Config 进行配置管理,通过 Sleuth 和 Zipkin 进行链路追踪。

(二)业务流程

  1. 用户通过网关访问电商平台,发送请求到用户服务进行登录或注册。
  2. 用户浏览商品时,请求发送到商品服务获取商品信息。
  3. 用户下单时,订单服务调用用户服务获取用户信息,调用商品服务获取商品信息,并生成订单。
  4. 订单生成后,支付服务进行支付处理,支付成功后通知订单服务更新订单状态。

(三)代码实现

按照前面介绍的步骤,分别实现各个微服务的功能,包括服务注册与发现、服务调用、负载均衡、服务降级与熔断、网关配置、配置中心、链路追踪等。在实现过程中,注意代码的规范和可维护性,添加必要的注释和单元测试。