Spring Cloud生态
参考视频尚硅谷2025最新SpringCloud教程,springcloud从入门到大牛_哔哩哔哩_bilibili
Nacos
服务注册与发现
服务列表
节点
配置中心
使用nacos管理配置
热刷新
方法1
在controller层标注@RefreshScope
在入口标注@EnableDiscoveryClient
方法2@ConfigurationProperties
把属性抽取到一个类里面
@Component
@ConfigurationProperties(prefix = "rocketmq")
@Data
public class Pro {
String nameServer;
}
监听
配置变化后在控制台打印出来
@Bean
ApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager) {
return args -> {
ConfigService configService =nacosConfigManager.getConfigService();
configService.addListener("second.yml", "DEFAULT_GROUP", new Listener() {
@Override
public Executor getExecutor() {
return Executors.newFixedThreadPool(4);
}
@Override
public void receiveConfigInfo(String s) {
System.out.println(s);
}
});
};
负载均衡
基于注解
@LoadBalanced
OpenFeign
简单使用
启动类加注解
@EnableFeignClients
@FeignClient(name = "first")
public interface tmpFeignClient {
@GetMapping("/first/tmp")
public String tmp();
}
发送请求/first/tmp
返回数据类型String
超时,重试,拦截
超时报错
可自定义超时时间
//自定义日志
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
//自定义重试
@Bean
Retryer retryer(){
return new Retryer.Default(100,1000,5);
}
效果
自定义拦截器,可用于放唯一ID
@Component
public class DefaultInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
System.out.println("自定义拦截器");
}
}
兜底返回
@FeignClient(value = "userservice",fallback = Fallback.class) // 注解这是一个Feign客户端,"userservice"是请求服务名
public interface UserClient {
@GetMapping("/user/{id}") // 定义HTTP请求是一个GET请求,请求的路径是"/user/{id}"
User findById(@PathVariable("id") Long id);
}
@Component
public class Fallback implements UserClient {
@Override
public User findById(Long id) {
return new User();
}
}
Sentinel
默认启动8080,但是经常端口被占用,用8086端口启动
java -Dserver.port=8086 -Dcsp.sentinel.dashboard.server=localhost:8086 -jar sentinel-dashboard-1.8.8.jar
配置
sentinel: transport: dashboard: 127.0.0.1:8086 port: 8719 # 这样一启动能够立马被发现,不用请求一次后才被监控 eager: true # 链路相关的配置 # 默认是true,开启上下文整合,所有链路在根节点下,链路监控就是将请求分开统计 web-context-unify: false
这里的spring.cloud.nacos.discovery.server-addr是链接到nacos的路径
下面的spring.cloud.sentinel.transport.dashboard是链接的sentinel的路径,
port是在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了1个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。
标注
@SentinelResource("getOrder")
异常处理
对异常不做处理会抛到最顶层
自定义兜底处理函数
15-2、Sentinel 自定义兜底逻辑_兜底逻辑怎么配置-CSDN博客
流控
熔断
热点
Gateway
路由
路由规则
gateway: routes: - id: user-service # 路由标示,必须唯一 uri: lb://userservice # 路由的目标地址 predicates: # 路由断言,判断请求是否符合规则 - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合 - id: order-service uri: lb://orderservice predicates: - Path=/order/** default-filters: - AddRequestHeader=Truth,Itcast is freaking awesome!
这段YAML配置定义了一个网关路由规则,包含两个服务路由和一个默认过滤器。具体功能如下:
配置了两个路由:user-service 和 order-service,分别指向 userservice 和 orderservice,路径匹配 /user/** 和 /order/**。
设置了一个默认过滤器,为所有请求添加请求头 Truth: Itcast is freaking awesome!。
断言
满足规则把请求转下去
12.gateway中的断言(predicate)的使用:内置断言介绍、自定义断言_gateway自定义断言-CSDN博客
过滤器
可用来路径重写
Spring Cloud : Gateway 网关过滤器 GatewayFilter(四)_spring.cloud.gateway.route.filter-CSDN博客
Seata
二阶段提交
分布式事务
用户模块调用订单模块,订单模块调用商品模块,用户模块回滚会影响商品模块
@GlobalTransactional
在方法前面加上全局事务注解