mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-10-31 11:05:36 +00:00
Update 微服务.md
补充 Nacos 新进程不读取磁盘缓存的原因、Seata 读已提交需要的上下文;调整总览配图的说明。
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 191 KiB After Width: | Height: | Size: 147 KiB |
+3
-3
@@ -222,7 +222,7 @@ Map<String, Object> result = inventoryClient.deduct(10086, 2);
|
||||
@FeignClient 注解的接口没有实现类,却能直接注入使用,过程如下:
|
||||
|
||||
- 启动时,@EnableFeignClients 导入 FeignClientsRegistrar,它扫描所有带 @FeignClient 的接口,为每个接口注册一个 FeignClientFactoryBean 类型的 Bean 定义;
|
||||
- 创建 Bean 时,FeignClientFactoryBean 把服务名拼成 http://inventory-service,用 JDK 动态代理生成接口的实现,也就是上面的 $Proxy88;
|
||||
- 创建 Bean 时,FeignClientFactoryBean 把服务名拼成 `http://inventory-service`,用 JDK 动态代理生成接口的实现,也就是上面的 $Proxy88;
|
||||
- 调用时,代理把方法和参数转换成 HTTP 请求,交给 FeignBlockingLoadBalancerClient,它通过 Spring Cloud LoadBalancer 选出一个实例,把 URL 中的服务名换成实例的地址后再发送。
|
||||
|
||||
<div align="center"> <img src="pics/feign-chain.png" width="740px"/> </div><br>
|
||||
@@ -310,7 +310,7 @@ public class RandomConfiguration {
|
||||
停掉 Nacos 后:
|
||||
|
||||
- 已经运行的订单服务仍然可以调用库存服务,因为实例列表已经缓存在本地;
|
||||
- 新启动的订单服务默认无法启动:spring.cloud.nacos.discovery.fail-fast 默认为 true,注册失败时直接报错退出。把它设为 false 后可以启动,配置也能从本地快照读取,但调用库存服务时报错 No servers available for service: inventory-service,因为新进程从没有拿到过实例列表(见[附录 A3](#a3-注册中心宕机))。
|
||||
- 新启动的订单服务默认无法启动:spring.cloud.nacos.discovery.fail-fast 默认为 true,注册失败时直接报错退出。把它设为 false 后可以启动,配置也能从本地快照读取,但调用库存服务时报错 No servers available for service: inventory-service,因为新进程启动时默认不读取磁盘上的实例缓存(spring.cloud.nacos.discovery.naming-load-cache-at-start 默认为 false),又连不上 Nacos(见[附录 A3](#a3-注册中心宕机))。
|
||||
|
||||
所以注册中心宕机不会立刻影响线上的调用,但扩容和发布都无法进行,生产环境中 Nacos 要以集群方式部署。
|
||||
|
||||
@@ -410,7 +410,7 @@ Spring Cloud Alibaba 中常用 Sentinel 实现:把接口或者一段代码定
|
||||
|
||||
AT 与 XA 两阶段提交的区别在于锁持有的时间:XA 的第一阶段只准备、不提交,行锁一直持有到第二阶段;AT 的第一阶段就提交了本地事务、释放行锁,只靠全局锁阻止其它全局事务修改这些行,所以并发更高。代价有两个:
|
||||
|
||||
- 其它事务在第二阶段之前就能读到 98,即默认的全局隔离级别是读未提交,需要读已提交时用 SELECT ... FOR UPDATE 等待全局锁;
|
||||
- 其它事务在第二阶段之前就能读到 98,即默认的全局隔离级别是读未提交,需要读已提交时,在 @GlobalTransactional 或 @GlobalLock 的方法中用 SELECT ... FOR UPDATE 等待全局锁,不在这两种上下文中的 FOR UPDATE 不会经过 Seata 的检查;
|
||||
- 全局锁只对 Seata 管理的事务有效,其它代码直接改了这些行时,回滚前发现当前值既不等于后镜像也不等于前镜像,Seata 就拒绝自动回滚,只能人工处理。
|
||||
|
||||
## 八、链路追踪
|
||||
|
||||
Reference in New Issue
Block a user