【SpringCloud】优雅实现远程调用 - OpenFeign

news2024/9/27 7:25:19

目录

  • 优雅实现远程调用-OpenFeign
    • RestTemplate存在问题
    • OpenFeign介绍
      • Spring Cloud Feign
    • 快速上手
      • 引入依赖
      • 添加注解
      • 编写OpenFeign的客户端
      • 远程调用
      • 测试
    • OpenFeign参数传递
      • 传递单个参数
      • 传递多个参数
      • 传递对象
      • 传递JSON
    • 最佳实践
      • Feign 继承方式
        • 创建⼀个Module
        • 引入依赖
        • 编写接口
        • 打Jar包
        • 服务提供方
        • 服务消费方
        • 测试
      • Feign 抽取方式
        • 创建⼀个module
        • 引入依赖
        • 编写API
        • 打Jar包
        • 服务消费方使用product-api
        • 测试
    • 服务部署


优雅实现远程调用-OpenFeign

RestTemplate存在问题

观察我们远程调⽤的代码

public OrderInfo selectOrderById(Integer orderId) {
    OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
    String url = "http://product-service/product/" + orderInfo.getProductId();
    ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
    orderInfo.setProductInfo(productInfo);
    return orderInfo;
}

虽说RestTemplate 对HTTP封装后, 已经⽐直接使⽤HTTPClient简单⽅便很多, 但是还存在⼀些问题.

  1. 需要拼接URL, 灵活性⾼, 但是封装臃肿, URL复杂时, 容易出错.
  2. 代码可读性差, ⻛格不统⼀.

微服务之间的通信⽅式, 通常有两种: RPC 和 HTTP.

在SpringCloud中, 默认是使⽤HTTP来进⾏微服务的通信, 最常⽤的实现形式有两种:

  • RestTemplate
  • OpenFeign

RPC(Remote Procedure Call)远程过程调⽤,是⼀种通过⽹络从远程计算机上请求服务,⽽不需要了解底层⽹络通信细节。RPC可以使⽤多种⽹络协议进⾏通信, 如HTTP、TCP、UDP等, 并且在TCP/IP⽹络四层模型中跨越了传输层和应⽤层。简⾔之RPC就是像调⽤本地⽅法⼀样调⽤远程⽅法。

常⻅的RPC框架有:

  1. Dubbo: Apache Dubbo 中⽂
  2. Thrift : Apache Thrift - Home
  3. gRPC: gRPC

OpenFeign介绍

OpenFeign 是⼀个声明式的 Web Service 客⼾端. 它让微服务之间的调⽤变得更简单, 类似controller调⽤service, 只需要创建⼀个接⼝,然后添加注解即可使⽤OpenFeign.

OpenFeign 的前⾝

Feign 是 Netflix 公司开源的⼀个组件.

  • 2013年6⽉, Netflix发布 Feign的第⼀个版本 1.0.0

  • 2016年7⽉, Netflix发布Feign的最后⼀个版本 8.18.0

    2016年,Netflix 将 Feign 捐献给社区

  • 2016年7⽉ OpenFeign 的⾸个版本 9.0.0 发布,之后⼀直持续发布到现在.

可以简单理解为 Netflix Feign 是OpenFeign的祖先, 或者说OpenFeign 是Netflix Feign的升级版.

OpenFeign 是Feign的⼀个更强⼤更灵活的实现.

我们现在⽹络上看到的⽂章, 或者公司使⽤的Feign, ⼤多都是OpenFeign.

后续讲的Feign, 指的是OpenFeign

Spring Cloud Feign

Spring Cloud Feign 是 Spring 对 Feign 的封装, 将 Feign 项⽬集成到 Spring Cloud ⽣态系统中.

Feign 更名影响,Spring Cloud Feign 也有两个 starter

  • spring-cloud-starter-feign
  • spring-cloud-starter-openfeign

由于Feign的停更维护, 对应的, 我们使⽤的依赖是 spring-cloud-starter-openfeign

