Feign:简化微服务通信的利器

介绍

1.1 什么是 Feign?

Feign 是一个声明式、模板化的 HTTP 客户端,它简化了编写 Web 服务客户端的过程。它的主要目的是使 HTTP API 客户端的开发变得更加简单和直观。Feign 的设计理念是将 HTTP 客户端的细节隐藏在背后,使开发者可以专注于定义与服务端通信的接口而无需关注底层的实现细节。

1.2 Feign 的历史

Feign 最初是由 Netflix 开发的,在其开源的微服务框架中扮演了重要角色。Netflix 在构建其微服务架构时,意识到开发人员经常需要与其他服务进行通信,因此需要一种简单且易于使用的方式来完成这一任务。这就促成了 Feign 的诞生。随着微服务架构的兴起,Feign 逐渐受到了更多开发者的关注和应用,并成为了构建分布式系统的重要工具之一。

1.3 Feign 的优势

Feign 的优势体现在以下几个方面:

  • 声明式 API 定义:Feign 允许开发者使用简单的接口和注解来定义客户端与服务端的通信协议,而无需编写复杂的 HTTP 请求代码。

  • 与 Spring Cloud 集成:Feign 可与 Spring Cloud 集成,使得在基于 Spring Cloud 的微服务架构中更加容易实现服务间的通信。

  • 负载均衡和服务发现:Feign 集成了负载均衡和服务发现功能,使得开发者可以轻松地实现对服务实例的动态调用和负载均衡。

  • 支持多种编码器和解码器:Feign 支持多种编码器和解码器,包括 JSON、XML 等,使得开发者可以根据实际需求选择合适的数据格式。

  • 可定制性和扩展性:Feign 提供了丰富的扩展点和定制选项,开发者可以根据需要定制 Feign 的行为,满足各种复杂场景下的需求。

Feign 的这些优势使得它成为了开发者首选的 HTTP 客户端工具之一,尤其在构建基于微服务架构的应用程序时更是如此。

为什么选择 Feign?

2.1 简化 HTTP 客户端调用

使用传统的方式编写 HTTP 客户端代码通常涉及创建连接、构造请求、处理响应等繁琐的步骤,而 Feign 的声明式 API 定义能够极大地简化这个过程。通过定义接口和使用注解,开发者可以轻松地描述服务端的 HTTP API,而无需关心底层的 HTTP 请求细节。这种声明式的风格使得代码更加清晰、易于理解和维护。

2.2 集成了负载均衡和服务发现

在微服务架构中,服务实例的动态变化和负载均衡是常见的需求。Feign 与服务发现组件(如 Netflix Eureka)集成,能够自动地发现服务实例并实现负载均衡。开发者无需手动管理服务实例列表,Feign 会自动处理这些细节,使得调用服务变得更加简单和可靠。

2.3 支持多种编码器和解码器

Feign 提供了对多种数据格式的支持,包括 JSON、XML 等。开发者可以根据实际需求选择合适的编码器和解码器,使得客户端和服务端能够以最合适的数据格式进行通信。这种灵活性使得 Feign 能够适用于各种不同的场景,满足不同项目的需求。

2.4 可定制性和扩展性

Feign 提供了丰富的扩展点和定制选项,开发者可以根据需要对其行为进行定制和扩展。例如,可以通过自定义拦截器来实现请求和响应的日志记录、实现超时和重试机制、实现自定义的错误处理逻辑等。这种可定制性和扩展性使得 Feign 能够满足各种复杂场景下的需求,同时也为其在开发中的应用提供了更大的灵活性和可塑性。

如何使用 Feign

3.1 引入 Feign 依赖

首先,需要在项目的依赖管理文件中引入 Feign 的相关依赖。如果是基于 Maven 进行项目管理,可以在 pom.xml 文件中添加如下依赖:

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

这个依赖将会引入 Spring Cloud 对 Feign 的集成支持,以及 Feign 本身所需要的核心库。

3.2 创建 Feign 接口

接下来,需要创建一个接口来定义 Feign 客户端的调用方式。这个接口应该使用 Feign 提供的注解来描述服务端的 HTTP API。例如:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(name = "example-service")
public interface ExampleFeignClient {@GetMapping("/example")String getExampleData();
}

