5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用

news2024/12/28 3:34:16

5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用

文章目录

  • 5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用
  • 前言
  • 1. OpenFeign 介绍
    • 1.1 Feign 和 OpenFeign 区别
  • 2. OpenFeign 应用实例
    • 2.2 注意事项和细节
  • 3. OpenFeign 内置的“日志配置” 操作
    • 3.1 OpenFeign 配置日志-应用实例
  • 4. OpenFeign 超时时间设置操作
  • 5. 补充:spring-boot-starter-actuator 是 spring boot 程序的监控系统,可以实现健康检查
  • 6. 总结:
  • 7. 最后:

前言

  • 对应上一篇学习内容:🌟🌟🌟4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明_ribbon升级到了loadbalancer-CSDN博客
  • 对应下一篇学习内容:🌟🌟🌟

1. OpenFeign 介绍

OpenFeign 是什么 ?

  1. OpenFeign 是个声明式 WebService 客户端,使用 OpenFeign 让编写 Web Service客户端更简单。

  2. 它的使用方法是定义一个服务接口,然后在上面添加注解。

  3. OpenFeign 也支持可插拔式的编码器解码器

  4. Spring Cloud 对 OpenFeign 进行了封装使其支持了 Spring MVC 标注注解 和 HttpMessageConverters

  5. OpenFeign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡。

  6. OpenFeign 官网地址: https://github.com/spring-cloud/spring-cloud-openfeign

简单的说:就是一个 Web Service 客户端访问的,转发的一个组件,可以实现 Server 集群的通信,简化 Web Service 客户端

在这里插入图片描述

1.1 Feign 和 OpenFeign 区别

Feign:

  • Feign 是Spring Cloud 组件中的一个轻量级 RESTful的HTTP服务客户端
  • Feign 内置了Ribbon ,用来做客户端负载均衡,去调用服务注册中心的服务
  • Feign 的使用方式是: 使用Feign的注解定义接口,调用服务注册中心的服务。
  • Feign 支持的注解和用法参考官方文档: https://github.com/OpenFeign/feign
  • Feign 本身不支持Spring MVC的注解 ,它有一套自己的注解,所以大部分市场开发已经不使用 Feign 了。
  • 引入依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

OpenFeign:

  • OpenFeign 是 Spring Cloud 在 Feign的基础上支持了Spring MVC 的注解,如 @RequestMapping等等
  • OpenFeign 的 @FeignClient 可以解析 Spring MVC 的 @RequestMapping 注解下的接口
  • OpenFeign 通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
    引入依赖:
   <!--  引入 openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  • 精简一句话: OpenFeign 就是在 Feign基础上做了加强,有些程序员为了方便,说 Feign 就是OpenFeign

2. OpenFeign 应用实例

需求分析&图解

示意图:

在这里插入图片描述

  1. 创建服务消费模块 - 通过 OpenFeigen 实现远程调用

参考 member-service-consumer-80 创建 member-service-consumer-openfeign-80(具体步 骤参考以前)

在这里插入图片描述

  1. pom.xml 文件当中,导入相关的 jar 依赖。特别是这里:我们的主角openFeign

在这里插入图片描述

  <!--  引入 openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

完整的 pom.xml 文件信息:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>e-commerce-center</artifactId>
        <groupId>com.rainbowsea</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>member-service-consumer-openfeign-80</artifactId>


    <!--    引入相关的依赖:我们引入了当前所需要的依赖,后面如果有其它的需要,再灵活添加-->
    <dependencies>

        <!--  引入 openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--        引入 web-starter 说明:我们使用版本仲裁(从父项目继承了版本)-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--1. starter-actuator 是spring boot 程序的监控系统,可以实现健康检查,info 信息等
         2. 访问http://localhost:80/actuator 可以看到相关链接,还可以做相关配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>


        <!--        lombok 引入-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--        引入 test-starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--        引入我们自己对 bean 封装成 api 的模块内容-->
        <dependency>
            <groupId>com.rainbowsea</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!-- 引入 eureka-client 依赖  -->
        <!--        注意:存在一个 starter 不要选错了-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

</project>
  1. 在 resourse 目录下,创建 application.yml 进行一些相关的配置信息, 内容如下:

在这里插入图片描述

server:
  port: 80
spring:
  application:
    name: member-service-consumer-openfeign-80