OpenFeign 官⽅⽂档: GitHub - OpenFeign/feign: Feign makes writing java http clients easier

Spring Cloud Feign⽂档: Spring Cloud OpenFeign

快速上手

因为 Feign 的学习是基于 Nacos 的代码进行开发的,因此复制 spring-cloud-nacos 项目为 spring-cloud-feign,记得修改对应的 pom.xml 文件

引入依赖

在 order-service 中

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

添加注解

在order-service的启动类添加注解 @EnableFeignClients , 开启OpenFeign的功能.

@EnableFeignClients
@SpringBootApplication
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

编写OpenFeign的客户端

基于SpringMVC的注解来声明远程调⽤的信息

在 api 包下

@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {

    @RequestMapping("/{productId}")
    ProductInfo getProductById(@PathVariable("productId") Integer productId);
}

@FeignClient 注解作⽤在接⼝上, 参数说明:

  • name/value:指定FeignClient的名称, 也就是微服务的名称, ⽤于服务发现, Feign底层会使⽤Spring Cloud LoadBalance进⾏负载均衡. 也可以使⽤ url 属性指定⼀个具体的url.
  • path: 定义当前FeignClient的统⼀前缀.

远程调用

修改远程调⽤的⽅法

@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private ProductApi productApi;

    /**
     * Feign实现远程调用
     */
    public OrderInfo selectOrderById(Integer orderId) {
        OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
        ProductInfo productInfo = productApi.getProductById(orderInfo.getProductId());
        orderInfo.setProductInfo(productInfo);
        return orderInfo;
    }
}

测试

启动服务, 访问接⼝, 测试远程调⽤:

http://127.0.0.1:8080/order/1

可以看出来, 使⽤Feign也可以实现远程调⽤.

Feign 简化了与HTTP服务交互的过程, 把REST客⼾端的定义转换为Java接⼝, 并通过注解的⽅式来声明请求参数,请求⽅式等信息, 使远程调⽤更加⽅便和间接.

OpenFeign参数传递

通过观察, 我们也可以发现, Feign的客⼾端和服务提供者的接⼝声明⾮常相似

上⾯例⼦中, 演⽰了Feign 从URL中获取参数, 接下来演⽰下Feign参数传递的其他⽅式

只做代码演⽰, 不做功能

传递单个参数

服务提供⽅ product-service

@RequestMapping("/product")
@RestController
public class ProductController {

    @RequestMapping("/p1")
    public String p1(Integer id){
        return "p1接收到参数:" + id;
    }
}

Feign客⼾端

@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {

    @RequestMapping("/p1")
    String p1(@RequestParam("id") Integer id);
}

注意: @RequestParam 做参数绑定,会将请求中的 id 的参数值绑定到方法的 id 变量,不能省略

服务消费⽅ order-service

@RequestMapping("/feign")
@RestController
public class TestFeignController {

    @Autowired
    private ProductApi productApi;

    @RequestMapping("/o1")
    public String o1(Integer id){
        return productApi.p1(id);
    }
}

测试远程调⽤

http://127.0.0.1:8080/feign/o1?id=5

调用流程

  1. 服务消费方 (order-service):通过TestFeignController类的o1方法发起HTTP请求。
  2. Feign客户端 (ProductApi)o1方法调用ProductApi接口的p1方法,将参数id传递给product-service
  3. 服务提供方 (product-service)ProductController类的p1方法接收请求,处理参数并返回结果。

调用流程解析

  1. 服务消费方:通过HTTP请求调用本地控制器(如TestFeignController),触发相应方法。
  2. Feign客户端:本地控制器方法调用Feign客户端接口方法,将参数传递给远程服务。
  3. 服务提供方:远程服务接收请求,处理传递的参数,执行相应逻辑并返回结果。

传递多个参数

使⽤多个 @RequestParam 进⾏参数绑定即可

服务提供⽅ product-service