在这个示例中,@FeignClient 注解用于指定要调用的服务的名称,@GetMapping 注解用于指定要调用的具体 HTTP API。开发者可以根据实际情况自定义接口和注解。

3.3 注解说明

Feign 提供了一系列注解来描述服务端的 HTTP API,常用的注解包括:

  • @FeignClient:指定要调用的服务的名称,并可指定其他属性,如 URL、fallback 等。
  • @RequestMapping@GetMapping@PostMapping 等:用于指定要调用的具体 HTTP 方法和路径。
  • @RequestParam@PathVariable@RequestBody 等:用于指定请求参数的来源和格式。

这些注解使得开发者可以通过简单的方式描述服务端的 HTTP API,而无需编写复杂的 HTTP 请求代码。

3.4 自定义 Feign 配置

Feign 提供了丰富的配置选项,开发者可以通过配置文件或代码的方式来自定义 Feign 的行为。例如,可以配置连接超时时间、读取超时时间、重试次数等。自定义 Feign 配置通常有以下几种方式:

  • 使用 application.propertiesapplication.yml 文件配置默认的 Feign 属性。
  • 创建一个配置类,并使用 @Configuration 注解和 @Bean 注解来配置 Feign 的属性。
  • 使用 @FeignClient 注解的 configuration 属性来指定一个配置类。

通过自定义 Feign 配置,开发者可以根据实际需求来调整 Feign 的行为,使得其能够更好地适应项目的特定场景和需求。

简单应用

4.1 基本使用示例

下面是一个简单的基本使用示例,演示了如何使用 Feign 客户端调用远程服务的 HTTP API。

首先,定义一个 Feign 接口:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(name = "example-service")
public interface ExampleFeignClient {@GetMapping("/example")String getExampleData();
}

然后,在你的业务代码中注入并使用这个 Feign 客户端:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class ExampleService {@Autowiredprivate ExampleFeignClient exampleFeignClient;public String fetchDataFromRemoteService() {return exampleFeignClient.getExampleData();}
}

4.2 与 Spring Cloud 集成示例

在 Spring Cloud 中使用 Feign 可以更轻松地实现微服务间的通信。下面是一个示例,演示了如何在 Spring Cloud 中使用 Feign 客户端。

首先,确保你的 Spring Boot 应用程序已经添加了 Spring Cloud 的依赖,并且服务注册中心(如 Eureka)已经启用。

然后,定义一个 Feign 接口:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(name = "example-service")
public interface ExampleFeignClient {@GetMapping("/example")String getExampleData();
}

最后,在你的业务代码中注入并使用这个 Feign 客户端,与之前的示例相似。

4.3 与 Spring Boot 集成示例

除了与 Spring Cloud 集成外,Feign 也可以与普通的 Spring Boot 应用程序集成。下面是一个示例,演示了如何在 Spring Boot 中使用 Feign 客户端。

首先,添加 Spring Cloud OpenFeign 的依赖:

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

然后,定义一个 Feign 接口:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(name = "example-service")
public interface ExampleFeignClient {@GetMapping("/example")String getExampleData();
}

最后,在你的 Spring Boot 应用程序中注入并使用这个 Feign 客户端,与之前的示例相似。

这些示例展示了 Feign 在不同场景下的使用方式,无论是基本的 HTTP 客户端调用还是与 Spring Cloud 或 Spring Boot 的集成,Feign 都能够简化服务间的通信,提高开发效率。

常见问题和解决方案

5.1 如何处理 Feign 的超时

Feign 提供了超时设置的配置选项,可以通过配置文件或代码来设置 Feign 的连接超时时间和读取超时时间。以下是一种常见的处理超时的方法:

配置文件方式:

application.propertiesapplication.yml 文件中添加如下配置:

# 设置连接超时时间(单位:毫秒)
feign.client.config.default.connectTimeout=5000
# 设置读取超时时间(单位:毫秒)
feign.client.config.default.readTimeout=5000
代码方式:

创建一个配置类,使用 @Configuration 注解和 @Bean 注解来配置 Feign 的属性:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import feign.Request;@Configuration
public class FeignConfiguration {@Beanpublic Request.Options options() {return new Request.Options(5000, 5000);}
}

通过配置连接超时时间和读取超时时间,可以有效地处理 Feign 的超时问题。

5.2 如何处理 Feign 的重试