# 配置 eureka client 注意,因为这里该模块是作为 client 客户端的角色的,所有要将自己client的信息发送给 Server 当中去的
eureka:
  client:
    register-with-eureka: true # 表示将自己注册到 Eureka-Server 当中
    fetch-registry: true # 表示将信息发送到 Eureka-Server 当中
    service-url:
      # 表示将自己注册到那个 eureka-server
      #      defaultZone: http://localhost:9001/eureka
      # 将本微服务注册到多个 eureka - server 当中,使用逗号间隔即可
      defaultZone: http://eureka9001.com:9001/eureka/,http://eureka9002.com:9002/eureka/

  1. 创建该模块 member-service-consumer-openfeign-80 的主启动类,也就是场景启动器。

在:创建包com.rainbowsea.springcloud ,创建名为 MemberConsumerOpenfeignApplication80的主启动类,如下图所示:

在这里插入图片描述

package com.rainbowsea.springcloud;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient  // 表示作为 Eureka Client 角色
@EnableFeignClients  // 启动 OpenFeignClient
public class MemberConsumerOpenfeignApplication80 {


    public static void main(String[] args) {

        SpringApplication.run(MemberConsumerOpenfeignApplication80.class, args);
    }
}

添加主启动类之后,我们可以测试一下,是否成功将该模块member-service-consumer-openfeign-80 注册到了 Eureka Server 当中去了。

在这里插入图片描述

注意:下面的操作就是:是 OpenFeign 的核心内容了。

  1. 在该member-service-consumer-openfeign-80 模块当中创建一个com.rainbowsea.springcloud.service 包,在该包当中创建一个 MemberFeignService 接口,注意注意是接口interface 不是类。如下图所示:

在这里插入图片描述

package com.rainbowsea.springcloud.service;


import com.rainbowsea.springcloud.entity.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Component
public interface MemberFeignService {


}

然后我们需要将其中,我们 member-service-consumer-openfeign-80 模块是作为 Eureka Client 客户端存在的,这里使用 OpenFeign 简化客户端,我们还需将 ,我们 OpenFeigin(也就是客户端,也就是 Eureka Client ) 想要调用的哪个 provider service(服务器/服务集群) 处理我们的业务,这里我们是服务集群 ,这里我们有两个 privoid service 可以处理我们所需的业务,如下图所受:分别为:

member-service-provider-10000,member-service-provider-10002 这两个服务(这两个服务,是已经相互注册好了,配置为了服务集群了 )

在这里插入图片描述

这里我们在MemberFeignService 接口类上使用 @FeignClient注解标注,我们这个 OpenFeigin(也就是客户端,也就是 Eureka Client ) 想要调用的哪个 provider service(服务器/服务集群) 处理我们的业务。如下图所示:

在这里插入图片描述

package com.rainbowsea.springcloud.service;


import com.rainbowsea.springcloud.entity.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Component
//这里 MEMBER-SERVICE-PROVIDER 就是 Eureka Server 服务提供方注册的名称
@FeignClient(value = "MEMBER-SERVICE-PROVIDER")  // 这个 value 值就是,对应我们想要访问的 provider(提供服务/服务集群)的 name 名称
public interface MemberFeignService {

}

同时我们还需要在 MemberFeignService 接口当中定义一个方法。

注意这个方法,必须必须和你 OpenFeigin(也就是客户端,也就是 Eureka Client ) 想要调用的哪个 provider service(服务器/服务集群) 中的处理对应业务的哪个方法,保持一致(权限修饰符一致,**Http请求方式(包括了所对应的请求映射路径)**一致,参数类型,参数个数一致,返回值类型也是一致的,方法名可以不一致(但强烈建议也保持一致)),所以强烈建议,直接从对应的 provider service 当中复制过来即可。如下图:我们使用的是 getMemberById 根据 id 查询的业务处理。我们只需将其方法名复制过来即可。

在这里插入图片描述

package com.rainbowsea.springcloud.service;


import com.rainbowsea.springcloud.entity.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Component
//这里 MEMBER-SERVICE-PROVIDER 就是 Eureka Server 服务提供方注册的名称
@FeignClient(value = "MEMBER-SERVICE-PROVIDER")  // 这个 value 值就是,对应我们想要访问的 provider(提供服务/服务集群)的 name 名称
public interface MemberFeignService {