@RequestMapping("/product")
@RestController
public class ProductController {

    @RequestMapping("/p2")
    public String p2(Integer id, String name){
        return "p2接收到参数,id:" + id + ",name:" + name;
    }
}

Feign客⼾端

@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {

    @RequestMapping("/p2")
    String p2(@RequestParam("id") Integer id, @RequestParam("name") String name);
}

服务消费⽅ order-service

@RequestMapping("/feign")
@RestController
public class TestFeignController {

    @Autowired
    private ProductApi productApi;

    @RequestMapping("/o2")
    public String o2(@RequestParam("id") Integer id, @RequestParam("name") String name){
        return productApi.p2(id, name);
    }
}

测试远程调⽤

http://127.0.0.1:8080/feign/o2?id=5&name=zhangsan

传递对象

服务提供⽅ product-service

@RequestMapping("/product")
@RestController
public class ProductController {

    @RequestMapping("/p3")
    public String p3(ProductInfo productInfo){
        return "接收到对象, productInfo:" + productInfo;
    }
}

Feign客⼾端

@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {

    @RequestMapping("/p3")
    String p3(@SpringQueryMap ProductInfo productInfo);
}

@SpringQueryMap 注解将 ProductInfo 对象的属性作为查询参数传递给远程服务

服务消费⽅ order-service

@RequestMapping("/feign")
@RestController
public class TestFeignController {

    @Autowired
    private ProductApi productApi;

    @RequestMapping("/o3")
    public String o3(ProductInfo productInfo){
        return productApi.p3(productInfo);
    }
}

测试远程调⽤

http://127.0.0.1:8080/feign/o3?id=5&productName=zhangsan

传递JSON

服务提供⽅ product-service

@RequestMapping("/product")
@RestController
public class ProductController {

    @RequestMapping("/p4")
    public String p4(@RequestBody ProductInfo productInfo){
        return "接收到对象, productInfo:" + productInfo;
    }
}

@RequestBody: 用于将 HTTP 请求体绑定到方法参数 productInfo 上。Spring MVC 会自动将 JSON 数据反序列化为 ProductInfo 对象

Feign客⼾端

@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {

    @RequestMapping("/p4")
    String p4(@RequestBody ProductInfo productInfo);
}

@RequestBody: 用于标注客户端方法参数 productInfo。Feign 会自动将 ProductInfo 对象序列化为 JSON 数据,并在请求体中传递

服务消费⽅ order-service

@RequestMapping("/feign")
@RestController
public class TestFeignController {

    @Autowired
    private ProductApi productApi;

    @RequestMapping("/o4")
    public String o4(@RequestBody ProductInfo productInfo){
        System.out.println(productInfo.toString());
        return productApi.p4(productInfo);
    }
}

@RequestBody: 用于将 HTTP 请求体绑定到方法参数 productInfo 上。Spring MVC 会自动将 JSON 数据反序列化为 ProductInfo 对象

测试远程调⽤

http://127.0.0.1:8080/feign/o4

最佳实践

最佳实践, 其实也就是经过历史的迭代, 在项⽬中的实践过程中, 总结出来的最好的使⽤⽅式.

通过观察, 我们也能看出来, Feign的客⼾端与服务提供者的controller代码⾮常相似

Feign 客⼾端

@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {

    @RequestMapping("/{productId}")
    ProductInfo getProductById(@PathVariable("productId") Integer productId);
}

服务提供⽅Controller

@RequestMapping("/product")
@RestController
public class ProductController {

    @RequestMapping("/{productId}")
    public ProductInfo getProductById(@PathVariable("productId") Integer productId) {
        // Implementation details
    }
}

有没有⼀种⽅法可以简化这种写法呢?

Feign 继承方式

Feign ⽀持继承的⽅式, 我们可以把⼀些常⻅的操作封装到接⼝⾥.

我们可以定义好⼀个接⼝, 服务提供⽅实现这个接⼝, 服务消费⽅编写Feign 接⼝的时候, 直接继承这个接⼝

