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解决:

 

posted @   webzd  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示