当前位置: 首页 > news >正文

单体进化微服务:拆分、注册、调用、网关、过滤、治理、分布式事务

这里写目录标题

  • 基本介绍
  • 生产-消费-网关
    • 父依赖
    • 生产者服务
    • 消费者服务
    • 网关服务
    • common服务
  • 感想

基本介绍

Spring Cloud 是一个用于构建分布式系统和微服务架构的开发工具包。它提供了一系列的功能和组件,用于解决微服务架构中的常见问题,如服务注册与发现、负载均衡、配置管理、断路器等。本文将介绍如何使用 Spring Cloud 来构建一个简单的微服务架构。

服务注册与发现:
在微服务架构中,服务之间的相互调用是通过服务注册与发现来实现的。Spring Cloud 提供了 Eureka、Consul、ZooKeeper 等多种服务注册与发现的实现。我们可以选择其中一种来搭建服务注册中心,并在每个微服务启动时将自己注册到注册中心。

负载均衡:
在微服务架构中,负载均衡是将请求分发到多个服务实例上,以实现高可用和扩展性。Spring Cloud 提供了 Ribbon 作为默认的负载均衡解决方案,它可以与服务注册中心集成,自动实现负载均衡的功能。

配置管理:
在微服务架构中,配置管理可以帮助我们集中管理各个微服务的配置信息。Spring Cloud 提供了 Config Server 来实现统一的配置管理,将配置文件存储在 Git、SVN 等版本控制系统中,并通过统一的 API 接口提供给微服务使用。

断路器:
在微服务架构中,由于服务之间的相互调用,可能会出现某个服务不可用或响应超时的情况。为了保证系统的稳定性,我们可以使用断路器模式来处理这些故障。Spring Cloud 提供了 Hystrix 作为断路器的实现,可以在服务调用发生故障时进行降级或熔断处理。

在这里插入图片描述

生产-消费-网关

将一个服务拆分为生产、消费、网关三个微服务进行基本展示,实现了服务的拆分、注册、调用、网关、过滤,后期实现治理和分布式事务;

父依赖

<?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"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/></parent><artifactId>springcloud_demo</artifactId><packaging>pom</packaging><modules><module>service_1</module><module>service_2</module><module>gate_service</module><module>common</module><module>reminder</module></modules><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><org.projectlombok.version>1.18.20</org.projectlombok.version><spring-cloud.version>2021.0.3</spring-cloud.version><spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version><java.version>8</java.version></properties><dependencies><!-- Spring Cloud 相关依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><!-- 其他 Spring Boot Starter 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><dependencyManagement><dependencies><!--spring cloud alibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- lombok 管理 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${org.projectlombok.version}</version></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></dependencyManagement></project>

生产者服务

<?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>springcloud_demo</artifactId><groupId>org.springframework.boot</groupId><version>2.7.12</version></parent><modelVersion>4.0.0</modelVersion><artifactId>test_service</artifactId><dependencies><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--单元测试--><!--nacos 服务注册发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies></project>

properties配置

server.port=9092spring.application.name=service2spring.cloud.nacos.server-addr=lh:8848
spring.cloud.config.import-check.enabled=false
@SpringBootApplication
public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}}

基本生产