    // 注意:这里定义方法-就是远程调用的接口,建议复制过来

    /*
    1.远程调用的方式是get
    2.远程调用的 url http://MEMBER-SERVICE-PROVIDER(注册到服务当中的别名)/member/get/{id}
    3.MEMBER-SERVICE-PROVIDER 就是服务提供方法 Eureka Server 注册的服务
    4. openfeign 会根据负载均衡决定调用 10000/10002 -默认是轮询
    5.因为openfeign 好处是支持了 spring mvc 注解 + 接口解构
    6. 想要使用 OPFeign 需要在对应场景启动器的位置配置上: @EnableFeignClients  // 启动 OpenFeignClient

     */
    @GetMapping("/member/get/{id}")
    Result getMemberById(@PathVariable("id") Long id);


}

最后,我们在当前 member-service-consumer-openfeign-80 模块也就是我们的 OpenFeigin(也就是客户端,也就是 Eureka Client ) 编写控制器,在 com.rainbowsea.springcloud.controller 包下,编写对应的控制器。如下图所示:

在这里插入图片描述

在这里插入图片描述

package com.rainbowsea.springcloud.controller;


import com.rainbowsea.springcloud.entity.Result;
import com.rainbowsea.springcloud.service.MemberFeignService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class MemberConsumerFeignController {

    // 装配MemberFeignService
    @Resource
    private MemberFeignService memberFeignService;

    @GetMapping("/member/consumer/openfeign/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id) {
        // 调用接口中的方法
        return memberFeignService.getMemberById(id);

    }
}

  • 特别说明,因为我们的 OpenFeign 就是一个通过接口+注解的方式作为Eureka Client 客户端,调用其中 Service 服务器
  • Openfeign 的使用的特点:微服务接口+@FeignClient ,使用接口进行解耦(简单的说:就是使用接口调用对应 provider 提供服务的集群)

测试,启动服务器

浏览器输入 : http://localhost/member/consumer/openfeign/get/1

观察访问的 10000/10002 端口的服务是轮询的

在这里插入图片描述

2.2 注意事项和细节

  • @FeignClient(value = "MEMBER-SERVICE-PROVIDER") // 这个 value 值就是,对应我们想要访问的 provider(提供服务/服务集群)的 name 名称 所以:注意不要将提供注册的名称,写错了

在这里插入图片描述

  • 接口方法上的: value 是不能乱写的,远程调用的url为 : 对应你想要调用哪个 provider 名称的别名/名称 http://MEMBER-SERVICE-PROVIDER/member/get/{id};接口上的方法,也必须与调用的 provider 当中的方法保持一致:

在这里插入图片描述

3. OpenFeign 内置的“日志配置” 操作

说明 OpenFeign 提供了日志打印功能,可以通过配置来调整日志级别,从面对 OpenFeign 接口的调用情况进行监控和输出。

日志级别:

  1. NONE: 默认的,不显示任何日志
  2. BASIC: 仅记录请求方式,URL,响应状态码及执行时间
  3. HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息
  4. FULL: 除了HEADERS 中定义的信息之外,还有请求和响应的正文及元数据

常见的日志级别有 5 种,分别是 error、warn、info、debug、trace

  1. error:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的;
  2. warn:警告日志,一般的错误,对业务影响不大,但是需要开发关注;
  3. info:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
  4. debug:用于开发 DEBUG 的,关键逻辑里面的运行时数据;
  5. trace:最详细的信息,一般这些信息只记录到日志文件中。

3.1 OpenFeign 配置日志-应用实例

在member-service-consumer-openfeign-80 创建 com.Rainbowsea.springcloud.config.OpenFeignConfig.java 类

在这里插入图片描述

package com.rainbowsea.springcloud.config;


import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenFeignConfig {


    @Bean
    public Logger.Level loggerLever() {
        // /日志级别指定为 FULL
        return Logger.Level.FULL;
    }
}

member-service-consumer-openfeign-80 模块当中修改 application.yml 进行配置我们是对哪个类进行日志打印信息,以及打印配置的日志信息的级别

在这里插入图片描述


logging:
  level:
    # 对 MemberFeignService 接口调用过程打印信息-Debug
    com.rainbowsea.springcloud.service.MemberFeignService: debug


server:
  port: 80
spring:
  application:
    name: member-service-consumer-openfeign-80