具体参考: Spring Cloud OpenFeign Features :: Spring Cloud Openfeign

注意:我们需要复制一份 spring-cloud-feign 项目,因为我们后续别的学习还是要用到这个项目的代码的,我们复制之后保留备份即可,依然在同一个项目中写下面的代码

创建⼀个Module

接⼝可以放在⼀个公共的Jar包⾥, 供服务提供⽅和服务消费⽅使⽤

引入依赖
<dependencies>
    <!-- Spring Boot Web Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Spring Cloud OpenFeign Starter -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
编写接口

复制 ProductApi, ProductInfo 到product-api模块中

ProductInterface 写在 api 包下,ProductInfo 复制到 model 包下,然后 order-service 和 product-service 服务里的 ProductInfo 就可以注释掉了,因为这些是已经提取到公共的 product-api 模块里了

public interface ProductInterface {
    
    @RequestMapping("/{productId}")
    ProductInfo getProductById(@PathVariable("productId") Integer productId);

    @RequestMapping("/p1")
    String p1(@RequestParam("id") Integer id);

    @RequestMapping("/p2")
    String p2(@RequestParam("id") Integer id, @RequestParam("name") String name);

    @RequestMapping("/p3")
    String p3(@SpringQueryMap ProductInfo productInfo);

    @RequestMapping("/p4")
    String p4(@RequestBody ProductInfo productInfo);
}

⽬录结构如下:

打Jar包

通过Maven把当前工程打成jar包,放在Maven本地仓库(不是远程仓库)

观察Maven本地仓库, Jar包是否打成功

[INFO] Installing D:\Git\spring-cloud\spring-cloud-feign2\product-api\target\product-api-1.0-SNAPSHOT.jar to 
D:\Maven\.m2\repository\org\example\product-api\1.0-SNAPSHOT\product-api-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.796 s
[INFO] Finished at: 2024-01-03T19:31:35+08:00
[INFO] ------------------------------------------------------------------------

这里打包到的地址是你要在 IDEA 里设置 Maven 的本地仓库的地址,然后加上的是包的地址,我这里是 com\hsu\product-api,然后就可以注释掉原来 order-service 和 product-service 里的 ProductInfo 类了

直接在 order-service 和 product-service 里导入下面的即可,但可能还需要修改一下对应其他包里引用的 ProductInfo,有可能还是之前的

<dependency>
 <groupId>com.hsu</groupId>
 <artifactId>product-api</artifactId>
 <version>1.0-SNAPSHOT</version>
</dependency>
服务提供方

服务提供⽅实现接⼝ ProductInterface

@Slf4j
@RequestMapping("/product")
@RestController
public class ProductController implements ProductInterface {

    @Autowired
    private ProductService productService;

    @RequestMapping("/{productId}")
    public ProductInfo getProductById(@PathVariable("productId") Integer productId) {
        log.info("接收参数, productId:{}", productId);
        return productService.selectProductById(productId);
    }

    @RequestMapping("/p1")
    public String p1(Integer id) {
        return "p1接收到参数: " + id;
    }

    @RequestMapping("/p2")
    public String p2(Integer id, String name) {
        return "p2接收到参数, id: " + id + ", name: " + name;
    }

    @RequestMapping("/p3")
    public String p3(ProductInfo productInfo) {
        return "接收到对象, productInfo: " + productInfo;
    }

    @RequestMapping("/p4")
    public String p4(@RequestBody ProductInfo productInfo) {
        return "接收到对象, productInfo: " + productInfo;
    }
}
服务消费方

服务消费⽅继承ProductInterface

@FeignClient(value = "product-service", path = "/product")
public interface ProductApi extends ProductInterface {

}
测试

试远程调⽤

http://127.0.0.1:8080/order/1

Feign 抽取方式

官⽅推荐Feign的使⽤⽅式为继承的⽅式, 但是企业开发中, 更多是把Feign接⼝抽取为⼀个独⽴的模块(做法和继承相似, 但理念不同).

