主线放这里,组件细节放单篇。

主线

先串 4 个问题:

1、服务怎么注册和发现

2、请求怎么从入口网关走到下游服务

3、配置、消息队列、分布式事务分别解决什么问题

4、调用链一长之后,哪里最容易出错

注册中心

Eureka 在前,Nacos 在后。

1
2
3
4
5
6
7
8
spring:
application:
name: cloud-eureka-server

eureka:
client:
register-with-eureka: false
fetch-registry: false

细节看:

1、SpringCloud学习

2、Nacos服务

网关

Gateway 负责统一入口、路由转发、鉴权、限流、日志。

核心概念:

1、Route

2、Predicate

3、Filter

1
2
3
4
5
6
server.port=8181
spring.application.name=service-gateway
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.gateway.routes[0].id=service-acl
spring.cloud.gateway.routes[0].uri=lb://service-acl
spring.cloud.gateway.routes[0].predicates=Path=/*/acl/**

补充:

1、Route 决定请求转发到哪个服务

2、Predicate 决定什么请求命中这条路由

3、Filter 负责改写请求、鉴权、日志、限流

4、Filter 分本地 GatewayFilter 和全局 GlobalFilter

1
spring.cloud.gateway.discovery.locator.enabled=true

服务名路由打开后,网关可以直接按注册中心里的服务名转发。

Gateway 过滤链的执行顺序也要知道:命中路由后先进入 Gateway Handler Mapping,再经过 GatewayFilterGlobalFilter,最后才转发给下游服务。

网关这一层常做 token 校验、内部接口拦截、统一异常返回。

公共能力

微服务里经常一起出现的还有定时任务、异步任务、缓存。

1、定时任务适合日报统计、补偿、清理类任务,逻辑不要写重。

2、异步任务适合发短信、发消息、刷缓存这类非主链路操作。

3、JWT 一般放在网关或认证服务做解析,Redis 常放验证码、登录态、缓存、幂等控制。

1
2
3
4
@Scheduled(cron = "0 0 1 * * ?")
public void syncDaily() {
statisticsDailyService.registerCount(DateUtil.formatDate(DateUtil.addDays(new Date(), -1)));
}
1
2
3
4
@Async("asyncTaskExecutor")
public void asyncTask() {
// 异步执行非主链路逻辑
}

异步任务要单独配线程池和异常处理,不能默认把耗时方法直接丢进公共线程池。

网关存在的原因:

1、调用地址怎么统一管理

2、网关怎么做鉴权、限流和路由

3、异步解耦之后消息怎么投递和消费

4、跨服务写库失败时怎么兜底

组件

继续补:

1、Springboot整合RabbitMQ

2、Seata分布式事务

MQ 解决削峰、异步、解耦;Seata 解决分布式事务。

顺序

1、SpringCloud学习,先把 Eureka 和注册发现跑通

2、再看 Nacos服务,理解很多项目从 Eureka 切到 Nacos 的原因

3、然后看 Springboot整合RabbitMQ,补异步消息

4、最后看 Seata分布式事务,补跨服务事务