# 配置 eureka client 注意,因为这里该模块是作为 client 客户端的角色的,所有要将自己client的信息发送给 Server 当中去的
eureka:
  client:
    register-with-eureka: true # 表示将自己注册到 Eureka-Server 当中
    fetch-registry: true # 表示将信息发送到 Eureka-Server 当中
    service-url:
      # 表示将自己注册到那个 eureka-server
      #      defaultZone: http://localhost:9001/eureka
      # 将本微服务注册到多个 eureka - server 当中,使用逗号间隔即可
      defaultZone: http://eureka9001.com:9001/eureka/,http://eureka9002.com:9002/eureka/

logging:
  level:
    # 对 MemberFeignService 接口调用过程打印信息-Debug
    com.rainbowsea.springcloud.service.MemberFeignService: debug

测试
浏览器: http://localhost/member/consumer/openfeign/get/1

IDEA 后端查看打印的显示的日志信息:

在这里插入图片描述

4. OpenFeign 超时时间设置操作

OpenFeign 超时: 我们先来看如下一个问题:

我们模拟网络异常,在 member-service-provider-10000member-service-provider-10002 两个 service 服务提供方当中的 getMemberById 方法,模拟超时 ,这里暂停 5秒。

   // 模拟超时 ,这里暂停 5秒
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (Exception e) {
            e.printStackTrace();
        }

在这里插入图片描述

浏览器访问 http://localhost/member/consumer/openfeign/get/1

测试效果:

浏览器显示: Read timed out executing GET http://MEMBER-SERVICE-PROVIDER/member/get/1
IDEA后端显示: java.net.SocketTimeoutException: Read timed out
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.RetryableException: Read timed out executing GET http://MEMBER-SERVICE-PROVIDER/member/get/1] with root cause

在这里插入图片描述

在这里插入图片描述

原因分析: OpenFeign 默认超时时间 1 秒钟 ,即等待返回结果 1 秒,超过了 1 秒,则会报错。

设置超时时间

说明: 在某些情况下,一个服务调用时间可能要超过 1 秒,就需要重新设置超时时间。

这里我们设置超时时间设置为:8秒,而我们模拟的是 5秒,5 秒小于 8 秒,可以还在超时时间的范围内,可以被访问。

对于 OpenFeign 超时时间,我们需要在 application.yaml 文件当中进行配置。 如下图所示:

# OpenFeign 超时
ribbon:
#  #设置 feign 客户端超时时间(openFeign 默认支持 ribbon) #指的是建立连接后从服务器读取到可用资源所用的时间,
#  #时间单位是毫秒
  ReadTimeout: 8000
#  #指的是建立连接所用的时间,适用于网络状况正常的情况下,
#  #两端连接所用的时间
  ConnectTimeout: 8000

在这里插入图片描述

server:
  port: 80
spring:
  application:
    name: member-service-consumer-openfeign-80

# 配置 eureka client 注意,因为这里该模块是作为 client 客户端的角色的,所有要将自己client的信息发送给 Server 当中去的
eureka:
  client:
    register-with-eureka: true # 表示将自己注册到 Eureka-Server 当中
    fetch-registry: true # 表示将信息发送到 Eureka-Server 当中
    service-url:
      # 表示将自己注册到那个 eureka-server
      #      defaultZone: http://localhost:9001/eureka
      # 将本微服务注册到多个 eureka - server 当中,使用逗号间隔即可
      defaultZone: http://eureka9001.com:9001/eureka/,http://eureka9002.com:9002/eureka/

logging:
  level:
    # 对 MemberFeignService 接口调用过程打印信息-Debug
    com.rainbowsea.springcloud.service.MemberFeignService: debug

# OpenFeign 超时
ribbon:
#  #设置 feign 客户端超时时间(openFeign 默认支持 ribbon) #指的是建立连接后从服务器读取到可用资源所用的时间,
#  #时间单位是毫秒
  ReadTimeout: 8000
#  #指的是建立连接所用的时间,适用于网络状况正常的情况下,
#  #两端连接所用的时间
  ConnectTimeout: 8000

浏览器输出: http://localhost/member/consumer/openfeign/get/1, 不会出现超时,会轮询访问 10000/10002

在这里插入图片描述

5. 补充:spring-boot-starter-actuator 是 spring boot 程序的监控系统,可以实现健康检查

