学习springcloud中的小问题(10.26)

学习springcloud中的小问题(10.26)

全局异常检测

@RestControllerAdvice
  1. 全局异常处理:通过 @ExceptionHandler 注解,你可以定义全局的异常处理方法,这样无论何时Controller中出现异常,都会经过这些方法的处理。

  2. 全局响应处理:你可以自定义全局的响应格式,比如统一的返回结果封装,或者对返回结果进行处理,如日志记录等。

  3. 减少重复代码:在多个Controller中如果有相同的异常处理或响应处理逻辑,可以通过 RestControllerAdvice 类来集中管理,减少代码冗余。

  4. 易于维护:全局的异常处理和响应处理使得代码更加整洁,便于维护和后续扩展。

日志

@Slf4j

Lombok 库中的一个注解,自动生成一个 log 字段

  1. log.debug:用于记录调试级别的日志,通常包含详细的运行信息,这在调试问题时非常有用。

  2. log.error:用于记录错误级别的日志,表示应用程序发生了错误,但还能继续运行。

  3. log.warn:用于记录警告级别的日志,表示有一些意外的事情发生,但应用程序还能正常运行。

  4. log.info:用于记录信息级别的日志,表示应用程序正常运行的一些信息。

  5. log.trace:用于记录跟踪级别的日志,通常包含最详细的执行路径信息,有助于追踪程序的执行流程。

log.error("全局异常信息:{}",e.getMessage(),e);

{}:这是一个普通占位符,用于替换为列表中紧跟其后的参数值。在这个例子中,{} 会被 e.getMessage() 的值替换,所以日志的实际内容将是 "全局异常信息:[异常信息内容]",其中 [异常信息内容]是捕获到的异常的详细信息。

如果你在 {} 中放置了多个占位符,它们将会按照顺序被列表中的相应参数替换。

时间戳

currentTimeMillis() 是一个 Java 方法,它返回自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。这个方法属于 java.util.Date 类和其子类 java.util.Calendar。由于它返回的是一个长整型的毫秒值,所以它可以用来度量时间间隔,或者作为时间戳使用。

RestTemplate

  1. 写一个配置类,将创建的对象交给Spring容器进行管理

  2. 定义一个全局路径

  3. 接口类型(是post还是get),调用对应的RestTemplate方法进行通信

常用方法
  1. getForObject(String url, Class<?> responseType): 发送 GET 请求,并返回一个对象,该对象是响应体的序列化形式。

  2. getForEntity(String url, Class<?> responseType): 发送 GET 请求,并返回一个 ResponseEntity 对象,它包含了响应体和HTTP状态码等信息。

  3. postForObject(String url, Object request, Class<?> responseType): 发送 POST 请求,并返回一个对象,该对象是响应体的序列化形式。

  4. postForEntity(String url, Object request, Class<?> responseType): 发送 POST 请求,并返回一个 ResponseEntity 对象。

  5. put(String url, Object request): 发送 PUT 请求。

  6. delete(String url): 发送 DELETE 请求。

抽取公共方法

每个微服务之间存在公共部分,将其抽取出来,形成一个公共的模块

  1. 创建一个模块,该模块存放着所有微服务相同的类或配置等

  2. 将模块进行mvn打包成jar包

  3. 再需要使用的模块的maven中进行引入

bootstrap.yml

在Spring Cloud应用程序中,通常会有两个主要的配置文件:application.ymlbootstrap.yml

  1. application.yml:这是用户级的资源配置文件,通常用于配置应用程序级别的细节,比如数据库连接、JPA配置、邮件服务器设置等。它的配置内容是用户自定义的,可以根据应用程序的需要进行修改。

  2. bootstrap.yml:这是系统级的配置文件,它优先级更高。bootstrap.yml 用于配置那些需要在应用程序启动时就加载的属性,比如服务注册和发现、API网关配置、安全配置等。这些配置通常是由系统管理员或者运维人员预先设置的,不应该被应用程序的开发者随意修改。

Spring Cloud在初始化应用程序时,会创建两个上下文:Bootstrap ContextApplication ContextBootstrap Context 首先加载,它负责从外部源加载配置属性并解析配置。这些配置属性会被设置到一个共享的 Environment 中。随后,Application Context 会加载,它也会使用这个共享的 Environment。但是,Application Context 的配置属性会覆盖 Bootstrap Context 中相同的属性。

因此,当应用程序需要读取配置时,它会从共享的 Environment 中读取配置属性。如果 application.ymlbootstrap.yml 中有相同的配置项,那么 application.yml 中的配置会覆盖 bootstrap.yml 中的相同配置项。

这种设计允许开发者自定义应用程序级别的配置,同时确保系统级的重要配置不会被随意更改,从而保证了系统的稳定性和安全性。

Feign超时

OpenFeign是一个声明式的、模板化的服务调用组件,它简化了服务之间的调用方式。默认情况下,OpenFeign客户端的超时时间设置是连接超时(connectTimeout)和读超时(readTimeout)各60秒。

  • 连接超时(connectTimeout):指的是OpenFeign客户端与服务端建立连接的时间。如果在指定的时间内无法建立连接,OpenFeign会抛出异常。

  • 读超时(readTimeout):指的是从建立连接到接收到服务端响应的时间。如果在指定的时间内没有接收到响应,OpenFeign会抛出异常。

当服务端处理请求的时间超过这个超时时间时,OpenFeign客户端会认为服务端没有响应,从而抛出超时异常。这个超时时间的设置可以根据实际的业务需求来调整,以确保系统的高效运行。

例如,如果你知道某个服务端的处理时间通常在30秒内,那么你可以将readTimeout设置为30秒,这样如果服务端的响应时间超过30秒,OpenFeign客户端会认为超时并抛出异常。

基于时间的滑动窗口处理超时

在Spring Cloud微服务架构中,timeout-duration 是配置Feign客户端超时时间的参数。这里的配置意味着当Feign客户端发起请求到服务端时,如果服务端处理请求的时间超过了这个超时时间,Feign客户端会抛出超时异常。

然而,在某些情况下,服务端的处理逻辑可能依赖于其他外部服务或者需要进行较复杂的业务计算,这些操作可能需要超过默认的超时时间(比如1秒)。如果Feign客户端的timeout-duration被设置为10秒,而服务端处理逻辑实际需要20秒,那么Feign客户端在等待服务端响应20秒后,仍然会抛出超时异常。

这时候,如果配置了降级逻辑,那么当Feign客户端检测到超时异常时,会执行预先定义好的降级逻辑,而不是直接抛出异常。降级逻辑可以是返回一个默认值、发送通知、记录日志等,以此来保证系统的可用性和稳定性。

所以,当配置了降级逻辑后,即使Feign客户端的timeout-duration设置得比服务端实际处理时间长,当超时异常发生时,系统也会按照降级逻辑来处理,而不是直接抛出异常。这种设计可以提高系统的鲁棒性和容错性,允许服务端有更多的时间来处理请求。

猜你喜欢

转载自blog.csdn.net/m0_62261710/article/details/143253478