diff --git a/notes/pics/microservice-overview.png b/notes/pics/microservice-overview.png index 25c525d4..e1ba7491 100644 Binary files a/notes/pics/microservice-overview.png and b/notes/pics/microservice-overview.png differ diff --git a/notes/微服务.md b/notes/微服务.md index 692d0f6d..3f0890de 100644 --- a/notes/微服务.md +++ b/notes/微服务.md @@ -222,7 +222,7 @@ Map 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 中的服务名换成实例的地址后再发送。

@@ -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 就拒绝自动回滚,只能人工处理。 ## 八、链路追踪