当我们在 pom.xml 当中添加了 spring-boot-starter-actuator 的依赖 jar ,就就可以使用该 监控系统了。不需要其他的配置

spring-boot-starter-actuator 是spring boot 程序的监控系统,可以实现健康检查,info 信息等

访问http://localhost:80/actuator 可以看到相关链接,还可以做相关配置。

spring-boot-starter-actuator 访问的语法链接:url地址+自身模块对应的端口号/actuator

在这里插入图片描述

6. 总结:

  1. OpenFeign 是个声明式 WebService 客户端,使用 OpenFeign 让编写 Web Service客户端更简单。
  2. Feign 和 OpenFeign 区别
  3. Openfeign 的使用的特点:微服务接口+@FeignClient ,使用接口进行解耦(简单的说:就是使用接口调用对应 provider 提供服务的集群)
  4. OpenFeign 操作配置的注意事项和细节:
    1. Openfeign 的使用的特点:微服务接口+@FeignClient ,使用接口进行解耦(简单的说:就是使用接口调用对应 provider 提供服务的集群)
    2. 接口方法上的: value 是不能乱写的,远程调用的url为 : 对应你想要调用哪个 provider 名称的别名/名称 http://MEMBER-SERVICE-PROVIDER/member/get/{id};接口上的方法,也必须与调用的 provider 当中的方法保持一致:
  5. OpenFeign 内置的“日志配置”:OpenFeign 提供了日志打印功能,可以通过配置来调整日志级别,从面对 OpenFeign 接口的调用情况进行监控和输出。
  6. OpenFeign 超时时间设置操作
  7. spring-boot-starter-actuator 是 spring boot 程序的监控系统,可以实现健康检查,spring-boot-starter-actuator 是spring boot 程序的监控系统,可以实现健康检查,info 信息等

spring-boot-starter-actuator 访问的语法链接:url地址+自身模块对应的端口号/actuator

7. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos 8, add repo

Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han

指南: 如何在 MEV 项目中使用 Yul

这对我来说是一个反复出现的故事。我学习了一些 Solidity&#xff0c;发现了一个我想要研究的服务。代码看起来是这样的&#xff1a; Seaport Core: BasicOrderFulfiller.sol Solidity 代码在哪里&#xff1f;人们似乎不再使用普通的 Solidity 代码了 &#x1f972; 这种在智能…

web——upload-labs——第十一关——黑名单验证,双写绕过

还是查看源码&#xff0c; $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是&#xff1a;从 $file_name 中去除所有出现在 $deny_ext 数组中的元素&#xff0c;替换为空字符串&#xff08;即删除这些元素&#xff09;。str_ireplace() 在处理时…

北京申请中级职称流程(2024年)

想找个完整详细点的申请流程资料真不容易&#xff0c;做个分享送给需要的人吧。 不清楚为什么说文章过度宣传&#xff0c;把链接和页面去掉了&#xff0c;网上自己找一下。 最好用windows自带的EDGE浏览器打开申请网站&#xff0c;只有在开始申请的时间内才可以进行网上申报&…

Visual Studio 圈复杂度评估

VisualStudio自带的有工具 之后就可以看到分析结果

MySQL UPDATE语句执行链路解析

文章目录 引言1. 总览&#xff1a;UPDATE语句的执行链路2. 客户端发起请求2.1 SQL请求的形成2.2 MySQL通信协议 3. 连接器模块3.1 连接管3.2 会话上下文 4. SQL解析器4.1 语法解析4.2 语法错误处理 5. 查询优化器5.1 查询优化的核心概念5.2 优化器生成执行计划的步骤5.3 优化器…

.net6.0(.net Core)读取 appsettings.json 配置文件

① 新项目中创建名为 appsettings.json 的 json文件&#xff0c;内容为&#xff1a; {//数据库连接字符串:"ConnectionString": {"DBconn": "server127.0.0.1;databasedb;uidsa;pwd123456;Timeout600;EncryptTrue;TrustServerCertificateTrue;"…

[CISCN 2019初赛]Love Math 详细题解

