Alibaba spring cloud Dubbo使用(基于Zookeeper或者基于Nacos+泛化调用完整代码一键启动)
Quick Start
Dubbo!用更优雅的方式来实现RPC调用吧 - 掘金
dubbo+zookeeper demo
项目结构:

RpcService
仅仅是提供服务的接口:
public interface HelloService {String sayHello(String name);
}
DubboServer
pom:
<?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 https://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.5.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>DubboServer</artifactId><version>0.0.1-SNAPSHOT</version><name>DubboServer</name><description>DubboServer</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.2.0</version></dependency><!-- Dubbo --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.5</version></dependency><!-- Spring Context Extras --><dependency><groupId>com.alibaba.spring</groupId><artifactId>spring-context-support</artifactId><version>1.0.2</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.12</version></dependency><dependency><groupId>com.example</groupId><artifactId>RpcService</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!-- 这是个编译java代码的 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration><executions><execution><phase>compile</phase><goals><goal>compile</goal></goals></execution></executions></plugin></plugins></build></project>
DubboServerApplication:
package com.example.dubboserver;import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableDubbo(scanBasePackages = {"com.example.dubboserver"})
public class DubboServerApplication {public static void main(String[] args) {SpringApplication.run(DubboServerApplication.class, args);}}
HelloServiceImpl实现dubbo服务:
package com.example.dubboserver;import com.alibaba.dubbo.config.annotation.Service;
import com.example.rpcservice.HelloService;
import org.springframework.stereotype.Component;@Component
@Service
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "hello " + name + "!";}
}
配置文件application.yaml:
dubbo:application:name: example-providerregistry:address: zookeeper://43.143.229.22:2181protocol:name: dubboport: 20880
zookeeper是我的一台云服务器,zookeeper需要先部署好。
DubboClient
pom文件与Server相似:
<?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 https://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.5.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>DubboClient</artifactId><version>0.0.1-SNAPSHOT</version><name>DubboClient</name><description>DubboClient</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>com.example</groupId><artifactId>RpcService</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.2.0</version></dependency><!-- Dubbo --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.5</version></dependency><!-- Spring Context Extras --><dependency><groupId>com.alibaba.spring</groupId><artifactId>spring-context-support</artifactId><version>1.0.2</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.12</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
DubboClientApplication:
package com.example.dubboclient;import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableDubbo(scanBasePackages = {"com.example.dubboclient"})
public class DubboClientApplication {public static void main(String[] args) {SpringApplication.run(DubboClientApplication.class, args);}}
RpcService:
package com.example.dubboclient;import com.alibaba.dubbo.config.annotation.Reference;
import com.example.rpcservice.HelloService;
import org.springframework.stereotype.Service;@Service
public class RpcService {@Referenceprivate HelloService helloService;public String getHelloServiceResponse(String name) {return helloService.sayHello(name);}
}
通过Reference注解标识这是一个dubbo服务接口。
TriggerController:(通过get方法触发dubbo调用,debug用)
package com.example.dubboclient;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/demo/dubbo")
public class TriggerController {@Autowiredprivate RpcService rpcService;@GetMapping("/{name}")public String getTime(@PathVariable("name") String name) {return rpcService.getHelloServiceResponse(name);}}
配置文件:
server:port: 8081
dubbo:application:name: example-consumerregistry:address: zookeeper://43.143.229.22:2181client: curatorprotocol:name: dubboserver: falseconsumer:timeout: 3000
dubbo使用nacos作为注册中心
dubbo也可以用nacos作为注册中心。使用docker一键启动nacos2: docker run --name nacos-quick -e MODE=standalone -p 8848:8848 -p 9848:9848 -p 9849:9849 -d nacos/nacos-server:2.0.2 ,如果是部署在云服务器上的话记得防火墙暴露接口。
client和server的代码与上面zookeeper的一致,但是依赖和配置换了,依赖采用alibaba-spring-cloud来提供。这里我为了方便没有创建父项目写dependencyManagement,而是直接在子项目写来管理包版本,这种做法不是很规范。
Server
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 https://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.6.3</version><relativePath/></parent><groupId>com.example</groupId><artifactId>DubboServer</artifactId><version>0.0.1-SNAPSHOT</version><name>DubboServer</name><description>DubboServer</description><properties><spring-cloud-clibaba.version>2021.0.1.0</spring-cloud-clibaba.version><spring-cloud.version>2021.0.1</spring-cloud.version></properties><dependencyManagement><dependencies><!-- spring cloud 版本控制 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring cloud alibaba 版本控制 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-clibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- nacos 配置 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- dubbo --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>com.example</groupId><artifactId>RpcService</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!-- 这是个编译java代码的 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration><executions><execution><phase>compile</phase><goals><goal>compile</goal></goals></execution></executions></plugin></plugins></build></project>
application.yaml:
spring:main:# spring boot 2.6.3默认不允许循环依赖, dubbo的这个版本存在循环依赖allow-circular-references: trueapplication:name: demo-servercloud:nacos:config:enable: falsediscovery:server-addr: 123.56.98.228:8848namespace: publicdubbo:consumer:retries: 5protocol:port: -1name: dubboscan:# 扫描实现类的包路径(可配置多个或数组)base-packages: com.example.dubboserver # 更改为自己dubbo实现类的路径registry:address: nacos://${spring.cloud.nacos.discovery.server-addr}?namespace=${spring.cloud.nacos.discovery.namespace}cloud:# 默认*订阅所有, 所以在此处写一个不存在的提供者# (可订阅多个用,隔开或者用数组的配置方式 -: name)subscribed-services: "-"
client
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 https://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.6.3</version><relativePath/></parent><groupId>com.example</groupId><artifactId>DubboClient</artifactId><version>0.0.1-SNAPSHOT</version><name>DubboClient</name><description>DubboClient</description><properties><spring-cloud-clibaba.version>2021.0.1.0</spring-cloud-clibaba.version><spring-cloud.version>2021.0.1</spring-cloud.version></properties><dependencyManagement><dependencies><!-- spring cloud 版本控制 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring cloud alibaba 版本控制 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-clibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>RpcService</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- nacos 配置 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- dubbo --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
application.yaml:
spring:main:# spring boot 2.6.3默认不允许循环依赖, dubbo的这个版本存在循环依赖allow-circular-references: trueapplication:name: demo-clientcloud:nacos:config:enable: falsediscovery:server-addr: 123.56.98.228:8848namespace: publicdubbo:consumer:retries: 5protocol:port: -1name: dubbo # 协议名称
测试
先上nacos看看服务 ip:8848/nacos:

