一、微服务架构优势
- 拆分业务,降低复杂度:将复杂的单体应用拆分成多个简单的微服务,每个服务专注于单一的业务功能,使得开发、测试和维护更加容易。
- 独立部署,快速迭代:每个微服务可以独立部署,当某个服务需要更新时,无需重新部署整个应用,从而加快了开发和发布的速度,提高了系统的灵活性和可扩展性。
- 技术选型灵活:每个微服务可以根据自身的业务需求选择合适的技术栈,例如不同的编
Spring Cloud / Alibaba 微服务架构实战--- “夏のke” ---www.---bcwit.---top/1910/
2.程语言、框架、数据库等,从而充分发挥各种技术的优势。 5. 容错性强:由于微服务是独立运行的,当某个服务出现故障时,不会影响其他服务的正常运行,从而提高了整个系统的容错性和可靠性。 6. 便于团队协作:微服务架构将应用程序拆分成多个独立的服务,每个服务可以由不同的团队负责开发和维护,从而提高了团队的协作效率。
(三)Spring Cloud 与 Alibaba 微服务框架
- Spring Cloud:是一个基于 Spring Boot 的微服务架构开发工具,它为微服务架构中的服务治理、配置管理、负载均衡、断路器、网关等提供了一整套的解决方案。Spring Cloud 集成了众多优秀的开源项目,如 Eureka、Ribbon、Feign、Hystrix、Zuul 等,使得开发者可以快速构建微服务架构。
- Alibaba 微服务框架:是阿里巴巴集团开源的一套微服务框架,它基于 Spring Cloud 生态,提供了更加适合中国国情的微服务解决方案。Alibaba 微服务框架包括 Nacos、Sentinel、Dubbo、Seata 等组件,分别用于服务注册与发现、流量控制与熔断降级、服务调用、分布式事务等场景。
二、环境准备
(一)开发工具
- JDK:建议使用 JDK 1.8 及以上版本,下载地址为Oracle JDK 下载或OpenJDK 下载。
- Maven:用于项目依赖管理和构建,下载地址为Maven 下载。安装完成后,配置 Maven 环境变量,确保在命令行中可以执行mvn命令。
- IDE:推荐使用 IntelliJ IDEA,下载地址为IntelliJ IDEA 下载。也可以使用 Eclipse 等其他 IDE。
(二)中间件
- Nacos:用于服务注册与发现和配置管理,下载地址为Nacos 下载。按照官方文档的说明,启动 Nacos 服务器。
- Redis:用于分布式缓存,下载地址为Redis 下载。安装并启动 Redis 服务。
- MySQL:用于存储业务数据,下载地址为MySQL 下载。创建数据库和相关表。
三、项目初始化
(一)创建父工程
- 打开 IntelliJ IDEA,选择 "Create New Project",在弹出的窗口中选择 "Maven" 项目,点击 "Next"。
- 输入项目的 GroupId、ArtifactId 和 Version,例如 GroupId 为 "com.example",ArtifactId 为 "microservices-parent",Version 为 "1.0.0"。
- 选择 Maven 的配置文件,确保使用正确的 Maven 版本。
- 点击 "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)
(一)服务提供者
-
在用户服务子模块中,添加 Nacos 客户端依赖:
xml
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
-
在 application.yml 文件中,配置 Nacos 服务器地址和服务名称:
yaml
server:
port: 8081
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
- 创建用户服务接口和实现类,例如提供获取用户信息的接口。
(二)服务消费者
-
在订单服务子模块中,同样添加 Nacos 客户端依赖,并配置 Nacos 服务器地址和服务名称。
-
使用 RestTemplate 或 Feign 客户端来调用用户服务。RestTemplate 方式:在订单服务的配置类中注入 RestTemplate,并使用@LoadBalanced注解开启负载均衡:
-
java
-
@Configuration public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
-
在订单服务中,通过 RestTemplate 调用用户服务:
-
java
-
@Service public class OrderService { @Autowired private RestTemplate restTemplate; public String getUserInfo(String userId) { return restTemplate.getForObject("http://user-service/users/" + userId, String.class); } }
-
Feign 方式:在订单服务中添加 Feign 依赖:
-
xml
-
org.springframework.cloud spring-cloud-starter-openfeign
-
在启动类上添加@EnableFeignClients注解,开启 Feign 客户端功能。创建 Feign 接口,指定要调用的服务名称和接口路径:
-
java
-
@FeignClient(name = "user-service") public interface UserFeignClient { @GetMapping("/users/{userId}") String getUserInfo(@PathVariable("userId") String userId); }
-
在订单服务中注入 Feign 接口并调用:
-
java
-
@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
-
在用户服务子模块中,添加 Sentinel 依赖:
xml
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
-
在 application.yml 文件中,配置 Sentinel 服务器地址:
yaml
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
- 启动 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 的反应式、非阻塞式网关,它可以作为微服务架构的入口,统一处理请求路由、请求转发、权限验证、限流、日志记录等功能。
(二)创建网关服务
-
创建网关服务子模块,添加 Gateway 依赖:
xml
org.springframework.cloud
spring-cloud-starter-gateway
-
在 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
-
在用户服务和订单服务等子模块中,添加 Nacos Config 依赖:
xml
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
-
创建 bootstrap.yml 文件,配置 Nacos Config 的基本信息,包括服务器地址、命名空间、配置文件名称和格式等:
yaml
spring:
application:
name: user-service
cloud:
nacos:
config:
server-addr: localhost:8848
namespace:
group: DEFAULT_GROUP
file-extension: yml
- 在 Nacos 服务器上,创建对应的配置文件,例如user-service.yml,并添加配置内容。微服务启动时会自动从 Nacos Config 获取配置信息。
(三)动态更新配置
当 Nacos Config 中的配置信息发生变化时,微服务可以通过添加@RefreshScope注解来实现配置的动态更新。例如,在用户服务的某个 Bean 中添加该注解,当配置更新时,Bean 会自动重新加载配置。
九、分布式链路追踪(Sleuth + Zipkin)
(一)链路追踪简介
在微服务架构中,一个请求可能会经过多个微服务的调用,形成一条复杂的调用链。分布式链路追踪可以帮助开发者追踪请求的调用路径,定位故障和性能瓶颈,提高系统的可维护性和调试效率。
(二)集成 Sleuth 和 Zipkin
-
在各个微服务子模块中,添加 Sleuth 和 Zipkin 依赖:
xml
org.springframework.cloud
spring-cloud-starter-sleuth
org.springframework.cloud
spring-cloud-starter-zipkin
-
在 application.yml 文件中,配置 Zipkin 服务器地址:
yaml
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1.0 # 采样率,1.0表示全部采样
- 启动 Zipkin 服务器,访问 Zipkin 的管理界面,可以查看请求的调用链路信息,包括各个服务的调用时间、耗时、状态码等。
十、实战案例:电商平台微服务架构
(一)案例背景
构建一个简单的电商平台微服务架构,包括用户服务、商品服务、订单服务、支付服务、网关服务等。各个服务之间通过 Nacos 进行服务注册与发现,使用 Feign 进行服务调用,通过 Sentinel 进行流量控制和熔断降级,利用 Gateway 进行网关路由和功能扩展,使用 Nacos Config 进行配置管理,通过 Sleuth 和 Zipkin 进行链路追踪。
(二)业务流程
- 用户通过网关访问电商平台,发送请求到用户服务进行登录或注册。
- 用户浏览商品时,请求发送到商品服务获取商品信息。
- 用户下单时,订单服务调用用户服务获取用户信息,调用商品服务获取商品信息,并生成订单。
- 订单生成后,支付服务进行支付处理,支付成功后通知订单服务更新订单状态。
(三)代码实现
按照前面介绍的步骤,分别实现各个微服务的功能,包括服务注册与发现、服务调用、负载均衡、服务降级与熔断、网关配置、配置中心、链路追踪等。在实现过程中,注意代码的规范和可维护性,添加必要的注释和单元测试。