知识点: 数学函数转换字符串 GET传参外部赋值 eval()函数解析执行命令 PHP动态调用函数名 源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (…

湛江市社保卡申领指南:手机获取电子照片回执单号

在湛江市&#xff0c;社保卡的申领流程已经实现了数字化&#xff0c;为市民带来了极大的便利。特别是通过手机获取数码照片回执单号&#xff0c;这一环节更是简化了申领过程。今天&#xff0c;我们将详细介绍如何不去照相馆&#xff0c;利用手机来获取数码照片回执单号&#xf…

第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞

时间轴 演示案例 TP 框架-开发-配置架构&路由&MVC 模型 TP 框架-安全-不安全写法&版本过滤绕过 TP 框架-开发-配置架构&路由&MVC 模型 参考&#xff1a; https://www.kancloud.cn/manual/thinkphp5_1 1、配置架构-导入使用 去thinkphp官网可以看到&…

【自动驾驶】数据集合集!

本文将为您介绍经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 Automatic-driving-Test 更新时间&#xff1a;2024-07-26 访问地址: GitHub 描述&#xff1a; 该模型使用 ultralytics yolo v8 和 deepsort 方法来检测车道与车轮的碰撞并跟踪车辆。…

Leetcode 完全二叉树的节点个数

不讲武德的解法 java 实现 class Solution {public int countNodes(TreeNode root) {if(root null) return 0;return countNodes(root.left) countNodes(root.right) 1;} }根据完全二叉树和满二叉树的性质做 class Solution {public int countNodes(TreeNode root) {if (r…

力扣面试题 - 24 插入

题目&#xff1a; 给定两个整型数字 N 与 M&#xff0c;以及表示比特位置的 i 与 j&#xff08;i < j&#xff0c;且从 0 位开始计算&#xff09;。 编写一种方法&#xff0c;使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域&#xff0c;不足之处用 0 补齐…

Elasticsearch 中的热点以及如何使用 AutoOps 解决它们

作者&#xff1a;来自 Elastic Sachin Frayne 探索 Elasticsearch 中的热点以及如何使用 AutoOps 解决它。 Elasticsearch 集群中出现热点的方式有很多种。有些我们可以控制&#xff0c;比如吵闹的邻居&#xff0c;有些我们控制得较差&#xff0c;比如 Elasticsearch 中的分片分…

Matlab多输入单输出之倾斜手写数字识别

本文主要介绍使用matlab构建多输入单输出的网络架构&#xff0c;来实现倾斜的手写数字识别&#xff0c;使用concatenationLayer来拼接特征&#xff0c;实现网络输入多个特征。 1.加载训练数据 加载数据&#xff1a;手写数字的图像、真实数字标签和数字顺时针旋转的角度。 lo…

Nacos实现IP动态黑白名单过滤

一些恶意用户&#xff08;可能是黑客、爬虫、DDoS 攻击者&#xff09;可能频繁请求服务器资源&#xff0c;导致资源占用过高。因此我们需要一定的手段实时阻止可疑或恶意的用户&#xff0c;减少攻击风险。 本次练习使用到的是Nacos配合布隆过滤器实现动态IP黑白名单过滤 文章…

如何在Word文件中设置水印以及如何禁止修改水印

在日常办公和学习中&#xff0c;我们经常需要在Word文档中设置水印&#xff0c;以保护文件的版权或标明文件的机密性。水印可以是文字形式&#xff0c;也可以是图片形式&#xff0c;能够灵活地适应不同的需求。但仅仅设置水印是不够的&#xff0c;有时我们还需要确保水印不被随…

测试工程师如何在面试中脱颖而出

目录 1.平时工作中是怎么去测的&#xff1f; 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测&#xff1f; 4.你为什么能够做测试这一行&#xff1f;&#xff08;根据个人情况分析理解&#xff09; 5.你认为测试的目的是什么&#xff1f; 6.软件测试的流程&#xff…

jenkins的安装(War包安装)

‌Jenkins是一个开源的持续集成工具&#xff0c;基于Java开发&#xff0c;主要用于监控持续的软件版本发布和测试项目。‌ 它提供了一个开放易用的平台&#xff0c;使软件项目能够实现持续集成。Jenkins的功能包括持续的软件版本发布和测试项目&#xff0c;以及监控外部调用执行…

无线感知会议系列【15】DPSense-2

接&#xff1a; 无线感知会议系列【15】DPSense-1 目录&#xff1a; 实验 讨论 结论 附录 一 实验 在本节中&#xff0c;我们通过全面的实验验证了所提出的DPSense系统的有效性。首先&#xff0c;我们将我们的方法与三种最先进的技术进行了比较。然后&#xff0c…