Feign 默认不支持重试机制,但可以通过集成 Spring Retry 或者使用自定义的重试机制来实现重试功能。以下是一种常见的处理重试的方法:

集成 Spring Retry:

首先,确保你的项目中已经添加了 Spring Retry 的依赖:

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId>
</dependency>

然后,创建一个重试配置类:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.annotation.EnableRetry;@EnableRetry
@Configuration
public class RetryConfiguration {}

最后,在 Feign 接口的方法上使用 @Retryable 注解来标记需要重试的方法,可以指定重试的次数和延迟时间。

5.3 如何处理 Feign 的请求和响应日志

Feign 提供了日志打印的功能,可以通过配置来开启请求和响应的日志记录。以下是一种常见的处理请求和响应日志的方法:

配置文件方式:

application.propertiesapplication.yml 文件中添加如下配置:

# 开启 Feign 的请求和响应日志记录
logging.level.feign=DEBUG
代码方式:

创建一个配置类,使用 @Configuration 注解来配置 Feign 的日志级别:

import org.springframework.context.annotation.Configuration;import feign.Logger;@Configuration
public class FeignLoggingConfiguration {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL; // 设置日志级别为 FULL}
}

通过配置日志级别为 FULL,可以记录 Feign 的详细请求和响应日志,方便排查和分析问题。

进阶主题

6.1 使用拦截器定制 Feign 客户端行为

Feign 提供了拦截器(Interceptor)的机制,可以在请求发出前和响应返回后对请求和响应进行处理。通过自定义拦截器,可以实现对 Feign 客户端行为的定制。以下是一种常见的使用拦截器定制 Feign 客户端行为的方法:

首先,创建一个拦截器类,实现 feign.RequestInterceptor 接口:

import feign.RequestInterceptor;
import feign.RequestTemplate;public class CustomFeignInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {// 在请求发出前对请求进行处理// 可以添加请求头、修改请求参数等// 示例:添加一个自定义的请求头template.header("Custom-Header", "value");}
}

然后,在 Feign 接口上使用 @FeignClient 注解的 configuration 属性来指定使用的拦截器类:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FeignConfiguration {@Beanpublic CustomFeignInterceptor customFeignInterceptor() {return new CustomFeignInterceptor();}
}

通过自定义拦截器,可以实现对 Feign 客户端行为的灵活定制,满足各种特定的需求。

6.2 使用 Feign 的 Hystrix 容错机制

在微服务架构中,服务之间的调用可能会存在不稳定因素,如网络延迟、服务故障等。为了提高系统的稳定性和容错能力,Feign 提供了与 Hystrix 的集成支持,可以在调用远程服务时使用 Hystrix 进行容错处理。以下是一种常见的使用 Feign 的 Hystrix 容错机制的方法:

首先,确保你的项目中已经添加了 Hystrix 的依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

然后,在 Feign 接口上使用 @FeignClient 注解的 fallback 属性来指定一个容错处理类:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(name = "example-service", fallback = ExampleFeignClientFallback.class)
public interface ExampleFeignClient {@GetMapping("/example")String getExampleData();
}

最后,创建一个容错处理类,实现 Feign 接口的备用逻辑:

import org.springframework.stereotype.Component;@Component
public class ExampleFeignClientFallback implements ExampleFeignClient {@Overridepublic String getExampleData() {return "Fallback Data"; // 返回备用数据}
}

通过使用 Feign 的 Hystrix 容错机制,可以实现对远程服务调用的容错处理,提高系统的稳定性和可靠性。

6.3 使用 Feign 的断路器

Feign 的断路器功能是通过集成 Hystrix 实现的,它可以在远程服务调用失败时快速失败,避免资源的长时间占用,从而保护系统的稳定性。以下是一种常见的使用 Feign 的断路器的方法:

首先,确保你的项目中已经添加了 Hystrix 的依赖,如前面介绍的那样。

然后,在 Feign 接口上使用 @FeignClient 注解的 fallbackFactory 属性来指定一个断路器工厂类:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(name = "example-service", fallbackFactory = ExampleFeignClientFallbackFactory.class)
public interface ExampleFeignClient {@GetMapping("/example")String getExampleData();
}

最后,创建一个断路器工厂类,用于创建断路器实例:

import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;@Component
public class ExampleFeignClientFallbackFactory implements FallbackFactory<ExampleFeignClient> {@Overridepublic ExampleFeignClient create(Throwable throwable) {return new ExampleFeignClient() {@Overridepublic String getExampleData() {return "Fallback Data"; // 返回备用数据}};}
}

通过使用 Feign 的断路器,可以在远程服务调用失败时快速失败,并返回备用数据,保护系统的稳定性和可靠性。

与其它 HTTP 客户端对比

7.1 Feign vs. RestTemplate

Feign:

