一、架构图
二、springCloud全家桶组件库
三、Spring Cloud 实战项目全景规划
四、技术选型
第一阶段:搭建基础的微服务功能,实现微服务之间的通信;
1、服务治理:服务治理的重点是搭建基础的跨服务调用功能。我会把用户服务、优惠计算服务和订单服务改造成可以独立启动的微服务,并借助 Nacos 的服务发现功能,通过 Webflux 组件中的 WebClient 实现基于 HTTP 的跨服务间的调用;
2、负载均衡:在这部分,我们将在服务治理的基础上,引入 Loadbalancer 组件为跨服务调用添加负载均衡的能力。除此之外,我会对 Loadbalancer 组件的扩展接口做自定义开发,实现一个金丝雀测试的负载均衡场景;
3、简化服务调用:我将使用 OpenFeign 组件对用户服务进行改造,将原先复杂的 WebClient 调用替换为简洁的 OpenFeign 调用。
第二阶段:为各个模块构建服务容错、分布式配置中心、分布式链路追踪能力;
1、配置管理:配置管理的重点是将三个微服务应用接入到 Nacos Config 配置中心,使用远程配置中心存储部分配置项
2、服务容错:搭建 Sentinel Dashboard 控制台,通过控制台将降级规则和流量整形规则应用到业务埋点中。
3、链路追踪:这部分的重点是搭建分布式链路追踪与日志系统。
第三阶段:进一步实现微服务网关、消息驱动和分布式事务。
1、搭建微服务网关作为统一流量入口;
2、使用消息驱动组件对接 RabbitMQ;
3、通过分布式事务保证数据一致性。
五、具体实现
1、Nacos体系架构(服务治理)
服务注册流程
Nacos 体系架构
(1)领域模型
数据模型
基本架构
Provider APP 和 Consumer APP 通过 Open API 和 Nacos 服务器的核心模块进行通信。
Nacos Core 模块
Nacos “一致性协议”:
Nacos 内部支持两种一致性协议,一种是侧重一致性的 Raft 协议,基于集群中选举出来的 Leader 节点进行数据写入;另一种是针对临时节点的 Distro 协议,它是一个侧重可用性(或最终一致性)的分布式一致性协议。
2、服务提供者注册到Nacos服务器
① 依赖
父项目pom.xml
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2020.0.1</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.1</version><type>pom</type><scope>import</scope></dependency></dependencies> <!-- 省略部分代码 -->
</dependencyManagement>
子项目pom.xml
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
② 添加 Nacos 配置项
spring:cloud:nacos:discovery:# Nacos的服务注册地址,可以配置多个,逗号分隔server-addr: localhost:8848# 服务注册到Nacos上的名称,一般不用配置service: coupon-customer-serv# nacos客户端向服务端发送心跳的时间间隔,时间单位其实是msheart-beat-interval: 5000# 服务端没有接受到客户端心跳请求就将其设为不健康的时间间隔,默认为15s# 注:推荐值该值为15s即可,如果有的业务线希望服务下线或者出故障时希望尽快被发现,可以适当减少该值heart-beat-timeout: 20000# 元数据部分 - 可以自己随便定制metadata:mydata: abc# 客户端在启动时是否读取本地配置项(一个文件)来获取服务列表# 注:推荐该值为false,若改成true。则客户端会在本地的一个# 文件中保存服务信息,当下次宕机启动时,会优先读取本地的配置对外提供服务。naming-load-cache-at-start: false# 命名空间ID,Nacos通过不同的命名空间来区分不同的环境,进行数据隔离,namespace: dev# 创建不同的集群cluster-name: Cluster-A# [注意]两个服务如果存在上下游调用关系,必须配置相同的group才能发起访问group: myGroup# 向注册中心注册服务,默认为true# 如果只消费服务,不作为服务提供方,倒是可以设置成false,减少开销register-enabled: true
验证 Nacos 服务注册功能
补充知识:
重要流程:创建一个单pom项目改为父子pom项目
0、检查idea是否在父模块pom中生成子模块
<modules><module>eureka</module></modules>
1、子模块pom.xml添加
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies>
2、使用Eureka搭建注册中心
① 通过idea创建一个maven模块
② 创建启动类 EurekaApplication
@EnableEurekaServer
③ 关闭链接到注册中心(不用自己链接自己)
spring.application.name=eureka
server.port=8761
eureka.client.fetch-registry=false
eureka.client.register-with-eureka=false
3、搭建server模块处理公共逻辑
① 使用方法:其他项目引入server模块的jar包
pom.xml
<dependency><groupId>com.course</groupId><artifactId>server</artifactId></dependency>
② 注册到Eureka注册中心模块
第一步、增加eureka client依赖
pom.xml
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
第二步、增加配置,注册中心地址
application.properties
spring.application.name=eureka
server.port=8761eureka.client.fetch-registry=true
eureka.client.register-with-eureka=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
第三步、启动类加EnableeurekaClient注解
@EnableEurekaClient
4、搭建路由模块-gateway
作用:网关主要功能:限流(流量控制);重试(请求失败时重试,慎用); 跨域(前后端不在同一个域);路由转发请求); 鉴权(登录校验,签名校验等
① 配置端口为9000表示路由
application.properties
spring.application.name=gateway
server.port=9000
注册到注册中心逻辑同上
② 路由转发
application.properties
spring.cloud.gateway.routes[0].id=system
spring.cloud.gateway.routes[0].uri=http://127.0.0.1:9001
spring.cloud.gateway.routes[0].predicates[0].name=Path
spring.cloud.gateway.routes[0].predicates[0].args[0]=/system/**
spring.cloud.gateway.routes[0].filters[0].name=LoginAdmin
spring.cloud.gateway.routes[0].filters[0].args[0]=true
5、搭建业务模块-system处理业务逻辑
① 配置公共请求头
application.properties
server.servlet.context-path=/system