其中有一个是dubbo自己的服务,剩下三个一个是client应用,一个是server应用,一个是暴露的RpcService服务。
浏览器输入:http://localhost:8080/demo/dubbo/dsasdfaasdf
响应:

没啥问题。
dubbo泛化调用
dubbo泛化调用即在调用方不引入服务方接口包的情况下直接调用服务接口。
适用场景:
比如你做了一个网关项目,网关需要调用后端的多个服务的多个接口,这些接口假如都是dubbo,网关需要引入所有服务的接口包才能调用,这显然不太合理,网关的代码应该和后端服务解耦。
那如何实现泛化调用呢?
- 服务方不需要更改配置。
- 调用方更改rpc调用的代码。
不使用泛化调用的代码:
@Service
public class RpcService {@Referenceprivate HelloService helloService; // 普通调用public String getHelloServiceResponse(String name) {return helloService.sayHello(name); // 普通调用}
}
改为泛化调用:
@Service
public class RpcService {@DubboReference(interfaceName = "com.example.rpcservice.HelloService", generic = true)private GenericService genericService;public String getHelloServiceResponse(String name) {Object res = genericService.$invoke("sayHello" , new String[]{"java.lang.String"},new Object[]{name});return (String) res;}
}
可以看到将原本的具体的Service接口改为了GenericService, @DubboReference中写明了调用的接口全限定名称,并且generic打开为true。
至此完成泛化调用改动,还是挺简单的。
相关文章:
Alibaba spring cloud Dubbo使用(基于Zookeeper或者基于Nacos+泛化调用完整代码一键启动)
Quick Start Dubbo!用更优雅的方式来实现RPC调用吧 - 掘金 dubbozookeeper demo 项目结构: RpcService 仅仅是提供服务的接口: public interface HelloService {String sayHello(String name); }DubboServer pom: <?xm…...
Word为图表设置图注并在图表清单中自动生成
1如果需要自动插入题注,请不要自己为文件增加新的标题样式或删除自带的标题1样式 2章节大标题最好是标题1,2,3而不要设置标题一、二、三,否则图例在自动生成时会显示 图一 -1,调整起来会非常不方便 若实在要使用大写中文标题&…...
新建maven项目中遇到的问题
#新建maven项目中遇到的问题 用的是eclipse Version: 2022-12 (4.26.0) tomcat 8.5 java 1.8 ##1、新建完之后,直接有报错,index报错 除了在build config path中加入server runtime和java sdk之外,还有在project property 中project facet中j…...
【剑指offer】24. 机器人的运动范围(java选手)
题目链接 题目链接 题目描述 地上有一个 m 行和 n列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。 一个机器人从坐标 (0,0) 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。 但是不能进入行坐标和列…...
CMU 10-414/714: Deep Learning Systems --hw3
实现功能 在ndarray.py文件中完成一些python array操作 我们实现的NDArray底层存储就是一个一维向量,只不过会有一些额外的属性(如shape、strides)来表明这个flat array在维度上的分布。底层运算(如加法、矩阵乘法)都…...
前端小白的学习之路(lessscss)
提示:less,sass&scss 目录 一、less 1.变量 2.嵌套规则 3.混合 4.针对属性值进行操作的函数 5.循环 6.拓展语法 二、scss&sass 1.sass 2.scss 一、less 是一个开源的、基于 CSS 的预处理器,它使得编写和维护 CSS 更加简单和高效。通…...
算法体系-15 第十五节:贪心算法(下)
一 、贪心算法的解题套路实战 贪心的算法和排序和堆有关 1.1 描述 一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间 你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。 返回最多的宣讲场次…...
2.10 模型评估的方法有哪些?优缺点
2.10 模型评估的方法有哪些?优缺点? 场景描述 在机器学习中,我们通常把样本分为训练集和测试集,训练集用于训练模型,测试集用于评估模型。在样本划分和模型验证的过程中,存在着不同的抽样方法和验证方法。…...
Linux centos7安装nginx-1.24.0并且实现自启动
1.安装之前的操作 ps -ef|grep nginx 查看是否有运行 如果有就杀掉 kill -9 pid find / -name nginx 查看nginx文件 rm -rf file /usr/local/nginx* 通通删掉删掉 yum remove nginx 限载一下服务 1.2.下载安装包 地址 nginx: download 2.减压文件 tar…...
001-Windows下PyTorch极简开发环境配置(上)
本节介绍Windows系统下配置一套基于Pytorch框架的极简深度学习开发环境。 目录 0.1 缘起 0.1 缘起 其实大概在2016就开始接触深度学习的相关知识,但一直到2018年左右,还停留在门外汉的状态太,原因很简单,感觉学习的门槛过高。…...
分布式Raft原理详解,从不同角色视角分析相关状态
分布式Raft原理详解,从不同角色视角分析相关状态 1. CAP定理2.Raft 要解决的问题3. Raft的核心逻辑3.1. Raft的核心逻辑2.1. 复制状态机2.2. 任期 Term2.3. 任期的意义:逻辑时钟2.4 选举定时器 3. Leader选举逻辑4. 从节点视角查看Leader选举4.1. Follow…...
大数据的实时计算和离线计算你理解吗?
不管是实时计算还是离线计算,都有着同样的业务目标,那就是根据业务要求把数据源计算处理成业务需要的直接可用的数据结果。 如果把数据源比作是水龙头里的水,把数据计算比作是生产纯净水的过程;那么实时计算就是用一根水管接在水龙…...
OS Package Manager
Windows Package Manager winget chocolatey Mac homebrew Linux apt-get apt snap yum 使用wget和curl拉取相关工具的shell脚本执行安装...
【滑动窗口、矩阵】算法例题
目录 三、滑动窗口 30. 长度最小的子数组 ② 31. 无重复字符的最长子串 ② 32. 串联所有单词的子串 ③ 33. 最小覆盖子串 ③ 四、矩阵 34. 有效的数独 ② 35. 螺旋矩阵 ② 36. 旋转图像 ② 37. 矩阵置零 ② 38. 生命游戏 ② 三、滑动窗口 30. 长度最小的子数组 ② 给…...
【事务】开发用到的事务,TransactionDefinition实例详解,事务的传播机制
【事务】开发中用到的事务,TransactionDefinition实例详解 一、TransactionDefinition 介绍1、隔离级别(Isolation Level):2、传播行为(Propagation Behavior):3、超时设置(Timeout …...
Linux信号处理
Linux信号处理 什么是linux信号 本质是一种通知机制,用户 or 操作系统通过发送一定的信号,通知进程,某些事情已经发生,你可以在后续进行处理。 信号产生是随机的,进程可能正在忙自己的事情,所以…...
nuclei使用方法
nuclei使用方法 查看帮助 nuclei -h 列出所有模板 nuclei -tl 查找某种cms的相关漏洞模板,wordpress为例 nuclei -tl -tc "contains(name,wordpress)"便会列出内容里含有wordpress关键字的漏洞检测模板 使用与某cms相关的所有漏洞模板进行扫描&#…...
【并查集专题】【蓝桥杯备考训练】:网络分析、奶酪、合并集合、连通块中点的数量、格子游戏【已更新完成】
目录 1、网络分析(第十一届蓝桥杯省赛第一场C A组/B组) 2、奶酪(NOIP2017提高组) 3、合并集合(模板) 4、连通块中点的数量(模板) 5、格子游戏(《信息学奥赛一本通》…...
数据结构(三)复杂度的深层次剖析
之前发布了数据结构(一),很多同学反响不够清晰,那今天就发一篇对复杂度专题的博客,希望对大家理解复杂度提供一些帮助。 时间复杂度 我们先来一个理解一个复杂度,二分查找的复杂度(之前写过二…...
JavaWeb -- HTTP -- WEB服务器TOMCAT
一.HTTP介绍: HTTP(Hyper Text Protocol) 实际上是一种超文本传输的协议,规定了浏览器跟服务器之间的一些数据传输的规则 例如B/S 对于浏览器的请求,以及相应服务器的响应,都必须依靠这种协议,规范,才能够彼此之间相互 理解 HTTP的协议特点: 1.基于TCP协议: 面向连接 更加安全…...
Blender3mfFormat插件实战指南:5个关键步骤实现3D打印工作流优化
Blender3mfFormat插件实战指南:5个关键步骤实现3D打印工作流优化 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat Blender3mfFormat是一款专为Blender设计的3M…...
行李包安检的设计(论文+CAD图纸+proe三维+SolidWorks三维图+ANSYS源文件+论文答辩PPT)
行李包安检系统是保障公共安全的关键环节,其设计需兼顾检测效率、结构稳定性与操作便捷性。通过系统整合CAD图纸、ProE三维模型、SolidWorks三维图及ANSYS源文件,可实现从二维布局到三维结构再到力学性能的全方位优化。CAD图纸用于精准规划设备整体轮廓与…...
OpenClaw配置备份技巧:Kimi-VL-A3B-Thinking模型参数迁移无忧方案
OpenClaw配置备份技巧:Kimi-VL-A3B-Thinking模型参数迁移无忧方案 1. 为什么需要OpenClaw配置备份 上周我在升级主力开发机时,差点因为硬盘故障丢失了精心调校的OpenClaw配置。这个教训让我意识到,对于依赖本地AI助手的开发者来说ÿ…...
高性能客服系统技术内幕:通过 SpinWait 自旋等待结构体提升高频消息分发性能舶
1. 智能软件工程的范式转移:从库集成到原生框架演进 在生成式人工智能(Generative AI)从单纯的文本生成向具备自主规划与执行能力的“代理化(Agentic)”系统跨越的过程中,.NET 生态系统正在经历一场自该平台…...
Excel VBA 入门到精通(五):过程与函数
🎯 本章目标:掌握 VBA 过程与函数的定义和使用,理解参数传递机制,学会模块化编程思想,提升代码复用性。 一、模块化编程概述 1.1 为什么要模块化? 想象你要装修房子,如果所有事情都自己从头做——挖土、烧砖、做家具……那将是一场灾难。更好的方式是:把任务分解成小…...
JIT启用后CPU飙升200%?PHP 8.9生产环境避坑指南,含8类典型误配置清单
第一章:PHP 8.9 JIT 的核心机制与性能悖论PHP 8.9 并非官方发布的正式版本(截至 PHP 官方最新稳定版为 8.3),该标题中的 “8.9” 是一个假设性技术前瞻设定,用于探讨 JIT 编译器在 PHP 生态中持续演进所引发的底层机制…...
HarmonyOS-ArkTS-新手完整复现-含环境配置
HarmonyOS ArkTS 新手完整复现:从环境配置到网络列表 App(超细步骤) 欢迎访问开源鸿蒙 PC 开发者社区(https://harmonypc.csdn.net/)。 摘要 本文面向零基础/初学者,完整讲清: 如何在 Window…...
程序员副业图谱
引言:程序员副业的现状与趋势程序员副业需求增长的背景(技术变现、职业发展多元化)CSDN作为技术社区在副业生态中的角色CSDN程序员副业图谱的核心模块技术内容创作博客/专栏写作:技术干货、实战经验、行业分析视频教程:…...
PHP 8.9错误处理增强配置:从php.ini到Runtime::setErrorHandler()的7层防御链构建实战
第一章:PHP 8.9错误处理增强配置的演进背景与核心理念PHP 8.9(开发代号“Sentinel”)并非官方已发布的稳定版本,而是社区为探讨下一代错误处理范式所提出的概念性演进提案。其核心目标是弥合传统错误抑制()…...
如何构建可扩展的AI Agent架构
如何构建可扩展的AI Agent架构 一、引言 1.1 钩子:从GPT-4o到OpenAI Sora,Agent的“隐形翅膀”已振翅 你是否曾在刷到OpenAI Sora震撼的一分钟视频生成时,好奇它“凭空想象”出连贯人物、场景逻辑和光影效果的底层,真的只是一个巨…...