先将原来备份的 spring-cloud-feign 改名为 spring-cloud-feign2,我们在这里学习

操作⽅法:

将Feign的Client抽取为⼀个独⽴的模块, 并把涉及到的实体类等都放在这个模块中, 打成⼀个Jar. 服务消费⽅只需要依赖该Jar包即可. 这种⽅式在企业中⽐较常⻅, Jar包通常由服务提供⽅来实现.

创建⼀个module

引入依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
编写API

复制 ProductApi, ProductInfo 到product-api模块中

这里目录格式有点问题,api 和 model 是同级的

打Jar包

通过Maven打包product-api

观察Maven本地仓库, Jar包是否打成功

[INFO] Installing D:\Git\spring-cloud\spring-cloud-feign\product-api\target\product-api-1.0-SNAPSHOT.jar to 
D:\Maven\.m2\repository\org\example\product-api\1.0-SNAPSHOT\product-api-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.441 s
[INFO] Finished at: 2024-01-03T17:55:14+08:00
[INFO] ------------------------------------------------------------------------

服务消费方使用product-api

服务消费方,引入抽取出来的模块

  1. 删除 ProductApi, ProductInfo
  2. 引⼊依赖
<dependency>
    <groupId>com.hsu</groupId>
    <artifactId>product-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

修改项⽬中ProductApi, ProductInfo的路径为product-api中的路径

  1. 指定扫描类: ProductApi

在启动类添加扫描路径

@EnableFeignClients(basePackages = {"com.hsu.product.api"})

完整代码如下:

@EnableFeignClients(basePackages = {"com.hsu.product.api"})
@SpringBootApplication
public class OrderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

也可以指定需要加载的Feign客⼾端

@EnableFeignClients(clients = {ProductApi.class})
测试

测试远程调⽤

http://127.0.0.1:8080/order/1

服务部署

  1. 修改数据库, Nacos等相关配置

  2. 对两个服务进⾏打包

    Maven打包默认是从远程仓库下载的, product-api 这个包在本地, 有以下解决⽅案:

    • 上传到Maven中央仓库(参考: 如何发布Jar包到Maven中央仓库, ⽐较⿇烦)[不推荐]

    • 搭建Maven私服, 上传Jar包到私服[企业推荐]

    • 从本地读取Jar包[个⼈学习阶段推荐]

    前两种⽅法⽐较复杂, 我们使⽤第三种⽅式

    修改pom⽂件

<dependency>
    <groupId>org.example</groupId>
    <artifactId>product-api</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- scope 为 system. 此时必须提供 systemPath 即本地依赖路径。表示 Maven 不会去中央仓库查找依赖,不推荐使用 -->
    <scope>system</scope>
    <systemPath>D:/Maven/.m2/repository/org/example/product-api/1.0-SNAPSHOT/product-api-1.0-SNAPSHOT.jar</systemPath>
</dependency>

<!-- .... -->

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includeSystemScope>true</includeSystemScope>
            </configuration>
        </plugin>
    </plugins>
</build>

把D:/Maven/.m2/repository 改为本地仓库的路径

  1. 上传jar到Linux服务器

  2. 启动Nacos

    启动前最好把data数据删除掉.

  3. 启动服务

# 后台启动 order-service,并设置输出日志到 logs/order.log
nohup java -jar order-service.jar > logs/order.log &

# 后台启动 product-service,并设置输出日志到 logs/product-9090.log
nohup java -jar product-service.jar > logs/product-9090.log &

# 启动实例,指定端口号为 9091,并设置输出日志到 logs/product-9091.log
nohup java -jar product-service.jar --server.port=9091 > logs/product-9091.log &

观察Nacos控制台

  1. 测试

访问接⼝: http://110.41.51.65:8080/order/1

观察远程调⽤的结果:

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

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

相关文章

ESP32,制作一个遥控点火玩具