@RestController
@RequestMapping(path = "/hi")
public class HelloController {@Resourceprivate HelloService helloService;@RequestMapping(path = "/sy", method = RequestMethod.GET)public String sy(){// 1.根据服务名称,拉取服务的实例列表helloService.sayHi();return "service-2 say hi";}
}

消费者服务

<?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>springcloud_demo</artifactId><groupId>org.springframework.boot</groupId><version>2.7.12</version></parent><modelVersion>4.0.0</modelVersion><artifactId>test_2</artifactId><dependencies><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--单元测试--><!--nacos 服务注册发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version><scope>compile</scope></dependency><!--OpenFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!--ok-http--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId></dependency></dependencies></project>
server.port=9091spring.application.name=service1spring.cloud.nacos.server-addr=lh:8848
spring.cloud.config.import-check.enabled=falsefeign.okhttp.enabled=truelogging.level.com.com.han=debug
import com.han.config.DefaultFeignConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@EnableFeignClients(basePackages = "com.han.remote", defaultConfiguration = DefaultFeignConfig.class)
@SpringBootApplication
public class Test2Application {public static void main(String[] args) {SpringApplication.run(Test2Application.class, args);}}

配置类

import feign.Logger;
import org.springframework.context.annotation.Bean;public class DefaultFeignConfig {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;}
}``@FeignClient(value = "service2")
public interface Service2Client {@RequestMapping(method = RequestMethod.GET, path = "/hi/sy")String getHi();}```java
@Configuration
public class AppConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

controller


@RestController
@RequestMapping(path = "/hello")
public class HelloController {@Resourceprivate HelloService helloService;@Resourceprivate Service2Client service2Client;@RequestMapping(method = RequestMethod.GET, path = "/sy")public void sy(){// 1.根据服务名称,拉取服务的实例列表System.out.println(service2Client.getHi());helloService.sayHi();}
}

消费service

@Service
public class HelloServiceImpl implements HelloService {private final DiscoveryClient discoveryClient;@Resourceprivate RestTemplate restTemplate;@Resourceprivate Service2Client service2Client;public HelloServiceImpl(DiscoveryClient discoveryClient) {this.discoveryClient = discoveryClient;}@Overridepublic void sayHi() {System.out.println("service-1 say hi");System.out.println(service2Client.getHi());}public void sayHiByRestTemplate() {System.out.println("service-1 say hi");List<ServiceInstance> instances = discoveryClient.getInstances("service_2");// 2.负载均衡,挑选一个实例ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));// 3.获取实例的IP和端口ResponseEntity<String> response = restTemplate.exchange(instance.getUri() + "/hi",HttpMethod.GET,null,new ParameterizedTypeReference<String>() {},new Object());System.out.println(response.getBody());System.out.println(response);}
}

网关服务

<?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>springcloud_demo</artifactId><groupId>org.springframework.boot</groupId><version>2.7.12</version></parent><modelVersion>4.0.0</modelVersion><artifactId>gate_service</artifactId><dependencies><!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--nacos 服务注册发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>common</artifactId><version>2.7.12</version></dependency></dependencies></project>
server.port=9090spring.application.name=gatewayspring.cloud.nacos.server-addr=lh:8848
spring.cloud.config.import-check.enabled=falselogging.level.com.com.han=debug
logging.pattern.dateformat=HH:mm:ss:SSS
logging.file.path="logs/${spring.application.name}"spring.cloud.gateway.routes[0].id=service1
spring.cloud.gateway.routes[0].uri=lb://service1
spring.cloud.gateway.routes[0].predicates[0]=Path=/hello/**,/user/**
spring.cloud.gateway.routes[0].filters[0]=PrintAnyspring.cloud.gateway.routes[1].id=service2
spring.cloud.gateway.routes[1].uri=lb://service2
spring.cloud.gateway.routes[1].predicates[0]=Path=/hi/**spring.main.web-application-type=reactive
@SpringBootApplication
public class GateApplication {public static void main(String[] args) {SpringApplication.run(GateApplication.class, args);}
}

@Component
public class PrintAnyGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {@Overridepublic GatewayFilter apply(Object config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求ServerHttpRequest request = exchange.getRequest();// 编写过滤器逻辑System.out.println("过滤器执行了");// 放行return chain.filter(exchange);}};}
}

common服务

<?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>springcloud_demo</artifactId><groupId>org.springframework.boot</groupId><version>2.7.12</version></parent><modelVersion>4.0.0</modelVersion><artifactId>common</artifactId><dependencies><!-- Lombok 依赖 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version><scope>compile</scope></dependency></dependencies></project>
public class UserInfoInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.获取请求头中的用户String userInfo = request.getHeader("user-info");// 2.判断是否为空,不为空,存入Usercontextif (StrUtil.isNotBlank(userInfo)) {}// 3.放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception{// 清除用户
//        UserContext.removeUser();}
}
package com.han.utils;import lombok.Data;@Data
public class Result<T> {//状态码private Integer code;//信息private String message;//数据private T data;//构造私有化private Result() { }//设置数据,返回对象的方法public static<T> Result<T> build(T data,Integer code,String message) {//创建Resullt对象,设置值,返回对象Result<T> result = new Result<>();//判断返回结果中是否需要数据if(data != null) {//设置数据到result对象result.setData(data);}//设置其他值result.setCode(code);result.setMessage(message);//返回设置值之后的对象return result;}//设置数据,返回对象的方法public static<T> Result<T> build(T data,ResultCodeEnum resultCodeEnum) {//创建Resullt对象,设置值,返回对象Result<T> result = new Result<>();//判断返回结果中是否需要数据if(data != null) {//设置数据到result对象result.setData(data);}//设置其他值result.setCode(resultCodeEnum.getCode());result.setMessage(resultCodeEnum.getMessage());//返回设置值之后的对象return result;}//成功的方法public static<T> Result<T> ok(T data) {Result<T> result = build(data, ResultCodeEnum.SUCCESS);return result;}//失败的方法public static<T> Result<T> fail(T data) {return build(data,ResultCodeEnum.FAIL);}public static<T> Result<T> success(T data){return build(data, ResultCodeEnum.MY_CONDITION);}}
/*** 统一返回结果状态信息类**/
@Getter
public enum ResultCodeEnum {SUCCESS(200,"成功"),FAIL(201, "失败"),MY_CONDITION(666, "JUST 6"),;private Integer code;private String message;private ResultCodeEnum(Integer code, String message) {this.code = code;this.message = message;}
}

感想

框架的引入,让我们可以只需要导包就可以完成95%的工作;
但是如何抛开框架,我们是否可以自己完成spring、springcloud这些框架的基本功能那?
技术的提升不会仅仅是使用这些api接口,我们后面会尝试自己设计一些框架去替代

相关文章:

单体进化微服务:拆分、注册、调用、网关、过滤、治理、分布式事务

这里写目录标题 基本介绍生产-消费-网关父依赖生产者服务消费者服务网关服务common服务 感想 基本介绍 Spring Cloud 是一个用于构建分布式系统和微服务架构的开发工具包。它提供了一系列的功能和组件&#xff0c;用于解决微服务架构中的常见问题&#xff0c;如服务注册与发现…...

介绍正则表达式及其用法

正则表达式&#xff08;Regular Expression&#xff09;&#xff0c;简称为"正则"&#xff0c;是一种用于描述、匹配、搜索文本的方式。正则表达式通常由符号和字符组成&#xff0c;可以用于匹配和搜索特定模式的文本。 以下是一些常用的正则表达式元字符及其用法&am…...

SpEL 表达式 是什么

SpEL&#xff08;Spring Expression Language&#xff09;是一种强大的表达式语言&#xff0c;用于在运行时查询和操作对象图。它是 Spring 框架的一部分&#xff0c;但也可以独立于 Spring 使用。SpEL 提供了丰富的特性集&#xff0c;包括对象图遍历、方法调用、算术、逻辑和关…...

gbase 8s 按时间点恢复

如果要实现8S按照时间点进行恢复&#xff0c;需要使用onbar进行备份和恢复&#xff0c;而PSM是又是onbar不可或缺的。 之前我鄙视过onpsm的健壮性&#xff0c;最近反复测试&#xff0c;发现比预想的结果好很多。 onpsm的安装手册详见&#xff1a;GBase 8s PSM简单配置 | GBas…...

OceanBase:OBServer节点管理

目录 1.查看节点 2.添加节点 2.1 创建数据目录 2.2.OceanBase 运行时所依赖的部分三方动态库 2.3.安装 OceanBase 数据库的 RPM 包 2.4.启动节点 observer 进程 2.5.向集群中添加节点 3.隔离节点 4.重启节点 4.1 停止服务 4.2 转储 4.3 关闭进程 4.4 启动进程 4.…...

记录一个简单的博客系统该开发过程

文章目录 1.1 设计前端页面1.2 编写数据库相关代码1.3 实现功能的前后端交互 总结 1.1 设计前端页面 首先我们的博客系统要有几个网页界面 博客列表页博客详情页登录页博客编辑页 1.2 编写数据库相关代码 本环节我们需要完成以下几个步骤. 先设计数据库(表设计), 然后编写…...

计算机毕业设计选题推荐-家庭理财微信小程序/安卓APP-项目实战

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

html实现计算器源码

文章目录 1.设计来源1.1 主界面1.2 计算效果界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134532725 html实现计算器源码&#xff0c;计算器源码&#xff0c;简易计…...

处理无线debug问题

无限debug的产生 条件说明 开发者工具是打开状态 js代码中有debugger js有定时处理 setInterval(() > {(function (a) {return (function (a) {return (Function(Function(arguments[0]" a ")()))})(a)})(bugger)(de, 0, 0, (0, 0)); }, 1000); ​ #这里就…...

redis的性能管理

查看内存使用指标 查看内存使用指标 info memory used_memory:1800800 redis中主句占用的内存 used_memory_rss:5783552 redis向操作系统申请的内存 used_memory_peak:1800800使用内存的峰值 系统巡检&#xff1a;硬件巡检&#xff0c;数据库&#xff0c;nginx redis docke…...

es各种报错问题及解决方案20231121

报错一 org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [typesearch_phase_execution_exception, reasonall shards failed]Suppressed: org.elasticsearch.client.ResponseException: method [POST], host [http://localhost:9200], URI [/wzx-te…...

python数据结构与算法-10_递归

递归 Recursion is a process for solving problems by subdividing a larger problem into smaller cases of the problem itself and then solving the smaller, more trivial parts. 递归是计算机科学里出现非常多的一个概念&#xff0c;有时候用递归解决问题看起来非常简单…...

如何设计鞋材出库入账管理系统

如何设计鞋材出库入账管理系统 系统概述系统需求分析系统设计系统实施与测试系统上线与维护 系统概述 本系统旨在设计一个针对鞋材出库入账管理的数字化解决方案&#xff0c;以提高管理效率、降低运营成本并确保材料账目清晰。系统将结合先进的信息化技术&#xff0c;实现对鞋…...

一个简单的QT应用示例

一个简单的QT应用示例&#xff1a;创建一个窗口程序。 首先&#xff0c;确保已经安装了Qt开发环境。接下来&#xff0c;按照以下步骤创建一个简单的窗口程序&#xff1a; 1. 打开Qt Creator&#xff0c;点击“新建文件或项目”。 2. 选择“应用程序”&#xff0c;然后点击“下…...

南京数字孪生赋能工业制造,加速推进制造业数字化转型

随着南京信息技术的迅猛发展和工业管理的不断演进&#xff0c;传统的工业管理方式已经无法满足企业对高效、智能和可持续发展的需求。针对这一情况&#xff0c;数字孪生技术应运而生&#xff0c;为南京工业管理带来了全新的变革和机遇。以数字孪生为理念&#xff0c;三维可视化…...

Visual Studio Code 从英文界面切换中文

1、先安装中文的插件&#xff0c;直接安装。 2、点击右下角的 change language restart&#xff0c; 让软件重启即可以完成了。...

邦芒支招:利用自荐电话求职的七大技巧

​​如何利用自荐电话向招聘官推荐自己&#xff0c;现在人们在求职过程中都会自己争取面试机会&#xff0c;其中自荐电话是比较常见的一种方式&#xff0c;但是想要向面试官成功推荐自己也是不容易的&#xff0c;下面分享如何利用自荐电话向招聘官推荐自己。 ​ ​1、以对方为…...

埃尔米特插值(hermite 插值) C++

埃尔米特插值 原理 #pragma once #include <vector> #include <functional> /*埃尔米特插值*/ struct InterpolationPoint {double x; // 插值点的横坐标double y; // 插值点的纵坐标double derivative; // 插值点的导数值// 默认构造函数InterpolationPoint() : x…...

mysql优化之explain 以及 索引优化

Mysql安装文档参考&#xff1a;https://blog.csdn.net/yougoule/article/details/56680952 Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句&#xff0c;分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字&#xff0c;MySQL 会在查询上设…...

WebSocket --- ws模块源码解析(详解)

摘要 在这一篇文章中&#xff0c;写了如何在node端和web端&#xff0c;实现一个WebSocket通信。 WebSocket在node端和客户端的使用 而在node端里面&#xff0c;我们使用了ws模块来创建WebSocket和WebSocketServer&#xff0c;那ws模块是如何做到可以和客户端进行双向通信的呢…...

键盘控制鼠标:用Mouseable告别鼠标手,提升3倍工作效率

键盘控制鼠标&#xff1a;用Mouseable告别鼠标手&#xff0c;提升3倍工作效率 【免费下载链接】mouseable Mouseable is intended to replace a mouse or trackpad. 项目地址: https://gitcode.com/gh_mirrors/mo/mouseable 你是否曾经在键盘和鼠标之间频繁切换&#xf…...

20260507笔记

20260507笔记:vue: vue-router、vue的依赖package.json、组件下载更新机制、export与import、同步组件与异步组件。java: postgreSql的group by、DATE_TRUNC、case when ... then... end、 vue1、vue-router2、vue项目的package.json与package-lock.json3、vue-router是做什么的…...

Java-RPG-Maker-MV-Decrypter:3步轻松解密RPG游戏资源的终极免费工具

Java-RPG-Maker-MV-Decrypter&#xff1a;3步轻松解密RPG游戏资源的终极免费工具 【免费下载链接】Java-RPG-Maker-MV-Decrypter You can decrypt whole RPG-Maker MV Directories with this Program, it also has a GUI. 项目地址: https://gitcode.com/gh_mirrors/ja/Java-…...

3步掌握GetQzonehistory:永久备份QQ空间所有回忆的终极指南

3步掌握GetQzonehistory&#xff1a;永久备份QQ空间所有回忆的终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心QQ空间里那些承载青春记忆的说说会随着时间消失&…...

3步解锁Minecraft电影级光影:Revelation开源光影包完全指南

3步解锁Minecraft电影级光影&#xff1a;Revelation开源光影包完全指南 【免费下载链接】Revelation An explorative shaderpack for Minecraft: Java Edition 项目地址: https://gitcode.com/gh_mirrors/re/Revelation 还在为Minecraft原版画面平淡、光影生硬而烦恼吗&…...

Cursor IDE多智能体协作系统实战:从旅行规划到AI自动化流程构建

1. 项目概述&#xff1a;在Cursor IDE中构建多智能体协作系统最近在探索AI编程助手的高级玩法&#xff0c;发现Cursor IDE内置的智能体&#xff08;Agent&#xff09;框架远不止是简单的代码补全。它允许我们像搭积木一样&#xff0c;创建多个具备特定技能的AI智能体&#xff0…...

VideoDownloadHelper:5分钟快速搞定网页视频下载的终极解决方案

VideoDownloadHelper&#xff1a;5分钟快速搞定网页视频下载的终极解决方案 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 当你在浏览网页时…...

QueryCanvas:基于画布的低代码数据工作流编排工具详解

1. 项目概述与核心价值最近在折腾数据可视化与交互式分析工具时&#xff0c;发现了一个挺有意思的开源项目&#xff1a;okuyamashin/querycanvas。乍一看这个名字&#xff0c;你可能会联想到“查询画布”&#xff0c;没错&#xff0c;它的核心定位就是让你能在一个直观的、画布…...

产销严重脱节,生产过剩与缺货问题反复出现怎么办?——2026年基于实在Agent的智慧供应链深度重构方案

站在2026年的时间节点回看&#xff0c;制造业的数字化转型已从简单的“信息化”跃迁至“智能体化”。 然而&#xff0c;即便在AI技术高度普及的今天&#xff0c;许多企业依然深陷于产销严重脱节的泥潭&#xff1a; 一边是仓库中堆积如山的过期库存&#xff0c;导致资金链极度紧…...

开发者在多模型间切换时如何利用Taotoken保持API调用统一

开发者在多模型间切换时如何利用Taotoken保持API调用统一 1. 多模型开发的核心痛点 当开发者需要同时接入多个大模型厂商时&#xff0c;往往面临协议碎片化的问题。不同厂商的API在认证方式、请求结构、响应格式上存在显著差异&#xff0c;甚至同一厂商的不同模型系列也可能有…...