Spring cloud 日常记录
服务发现组件-nacos:
下载安装服务后,
spring:
cloud:
nacos:
discovery
server-adds: localhost:port //指定nacos服务地址
cluster-name: xxx //集群名称,可选
application:
name:xxxx //指定微服务名称
yml将spring boot服务配置到nacos之后,在注册中心即可让其他微服务发现。
DiscoveryClient.getInstances(“微服务名称”)方法可读取注册的服务。
元数据:提供微服务描述信息,使其之间的调用更加灵活
命名空间:只能在同一个空间下互相调用
负载均衡:
多个服务器实例来处理高并发请求。
nginx反向代理可实现服务器端的负载均衡。
客户端的负载均衡:
随机算法,通过list存取的服务器实例,随机取下标进行发送请求。
Ribbon(nacos依赖自动集成):
自动从nacos注册中心获取需要发送请求的服务器地址列表
RestTemplate上添加@LoadBalanced注解整合Ribbon
默认定时更新serverList
Ribbon内置的负载均衡策略:
RandomRule 随机选择
RoundRobinRule 轮询选择请求
等等。。。
粒度细分:代码管理或写配置
代码:配置类上添加@RibbonClient注解(name="微服务名称",configuration = "xxxx.class")
全局配置:@RibbonClients(defaultConfiguration="xxxx.class")
新建的Configuration包需要和spring boot服务在的包同级,该包下面的配置类返回IRule,比如 new RandomRule() 随机选择,同时都需要加上@Configuration注解放入spring容器
PS:这是spring的父子级上下文重叠的一个小坑,不能在服务启动类的包里面创建。
YML配置文件的方式(推荐,同时可以在启动spring boot服务时,通过命令行脚本执行读取外部配置文件的方式,优先级高):
xxxx(微服务名称):
ribbon:
NFLoadBalancerRuleClassName: <规则全路径>
开启Ribbon的饥饿加载:
ribbon:
eager-load:
enabled: true
client: xxxx,xxx
Ribbon实现nacos的权重策略:
写一个配置类,继承Ribbon的抽象类AbstractLoadBalanceRule
实现里面的choose方法,注入nacos的NacosDiscoveryProperties类(使用nacos的权重算法)
远程HTTP调用:
Feign(和Ribbon组合使用):
添加依赖之后,在启动类上添加@EnableFeignClients注解,defaultConfiguration=xxx.class 可指定全局的Feign配置
创建一个FeignClient接口,添加注解 @FeignClient(name = "微服务名称")
接口类实现需要http调用的api,支持springMVC的注解,但是Get请求构造请求参数时需要添加@SpringQueryMap注解或者添加@RequestParam传参
获取其他微服务api数据时,调用Feign接口类提供的方法即可(性能上不如RestTemplate,但是可维护性高)。
Feign日志级别:
默认None
Basic:记录请求方法,URL,状态码,响应时间等(推荐记录)
Headers:增加请求响应头的记录
Full:记录所有日志(性能影响比较大)
创建Feign日志级别时,不要在启动类的包下使用@Configuration注解,只返回Bean即可(父子上下文的问题)
关于Feign的继承,可以共用同一个接口继承公共模块,但项目中并没有使用。
Feign性能优化:
1.配置连接池
使用apache的httpclient,添加feign httpclient依赖,yml配置
feign:
httpclient:
enabled: true //启用连接池,后面加上连接池的具体参数,如最大连接数等等
雪崩效应:
容错方案:
1.设置服务之间调用的超时时间,短时无响应即释放线程,不再等待。
2.给微服务设置限流(QPS)
3.舱壁模式,分配不同独立的线程池进行隔离
4.断路器模式
添加相关依赖整合Sentinel:
下载cloud对应版本的控制台,配置属性文件
消息队列:
异步处理流程
1.@Async注解
2.MQ组件,RocketMQ:
事务管理添加@Transactional注解
生产者-消费者模型
微服务A→生产消息→MQ→消费消息→微服务B
下载安装对应版本的包,然后启动MQ服务以及broker。
添加相关依赖,配置。利用roketMQTemplate类生产消息,其他的MQ组件都是类似的前缀+template类。
定义发送的topic,以及对应需要发送的对象序列化数据。
消费者:实现RocketMqListener接口类的方法,监听发送的消息并处理,监听的topic必须和生产消息的topic一致。
分布式事务:
创建一个MQ的事务日志表,记录本地事务的执行状态等信息,并方便做消息持久化。
生产事务API:roketMQTemplate.sendMessageInTransaction(分组名称,topic名称,消息体,arg) //发送半消息存储
设置header时,可以用一个UUID+业务ID,定义的业务类需要引用MQ的事务接口,并实现里面的方法。
Spring Cloud Stream:管理消息中间件MQ
input:消费者接收 output:生产者发送
给微服务设置Stream:添加依赖后,在生产者启动类添加 @EnableBinding(Source.class) 注解,消费者类默认是Sink.class,添加yml相关配置。
通过Stream注解的header属性可以对消息添加过滤或者写业务代码判断,生产和消费关系的微服务,destination(topic)要匹配一致。
全局异常处理:
@StreamListener("errorChannel")
public void error(Message<?> message) {
ErrorMessage errorMessage = (ErrorMessage) message;
//处理异常消息
}
使用Stream处理MQ消息时,传参的header的value默认会是String类型,需要转JSON传参然后再转回Object使用
Gateway网关:
主要是服务调用的身份认证和权限控制(防火墙功能),路由转发,请求限流。
添加gateway starter依赖,配置yml文件,并且将网关微服务添加到nacos注册中心。
网关路由断言工厂:
过滤器:
对进入网关的请求或响应做处理。
default-filters 默认过滤器,所有微服务适用
过滤器的执行顺序通过order控制,如果出现值一样的情况时,优先级为:defaultFilter→局部路由→全局过滤
跨域请求CORS解决:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话