  • 声明式 API 定义: Feign 允许使用简单的接口和注解来定义客户端与服务端的通信协议,而无需编写复杂的 HTTP 请求代码。

  • 集成了负载均衡和服务发现: Feign 集成了负载均衡和服务发现功能,使得调用服务变得更加简单和可靠。

  • 与 Spring Cloud 集成: Feign 能够轻松地与 Spring Cloud 集成,使得在基于 Spring Cloud 的微服务架构中更加容易实现服务间的通信。

RestTemplate:

  • 传统的 HTTP 客户端: RestTemplate 是 Spring 提供的传统的 HTTP 客户端工具,需要手动构造 HTTP 请求和处理响应。

  • 缺乏声明式 API: RestTemplate 缺乏声明式的 API 定义,开发者需要手动构造 HTTP 请求和处理响应,代码相对冗长且不直观。

  • 功能较为单一: RestTemplate 主要用于发送 HTTP 请求和处理响应,功能相对较为单一,不支持负载均衡和服务发现等功能。

在选择使用 Feign 还是 RestTemplate 时,如果你希望简化 HTTP 客户端调用、与 Spring Cloud 集成、支持负载均衡和服务发现等功能,那么可以选择使用 Feign。如果你更喜欢传统的方式编写 HTTP 客户端代码,或者项目中不需要使用负载均衡和服务发现等功能,那么可以选择使用 RestTemplate。

7.2 Feign vs. WebClient

Feign:

  • 声明式 API 定义: Feign 允许使用简单的接口和注解来定义客户端与服务端的通信协议,代码更加简洁清晰。

  • 集成了负载均衡和服务发现: Feign 集成了负载均衡和服务发现功能,使得调用服务变得更加简单和可靠。

  • 依赖于 Spring Cloud: Feign 依赖于 Spring Cloud,需要与 Spring Cloud 集成使用。

WebClient:

  • 非阻塞、响应式: WebClient 是 Spring WebFlux 提供的非阻塞、响应式的 HTTP 客户端,适用于构建响应式应用程序。

  • 更灵活: WebClient 提供了更灵活的 API,可以支持更多复杂的场景,如流式数据处理等。

  • 更适用于响应式应用: WebClient 更适用于构建响应式应用程序,可以处理大量的并发请求。

在选择使用 Feign 还是 WebClient 时,如果你正在构建响应式应用程序,或者需要处理大量的并发请求,那么可以选择使用 WebClient。如果你更喜欢声明式的 API 定义、与 Spring Cloud 集成、以及使用简单的 HTTP 客户端,那么可以选择使用 Feign。

7.3 Feign vs. HttpClient

Feign:

  • 声明式 API 定义: Feign 允许使用简单的接口和注解来定义客户端与服务端的通信协议,代码更加简洁清晰。

  • 集成了负载均衡和服务发现: Feign 集成了负载均衡和服务发现功能,使得调用服务变得更加简单和可靠。

  • 依赖于 Spring Cloud: Feign 依赖于 Spring Cloud,需要与 Spring Cloud 集成使用。

HttpClient:

  • 原生 HTTP 客户端: HttpClient 是 Java 标准库中的原生 HTTP 客户端,可以灵活地处理各种 HTTP 请求和响应。

  • 更灵活、更强大: HttpClient 提供了更灵活、更强大的 API,可以处理各种复杂的 HTTP 场景,如连接池管理、代理设置、身份认证等。