最近想做一个遥控点火玩具&#xff0c;过年的时候可以让娃拿出手机遥控点炮&#xff0c;绝对能成为全村最亮的仔。 实际也挺简单&#xff0c;使用的东西有ESP32开发板&#xff0c;1838T红外接收器&#xff0c;一个继电器&#xff0c;一个钨丝。 原理图如下。 GPIO17接红外ou…

夹耳式蓝牙耳机哪个牌子最好?夹耳式耳机推荐性价比排行榜

耳夹式耳机既不堵耳孔、也不需要包覆耳廓&#xff0c;佩戴时看起来更像是一个“耳环”&#xff0c;固定方式也类似“夹耳朵”。不过&#xff0c;它并不是真的夹住了耳朵肉&#xff0c;而是半夹、半挂——依靠耳廓边缘厚、里面薄&#xff0c;且有一定的弯折面的特殊构造&#xf…

Arm Cortex-R52+ Generic Timer分析

目录 1.Generic Timer初识 2.R52的Generic Timer 3.如何配置Timer中断 4.小结 1.Generic Timer初识 Arm Cortex-R52内部实现了Generic Timer(通用计时器)&#xff0c;它可以基于递增计数来产生中断和事件流。 事实上&#xff0c;该计时器和Armv8-R AArch32中的定义完全一…

Python数据分析与可视化:从基础到高级应用

一、引言 在当今数据驱动的时代&#xff0c;数据的分析和可视化变得至关重要。Python作为一种功能强大且广泛使用的编程语言&#xff0c;在数据分析和可视化领域拥有丰富的库和工具。通过Python&#xff0c;数据分析师和科学家能够高效地处理数据、提取有价值的信息并以直观的方…

【网络安全】更改参数实现试用计划延长

未经许可,不得转载。 文章目录 正文目标:example.com,电子商务网站,允许企业在线创建商店。该平台提供了广泛的功能,如商店设计、创建产品等。 正文 在界面 example.com/start-your-trial/ 上,可以创建为期 15 天的试用商店。填写完所有信息后,我点击了“Sign Up”按钮…

BERT训练环节(代码实现)

1.代码实现 #导包 import torch from torch import nn import dltools #加载数据需要用到的声明变量 batch_size, max_len 1, 64 #获取训练数据迭代器、词汇表 train_iter, vocab dltools.load_data_wiki(batch_size, max_len) #其余都是二维数组 #tokens, segments, vali…

一带一路区块链赛项样题解析(中)

一带一路区块链赛项样题解析 (模块二) 标题任务一 按要求完成智能合约开发 1、学籍信息合约(Roll)接口编码(6分) (1)编写学籍信息合约中的RollInfo 实体接口,完成RollInfo实体通用数据的初始化,实现可追溯的学籍信息上链功能;(2分) // SPDX-License-Identifie…

FPGA IP 和 开源 HDL 一般去哪找?

在FPGA开发的世界中&#xff0c;IP核和HDL模块是构建复杂数字系统的基石。它们如同乐高积木&#xff0c;让开发者能够快速搭建和重用经过验证的电路功能。但你是否曾感到迷茫&#xff0c;不知道从哪里寻找这些宝贵的资源&#xff1f;本文将为你揭开寻找FPGA IP核和HDL模块资源的…

探索MemGPT:AI界的新宠儿

文章目录 探索MemGPT&#xff1a;AI界的新宠儿1. 背景介绍2. MemGPT是什么&#xff1f;3. 如何安装MemGPT&#xff1f;4. 简单的库函数使用方法5. 场景应用场景一&#xff1a;创建持久聊天机器人场景二&#xff1a;文档分析场景三&#xff1a;多会话聊天互动 6. 常见Bug及解决方…

【2.使用VBA自动填充Excel工作表】