  • 独立于任何框架: HttpClient 是独立于任何框架的原生 HTTP 客户端,可以在任何 Java 应用程序中使用。

在选择使用 Feign 还是 HttpClient 时,如果你更喜欢声明式的 API 定义、与 Spring Cloud 集成、以及使用简单的 HTTP 客户端,那么可以选择使用 Feign。如果你需要更灵活、更强大的 HTTP 客户端,并且不依赖于任何框架,那么可以选择使用 HttpClient。

结语

在今天的信息时代,构建稳健、高效的网络应用程序至关重要。选择合适的工具和技术对于项目的成功至关重要。本文对于 Feign 这一现代化的 HTTP 客户端工具进行了全面的介绍和分析,并与其他常见的 HTTP 客户端进行了比较。无论是简化的声明式 API 定义、与 Spring Cloud 集成的便捷性,还是灵活的定制性和强大的扩展性,Feign 在构建分布式系统和微服务架构中都扮演着重要的角色。

希望本文能够帮助读者更好地理解 Feign,并为选择合适的 HTTP 客户端工具提供一些参考。在日益复杂的网络环境中,选择适合项目需求的工具和技术,是项目成功的关键之一。

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

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

相关文章

ai智能语音机器人在电销里发挥怎样的作用

得益于语音识别技术的的进步&#xff0c;人工智能发展越来越成熟。相信作为企业的管理者&#xff0c;都遇到过这样的事&#xff1a;一个电销新人刚刚入行&#xff0c;需求经过一两个月的学习培训才能成为一名合格的销售人员。在这段学习的期间&#xff0c;企业投入的成本是没有…

使用 Selenium 获取 Web 页面信息的全指南

目录 为什么使用 Selenium 获取页面信息Selenium 基础设置获取页面标题获取当前 URL获取页面源代码获取元素的文本获取元素的属性获取 Cookie截图示例代码总结 正文 1. 为什么使用 Selenium 获取页面信息 在 Web 自动化测试和数据抓取中&#xff0c;获取页面信息是一个基本…

来聊聊nacos

先关注下下方公众号呗&#xff1a; 第1部分&#xff1a;引言 微服务的挑战 尽管微服务架构带来了许多好处&#xff0c;如敏捷性、可扩展性和容错性&#xff0c;但它也带来了一些挑战&#xff0c;特别是在服务发现、配置管理、服务间通信和运维管理方面。这些挑战需要有效的解…

opencv 图像的缩放(放大,缩小),翻转与旋转

目录 opencv 图像的缩放(放大&#xff0c;缩小)&#xff0c;翻转&#xff0c;旋转1、图像的缩放&#xff0c;旋转过程中为什么需要插值&#xff1a;2、常见的插值算法包括&#xff1a;3、图像的缩放&#xff0c;翻转&#xff0c;旋转&#xff1a;&#xff08;1&#xff09;图像…

混凝土搅拌站中的智能化系统应用

随着科技的飞速发展&#xff0c;混凝土搅拌站已经进入了现代化、智能化的新时代。现代自动化、智能化技术的应用&#xff0c;使得混凝土搅拌站更加高效、准确、可靠&#xff0c;同时也提高了生产效率和质量。本文将带你深入探索混凝土搅拌站中运用到现代自动化、智能化的方方面…

Java代码基础算法练习-删除有序数组中的重复项-2024.05.07

任务描述&#xff1a; 有一批同学需要计算各自的出生年月是否闰年。请使用算法计算出他们的出生年份是否闰年。 解决思路&#xff1a; 如果要一次性输出结果&#xff0c;就是先输入数字n&#xff0c;确定首先循环几次&#xff0c;在每次循环中进行闰年判断操作&#xff0c;每次…

国外的Claude3.5 Sonnet Artifacts和国内的CodeFlying孰强孰弱?

在Claude 3.5 Sonnet发布后&#xff0c;最受大家关注的问题应该就是它在编写代码能力上的变化。 要知道在Claude3.0发布以来的这几个月就因为它的编写代码能力而一直受到人们的诟病。 那Anthropic这次终于是不负众望&#xff0c;在Claude 3.5 Sonnet中更新了一个叫做Artifact…

【STM32】SysTick系统滴答定时器

1.SysTick简介 CM4内核的处理和CM3一样&#xff0c;内部都包含了一个SysTick定时器&#xff0c;SysTick 是一个24 位的倒计数定时器&#xff0c;当计到0 时 &#xff0c;将 从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除&#xf…

使用阿里云效API操作流水线

使用阿里云效&#xff08;Alibaba Cloud DevOps&#xff09;API操作流水线时&#xff0c;需要注意以下几个方面&#xff1a; 认证与授权 确保你已经获取了正确的访问凭证&#xff08;AccessKey ID 和 AccessKey Secret&#xff09;&#xff0c;并且这些凭证具有足够的权限来执行…

优维“统一开放平台”:开放、开发、集成、客制化

基于丰富完善的产品体系&#xff0c;优维重磅推出了统一开放平台。这款由优维自主设计与研发&#xff0c;集数据开发、能力开放、能力集成、客制化为一体的统一开放平台&#xff0c;具备应用市场、应用开发、连接能力、采控平台、API集市、开发者工具等功能模块&#xff0c;可为…

探索MySQL的执行奥秘:从查询执行到数据存储与优化的深入解析

MySQL是一个功能强大且广泛应用的关系数据库管理系统。理解MySQL的执行机制、优化策略以及数据存储方式&#xff0c;对于数据库开发和管理至关重要。本文将详细解析这些内容&#xff0c;通过具体实例和实用建议&#xff0c;帮助读者深入掌握MySQL的高级特性。 一、MySQL的执行…

【RNN练习】LSTM-火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前期准备工作 import torch.nn.functional as F import numpy as np import pandas as pd import torch from torch import nn1. 导入数据 data pd.read_cs…

Linux中信号的机制

在操作系统中,信号是一种软件中断,用于通知进程某个事件已经发生。信号可以分为两大类:同步信号和异步信号。 同步信号(Synchronous Signals) 同步信号通常是由于进程执行中的异常情况引起的,比如违反内存访问规则(段错误),执行非法指令(非法指令),或其他导致核心…

LLM大模型实战 —— DB-GPT阿里云部署指南

简介&#xff1a; DB-GPT 是一个实验性的开源应用&#xff0c;它基于FastChat&#xff0c;并使用vicuna-13b作为基础模型, 模型与数据全部本地化部署, 绝对保障数据的隐私安全。 同时此GPT项目可以直接本地部署连接到私有数据库, 进行私有数据处理&#xff0c; 目前已支持SQL生…

慌慌张张,匆匆忙忙,又是学习的一天

今天学进程 进程的状态 &#xff08;本科的考点我记得哈哈&#xff09; 什么是线程 线程的状态 线程和进程的区别 一个共享 一个私有 独立 多线程的优缺点 线程的分类 内核支持线程 用户级线程 组合方式线程 协程coroutine 进程 分配资源的最小单位 线程 是cpu调度的最小…

Spring AI之后,阿里推出Spring Cloud Alibaba AI,接入体验篇——Java也能方便用 AI

阿里推出Spring Cloud Alibaba AI&#xff0c;接入体验篇——Java也能方便用 AI 1.Spring AI2.Spring Cloud Alibaba AI3. 接入体验 1.Spring AI Spring AI 是 Spring 官方社区项目&#xff0c;旨在简化 Java AI 应用程序开发&#xff0c;让 Java 开发者像使用 Spring 开发普通…

NSSCTF-Web题目18(反序列化)

目录 [NISACTF 2022]babyserialize 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]ez_ez_unserialize 4、题目 5、知识点 6、思路 [NISACTF 2022]babyserialize 1、题目 2、知识点 反序列化、绕过过滤、命令执行 3、思路 <?php include "waf.php";…

基于Vue,mysql,JavaEE的简单投票与投票管理系统

项目介绍 ​ 本项目&#xff0c;基于Vue2.6,mysql,JavaEE 实现简单的投票与投票管理系统 项目地址 VotingSystem: 投票系统1.0 管理员和普通用户 (gitee.com) 有问题请评论私聊哦 项目分类 数据库 创建投票人&#xff0c;被投票人&#xff0c;投票关系&#xff08;追踪谁…

float8格式

产生背景 在人工智能神经元网络中&#xff0c;一个参数用1字节表示即可&#xff0c;或者说&#xff0c;这是个猜想&#xff1a;因为图像的颜色用8比特表示就够了&#xff0c;所以说&#xff0c;猜想神经元的区分度应该小于256。 数字的分配 8比特有256个码位&#xff0c;分为…

图论学习 c++长方体嵌套问题

一个长&#xff0c;宽&#xff0c;高为X1&#xff0c;X2&#xff0c;X3的长方体之中算法可以存放一个长&#xff0c;宽&#xff0c;高Y1&#xff0c;Y2&#xff0c;Y3的长方体。备注两个长方体都可以旋转&#xff0c;下面是一个C程序&#xff0c;用于确定一个长方体是否可以放入…