目录 前言什么是VBA如何使用Excel中的VBA简单基础入门控制台输出信息定义过程&#xff08;功能&#xff09;定义变量常用的数据类型Set循环For To 我的需求开发过程效果演示文件情况测试填充源文件测试填充目标文件 全部完整的代码sheet1中的代码&#xff0c;对应A公司工作表Us…

社区来稿丨一个真正意义上的实时多模态智能体框架,TEN Framework 为构建下一代 AI Agent 而生

本文由 RTE 开发者社区成员通过社区网站投稿提供&#xff0c;如果你也有与实时互动&#xff08;Real-Time Engagement&#xff0c;RTE&#xff09;相关的项目分享&#xff0c;欢迎访问网站 rtecommunity.dev 发布&#xff0c;优秀项目将会在公众号发布分享。 自从 OpenAI 展示了…

大数据毕业设计选题推荐-手机销售数据分析系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

PINN机器学习登上Science正刊!热门buff叠满!11个创新思路get到就能发

今天我们来聊聊物理信息机器学习PIML。PINN大家都熟悉吧&#xff0c;毕竟研究热度就没下去过&#xff0c;这个热点其实就是PIML的一种典型代表。 PIML是一种融合了物理学与机器学习的创新技术&#xff0c;通过引入物理学的先验知识&#xff0c;来改进和优化机器学习模型的性能…

换脸黑科技FaceFusion 3.0(Windows Mac整合包)震撼来袭!

换脸黑科技FaceFusion 3.0&#xff08;Windows & Mac整合包&#xff09;震撼来袭&#xff01; 各位魔法师们&#xff0c;准备好迎接 FaceFusion 3.0 的强势登场了吗&#xff1f;这款 AI 换脸神器经历了全面升级&#xff0c;功能更强大&#xff0c;效果更惊艳&#xff0c;操…

C++(引用、窄化、输入)

1. 引用 reference&#xff08;重点&#xff09; 1.1 基础使用 引用就是某个变量或常量的别名&#xff0c;对引用进行操作与操作原变量或常量完全相同。 #include <iostream>using namespace std;int main() {int a 1;int& b a; // b是a的引用b;cout << a &…

基于单片机的汽车防酒驾控制系统设计

本设计基于STC12C5A60S2单片机的汽车防酒驾系统&#xff0c;主要包括主控制器、酒精检测模块、显示模块、声光报警模块和语音播报模块等共同组成&#xff0c;从而实现了对车内酒精浓度进行采集&#xff0c;预防酒驾的发生。利用酒精检测传感器对车辆内人员呼出的气体进行酒精浓…

C盘满了怎么清理_C盘满了深度清理详细操作步骤(多种方法)

最近有很多网友问我&#xff0c;我电脑C盘满了怎么清理&#xff1f;说自己不敢乱清理&#xff0c;怕清了系统文件无法正常开机&#xff0c;今天小编就教大家C盘满了清理的详细操作步骤&#xff0c;按教程来不怕系统进不了系统了。 C盘满了清理流程&#xff1a; 清理系统产生的…

vue-pdf 实现pdf预览、高亮、分页、定位功能

vue-pdf 实现pdf预览、高亮、分页、定位功能&#xff08;基于vue2.0&#xff01;&#xff01;&#xff01;&#xff09; 前言一、实现步骤1.引入库2.示例代码3.触发高亮事件4.分页高亮5.跳转指定页面并高亮&#xff08;不分页&#xff09; 参考笔记&#xff08;重要&#xff09…

C# 面对对象基础 枚举,Enum.TryParse的使用

代码&#xff1a; using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace Student_c_ {enum Week : int{Mon,Tus,Wed,Thu,Fri,Sat,Sun,}public cla…

微服务之服务保护

Sentinel引入Java项目中 一&#xff1a;安装Sentinel 官网地址&#xff1a;https://github.com/alibaba/Sentinel/releases 二&#xff1a;安装好后在sentinel-dashboard.jar所在目录运行终端 三&#xff1a;运行命令&#xff0c;端口自己指定 java -Dserver.port8090 -Dcs…