Alibaba SpringCloud集成Nacos、Sentinel实现服务治理-17

关于服务治理

总体而言,限流和降级作为微服务架构中的重要机制,尽管在实现上可能有多种方式,但它们都着眼于保护服务提供者和消费者,在面对异常情况时确保系统稳定运行。限流关注于保护服务提供者,控制请求流量;而降级则关注于服务消费者,确保在服务不可用或异常情况下提供基本的功能。

  • 限流是一种针对服务提供者的策略,用于控制对特定服务接口或服务实例的访问量。其目的在于保护服务提供者免受过大请求流量的影响,确保服务稳定性。限流措施可以在服务提供者或服务消费者两端实现,通过设定流量阈值并采取排队、拒绝请求或返回错误信息等方式来控制流量,从而保护服务
  • 降级是针对服务消费者的应对策略,在服务出现异常或限流时,通过对服务调用进行降级处理,确保消费者端能够在异常情况下正常工作。降级的目的在于转变为弱依赖状态,使系统能够在服务不可用时提供基本的功能或数据。这种策略可以在服务消费者端实施,通过返回默认值、提供备用数据或简化功能等方式来保证系统的可用性。
  • 断路器:一个自动中断,恢复的功能,实际场景中用的不多。

在这里插入图片描述

1、Sentinel.dashbod 图形化界面安装

  1. 下载地址:https://github.com/alibaba/Sentinel/releases

  2. 启动:下面命令中的端口号可以根据需要修改

java -Dserver.port=9999 -Dcsp.sentinel.dashboard.server=localhost:9999 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.7.jar

在这里插入图片描述

  1. 通过 http://localhost:9999 访问图形化界面,密码默认为sentinel。
    在这里插入图片描述

2、alibaba-sentinel-server

服务端主要是限流配置

在这里插入图片描述

pom.xml

在本示例中,主要用到了三个主要组件,nacos服务发现,sentinel,以及nacos配置中心(做为sentinel规则的存储,否则当服务重启后规则就会丢失)

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-datasource</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>

application.properties配置

这里配置比较多,可参考上面jar包引用说明查看,主要是配置了Nacos和Sentinel控制台的地址。

spring.profiles.active = dev
spring.application.name=AlibabaSpringbootSentinelServer
server.port=19504management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=alwaysspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.fail-fast=true
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacosspring.cloud.sentinel.transport.dashboard=localhost:9999
spring.cloud.sentinel.transport.port=8719 #与sentinel通信的转用端口
spring.cloud.sentinel.eager=true
spring.cloud.sentinel.web-context-unify=truespring.cloud.sentinel.datasource.ds2.nacos.server-addr=127.0.0.1:8848
spring.cloud.sentinel.datasource.ds2.nacos.username=nacos
spring.cloud.sentinel.datasource.ds2.nacos.password=nacos
#需要nocas中配合一个名为 AlibabaSpringbootSentinelServer-sentinel 的文件,这里不需要加-dev啥的,因为这处指定死了名称
spring.cloud.sentinel.datasource.ds2.nacos.dataId=${spring.application.name}-sentinel
spring.cloud.sentinel.datasource.ds2.nacos.groupId=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds2.nacos.data-type=json
#type=flow 以 JSON 格式返回现有的限流规则,degrade 返回现有生效的降级规则列表,system 则返回系统保护规则。
spring.cloud.sentinel.datasource.ds2.nacos.rule-type=flow

SpringbootApplication启动类

主要是添加了@EnableDiscoveryClient注解,如果不需要服务发现可以去掉。

@Slf4j
@SpringBootApplication(scanBasePackages = {"com.korgs",  "cn.hutool.extra.spring"})
@Configuration
@EnableConfigurationProperties
@ServletComponentScan
@RestController
@EnableDiscoveryClient
public class AlibabaSpringbootSentinelServerApplication {@Value("${server.port}")private String serverPort;public static void main(String[] args) {SpringApplication.run(AlibabaSpringbootSentinelServerApplication.class, args);}@GetMapping("/helloworld/{uuid}")public BaseResponse<String> helloWorld(@PathVariable String uuid){String str = LogGenerator.trackLog()+ " uuid=" + uuid + " I am busy to handle this request."+ " serverPort=" + serverPort;log.info( str );return BaseResponse.success(str);}
}

Controller测试类实现

给普通的uri上添加@SentinelResource(value = "userInfo", blockHandler = "exceptionHandler"),这个注解在文章最后会详细解释。

@Slf4j
@RestController
@RequestMapping("/api/user")
public class UserController {@Value("${server.port}")private String serverPort;@SentinelResource(value = "userInfo", blockHandler = "exceptionHandler")@GetMapping("/userinfo/{uuid}")public BaseResponse<String> userInfo(@PathVariable String uuid){String str = LogGenerator.trackLog()+ " uuid=" + uuid + " I am busy to handle userInfo."+ " serverPort=" + serverPort;log.info( str );return BaseResponse.success(str);}@SentinelResource(value = "userOrder")@GetMapping("/userorderlist/{uuid}")public ListResponse<List<String>> userOrder(@PathVariable String uuid){String str = LogGenerator.trackLog()+ " uuid=" + uuid + " I am busy to handle userInfo."+ " serverPort=" + serverPort;log.info( str );List<String> userOrders = new ArrayList<>();userOrders.add("order1");userOrders.add("order2");userOrders.add("order3");userOrders.add("order4");return ListResponse.success(userOrders);}@SentinelResource(value = "userStatus")@GetMapping("/userstatus/{uuid}")public BaseResponse<String> userStatus(@PathVariable String uuid){String str = LogGenerator.trackLog()+ " uuid=" + uuid + " I am busy to handle userStatus."+ " serverPort=" + serverPort;return BaseResponse.success(str);}public BaseResponse<String> exceptionHandler(long s, BlockException ex) {ex.printStackTrace();return BaseResponse.error(s+"");}
}

3、Sentinel配置限流规则

限流规则配置

  • 配置之前要先启动 alibaba-sentinel-server 服务,然后登陆sentinel客户端,就可以发现此服务,然后在流控规则中新增规则即可。
    在这里插入图片描述
  • 配置规则,规则可以注解的value或uri来配置。
    比如下面这个配置
    @SentinelResource(value = "userInfo", blockHandler = "exceptionHandler")@GetMapping("/userinfo/{uuid}")public BaseResponse<String> userInfo(@PathVariable String uuid){}

资源名可以配置成userInfo,也可以配置成/userinfo/{uuid},一般建议配置成@SentinelResource注解的值,这样也起到了一个解耦的作用。
在这里插入图片描述

Controller限流功能测试

因为上面规则的阈值配置成了1,所以我们快速访问上述的userinfo地址。会发现uri返回时好时坏。在浏览器中打开http://localhost:19504/swagger-ui/index.html,如下:
在这里插入图片描述
上述红框就是限流后的返回结果。


4、alibaba-sentinel-client

客户端主要是降级配置,这个示例中添加了ribbon和RestTemplate支持,前者用于负载,后者用于远程访问。
在这里插入图片描述

pom.xml

    <dependencies><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>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency></dependencies>

application.properties配置

spring.profiles.active = dev
spring.application.name=AlibabaSpringbootSentinelClient
server.port=19505management.endpoints.web.exposure.include=*spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.fail-fast=true
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos#自定义配置服务端
service-url.nacos-service = http://AlibabaSpringbootSentinelServer

SpringbootApplication启动类

主要是添加了@EnableDiscoveryClient注解,如果不需要服务发现可以去掉。

@Slf4j
@SpringBootApplication(scanBasePackages = {"com.korgs",  "cn.hutool.extra.spring"})
@Configuration
@EnableConfigurationProperties
@ServletComponentScan
@RestController
@EnableDiscoveryClient
public class AlibabaSpringbootSentinelClientApplication {public static void main(String[] args) {SpringApplication.run(AlibabaSpringbootSentinelClientApplication.class, args);}@GetMapping("/helloworld")public String helloWorld(){log.info( LogGenerator.trackLog()+ "msg=" + "I am busy to handle this request.");return "hello world";}
}

配置RestTemplate

添加@SentinelRestTemplate,配置全局降级响应

@Configuration
public class RibbonConfig {@Bean@LoadBalanced@SentinelRestTemplatepublic RestTemplate restTemplate() {return new RestTemplate();}
}

Controller测试类实现

配置自定义降级响应,即被服务端限流后的响应

@Slf4j
@RestController
@RequestMapping("/api/load")
public class LoadUserController {@Autowiredprivate RestTemplate restTemplate;@Value("${service-url.nacos-service}")private String ribbonServiceUrl;/*熔断,降级,这里主要用到的是fallback标签*/@GetMapping("/fusing")@SentinelResource(value = "fusing", fallback = "handleFallback")public BaseResponse<String> fusing(String uuid){String result =  restTemplate.getForObject(ribbonServiceUrl + "/api/user/userinfo/{1}", String.class, uuid);return BaseResponse.success(result);}public BaseResponse<String> handleFallback(String uuid, Throwable e) {log.error("handleFallback2 id:{},throwable class:{}", uuid, e.getClass());return BaseResponse.error("服务降级返回");}
}

Controller被限流后的降级测试

  • 先启动 alibaba-sentinel-server
  • 再启动 alibaba-sentinel-client
  • 打开 http://localhost:19505/swagger-ui
    在这里插入图片描述
    当快速访问时就会发现,返回结果变成了自定义的描述了。

5、Sentinel详细使用说明

Sentinel注解

@SentinelRestTemplate注解

此注解的属性支持限流(blockHandler, blockHandlerClass)和降级(fallback, fallbackClass)的处理。下面的示例是演示调用服务时时支持的限流。

即在消费者一端实现的限流配置,但目的也是为了保护服务提供者,一般不太常用,还是在提供者端配置为好。在消费端限流(也称降级)是指在服务提供者发生异常后,客户端的的处理逻辑

//配置全局限流异常
@Bean
@SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class)
public RestTemplate restTemplate() {return new RestTemplate();
}

@SentinelRestTemplate注解 中 blockHandler 或 fallback 属性对应的方法必须是对应 blockHandlerClass 或 fallbackClass 属性中的静态方法。
该方法的参数跟返回值跟 org.springframework.http.client.ClientHttpRequestInterceptor#interceptor 方法一致,其中参数多出了一个 BlockException 参数用于获取 Sentinel 捕获的异常。

比如上述 @SentinelRestTemplate 注解中 ExceptionUtil 的 handleException 属性对应的方法声明如下:

public class ExceptionUtil {public static ClientHttpResponse handleException(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException exception) {}public static SentinelClientHttpResponse handleException(HttpRequest request,byte[] body, ClientHttpRequestExecution execution, BlockException ex) {System.out.println("Oops: " + ex.getClass().getCanonicalName());return new SentinelClientHttpResponse("custom block info");}
}

当使用 RestTemplate 调用被 Sentinel 熔断后,会返回 RestTemplate request block by sentinel 信息,或者也可以编写对应的方法自行处理返回信息。这里提供了 SentinelClientHttpResponse 用于构造返回信息。

@SentinelResource 注解

public class TestService {// 原函数@SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")public String hello(long s) {return String.format("Hello at %d", s);}// Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数.public String helloFallback(long s) {return String.format("Halooooo %d", s);}// Block 异常处理函数,参数最后多一个 BlockException,其余与原函数一致.public String exceptionHandler(long s, BlockException ex) {ex.printStackTrace();return "Oops, error occurred at " + s;}// 这里单独演示 blockHandlerClass 的配置.// 对应的 `handleException` 函数需要位于 `ExceptionUtil` 类中,并且必须为 public static 函数.@SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})public void test() {System.out.println("Test");}
}
  • value:资源名称,必需项(不能为空)
  • entryType:entry 类型,可选项(默认为 EntryType.OUT)
  • blockHandler / blockHandlerClass(限流处理): blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • fallback / fallbackClass(异常处理):fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
    • 返回值类型必须与原函数返回值类型一致;
    • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
    • 返回值类型必须与原函数返回值类型一致;
    • 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    • defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

配置全局异常处理

Sentinel内置的 URL 限流触发后默认处理逻辑是,直接返回 “Blocked by Sentinel (flow limiting)”。 如果需要自定义处理逻辑,实现的方式如下:

public class CustomUrlBlockHandler implements UrlBlockHandler {@Overridepublic void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {// todo add your logic}
}WebCallbackManager.setUrlBlockHandler(new CustomUrlBlockHandler());

Sentinel中配置限流规则

可以sentinel图形化界面中配置限流规则,可以用资源名,也可以添加相对的url路径,比如下面例子,在资源名对话框中可以配置userInfo 或 /api/user/userinfo

@RestController("/api/user")
public class UserController{@SentinelResource(value = "userInfo", blockHandler = "exceptionHandler")@GetMapping("/userinfo")public BaseResponse<String> userInfo(String uuid){String str = LogGenerator.trackLog()+ " uuid=" + uuid + " I am busy to handle userInfo."+ " serverPort=" + serverPort;log.info( str );return BaseResponse.success(str);}
}

给sentinel提供 ReadableDataSource 存储支持

默认情况下,当我们在Sentinel控制台中配置规则时,控制台推送规则方式是通过API将规则推送至客户端并直接更新到内存中。一旦我们重启应用,规则将消失。

Sentinel starter 整合了目前存在的几类 ReadableDataSource。只需要在配置文件中进行相关配置,即可在 Spring 容器中自动注册 DataSource。 下面我们介绍下如何将配置规则进行持久化,以存储到Nacos为例。

spring.cloud.sentinel.datasource.ds2.nacos.server-addr=127.0.0.1:8848
spring.cloud.sentinel.datasource.ds2.nacos.username=nacos
spring.cloud.sentinel.datasource.ds2.nacos.password=nacos#需要nocas中配合一个名为 AlibabaSpringbootSentinelServer-sentinel 的文件,这里不需要加-dev啥的,因为这处指定死了名称
spring.cloud.sentinel.datasource.ds2.nacos.dataId=${spring.application.name}-sentinel
spring.cloud.sentinel.datasource.ds2.nacos.groupId=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds2.nacos.data-type=json#type=flow 以 JSON 格式返回现有的限流规则,degrade 返回现有生效的降级规则列表,system 则返回系统保护规则。
spring.cloud.sentinel.datasource.ds2.nacos.rule-type=flow

然后在nacos中配置一外名为AlibabaSpringbootSentinelServer-sentinel的文件,这样就会在sentinel中存储了。文件内容如下:

[{"resource": "userInfo", //资源名称"limitApp": "default", //来源应用"grade": 1,   //阈值类型,0表示线程数,1表示QPS"count": 1,    //单机阈值"strategy": 0,  //流控模式,0表示直接,1表示关联,2表示链路"controlBehavior": 0,  //流控效果,0表示快速失败,1表示Warm Up,2表示排队等待"clusterMode": false  //是否集群}
]

6、与openFeign配合实现降级

  • alibaba-sentinel-openFeign-client:19508

此服务和上面的是alibaba-sentinel-client功能一样,只不过把ribbon换成了openFiegn实现,测试方法也完全一样,不详细说了。

但在业务实现中建议使用openFiegn。

在这里插入图片描述

源码下载

涉及模块:

  • alibaba-sentinel-server:19501,服务端
  • alibaba-sentinel-client : 19506, ribbon实现的客户端
  • alibaba-sentinel-openFeign-client: 19508,openFeign实现的客户端

源码下载:

  • 基础框架源码下载
  • Alibaba SpringCloud集成Nacos、Sentinel实现服务治理

源码运行方法:

  • 模块详细功能说明和运行测试方法

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

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

相关文章

【linux系统学习教程 Day02】网络安全之Linux系统学习教程,管道,文件内容统计,过滤排序,去重,目录介绍

1-4 管道 管道符号&#xff1a; | &#xff0c;可以将前面指令的执行结果&#xff0c;作为后面指令的操作内容。 ## 比如过滤ip地址 ip addr | tail -4 | head -1 解释一下就是先执行 ip addr ,得到的结果当做 tail -4 的输入&#xff0c;意思就是查看ip addr 结果的后四行内容…

基于NIOS-II软核流水灯实现

文章目录 一、创建工程二、系统设计1. 在 “component library” 标签栏中找到 “Nios II Processor” 后点击 Add2. 在 ”Component Library” 标签栏中的查找窗口输入 jtag 找到 ”JTAG UART ”&#xff0c;然后点击 Add3. 添加片上存储器 On-Chip Memory(RAM)核4. 查找窗口输…

如何创建和运营新版Facebook粉丝专页

在众多平台中&#xff0c;Facebook粉丝专页无疑是连接全球消费者、扩展品牌影响力的重要工具。如果你是初次接触Facebook粉丝专页&#xff0c;可能会感到有些迷茫——毕竟&#xff0c;只是听说过它的好处&#xff0c;却不知道如何开始。 Facebook粉丝专页不仅是一个分享产品信…

使用Docker创建verdaccio私服

verdaccio官网 1.Docker安装 这边以Ubuntu安装为例Ubuntu 安装Docker​&#xff0c;具体安装方式请根据自己电脑自行搜索。 2.下载verdaccio docker pull verdaccio/verdaccio3.运行verdaccio 运行容器&#xff1a; docker run -it -d --name verdaccio -p 4873:4873 ver…

unordered_map、unordered_set底层封装

文章目录 一、先实现哈希桶1.1哈希桶的实现方法1.2日常普遍的哈希桶存放的数据有两种&#xff1a;字符串和整形1.3哈希桶的实现代码详解1.3.1哈希桶的两种仿函数&#xff08;int和string&#xff09;1.3.2哈希桶的节点&#xff08;如果桶非常深&#xff0c;这里考虑挂红黑树&am…

苹果M4芯片:大模型本地运算的转折点

在人工智能和机器学习领域&#xff0c;大模型的兴起对硬件提出了前所未有的挑战。苹果公司最近推出的M4芯片&#xff0c;被视为其在这场竞赛中的“第一式”。本文将探讨M4芯片的特点&#xff0c;并与其他芯片进行比较。 M4芯片的亮点 Neural Engine算力&#xff1a;M4芯片的…

Samtec技术分享 | 电源/信号高密度阵列的新视角

【摘要/前言】 “角度”&#xff0c;这个词每天都出现在我们的生活中&#xff0c;有物理学的角度&#xff0c;如街边的拐角&#xff0c;还有视觉上的角度和观点中的角度~ Samtec新型 AcceleRate mP 高密度电源/信号互连系统正是从电源完整性 90度旋转的不同角度中诞生的。 …

深度学习之激活函数——Tanh

Tanh 双曲正切1函数(tanh)&#xff0c;其图像与sigmoid函数十分相近&#xff0c;相当于sigmoid函数的放大版。在实际的使用中&#xff0c;tanh函数要优先于sigmoid函数。 函数表达式 t a n h e x − e − x e x e − x tanh\frac{e^x-e^{-x}}{e^xe^{-x}} tanhexe−xex−e−…

Git大文件无法直接push用git lfs track 上传大文件具体操作

Git 因为大文件push失败 回退到git add前用git lfs track单独添加大文件 以下work flow仅代表个人解决问题的办法&#xff0c;有优化流程的欢迎交流 回退到git add前 以下指令回退一个commit git reset --soft HEAD~1以下指令撤销所有git add操作&#xff0c;但不删除本地修…

数字绘画教学实训解决方案

一、建设背景 1.1政策背景 教育信息化政策推动&#xff1a;近年来&#xff0c;随着教育信息化政策的不断推动&#xff0c;各级教育部门纷纷出台相关政策&#xff0c;鼓励和支持教育信息化的发展。数字绘画作为现代艺术教育的重要组成部分&#xff0c;其教学实训解决方案的建设…

Netgear无线路由器漏洞复现(CVE-2019-20760)

漏洞概述 漏洞服务&#xff1a; uhttpd 漏洞类型&#xff1a; 远程命令执行 影响范围&#xff1a; 1.0.4.26之前的NETGEAR R9000设备会受到身份验证绕过的影响 解决建议&#xff1a; 更新版本 漏洞复现 操作环境&#xff1a; ubuntu:22.04 qemu-version&#xff1a; 8.1…

【JVM】从三种认知角度重识JVM

目录 JVM概述 JVM主要功能 虚拟机是Java平台无关的保障 JVM概述 JVM&#xff1a;Java Virtual Machine,也就是Java虚拟机。 虚拟机&#xff1a;通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统&#xff08;物理上不存在&#xff09;。 JVM通…

聊聊ChatGPT:智能语言模型背后的原理

目录 1. ChatGPT的基础&#xff1a;GPT模型 2. 预训练与微调&#xff1a;让模型更加智能 2.1 预训练 2.2 微调 3. 多样化的应用场景 4. 未来的展望 5. 结语 在当今的人工智能领域&#xff0c;OpenAI的ChatGPT无疑是一个炙手可热的话题。它不仅能流畅地进行对话&#xff…

一键批量合并视频:掌握视频剪辑技巧解析,轻松创作完美影片

在数字时代的浪潮下&#xff0c;视频已成为人们记录和分享生活的重要工具。然而&#xff0c;对于许多非专业视频编辑者来说&#xff0c;将多个视频片段合并成一个完整的影片却是一项复杂且耗时的任务。幸运的是&#xff0c;云炫AI智剪一键批量合并视频功能的出现&#xff0c;让…

ICode国际青少年编程竞赛- Python-5级训练场-综合练习5

ICode国际青少年编程竞赛- Python-5级训练场-综合练习5 1、 a 16 for i in range(6):Dev.step(1)Dev.turnLeft()Dev.step(a)Dev.step(-a)Dev.turnRight()while Dev.energy < 100:wait()Dev.step(1)a a - 5 i2、 for i in range(5):Dev.step(11 - i * 2)Dev.turnRight()wh…

人工智能中的概率魔法:解锁不确定性的智慧之钥

在人工智能&#xff08;AI&#xff09;的广阔天地中&#xff0c;概率论以其独特的魅力&#xff0c;成为了连接现实世界与智能决策的桥梁。从语音识别到图像识别&#xff0c;从自然语言处理到机器翻译&#xff0c;从智能推荐到自动驾驶&#xff0c;概率论知识在这些领域中发挥着…

高低温试验箱型号怎么选择?多禾试验带你一起探索

高低温试验箱在工业和科学研究当中扮演着至关重要的角色。无论是在电子、汽车、医疗器械还是航空航天领域&#xff0c;都需要对产品在不同温度条件下的性能进行测试。然而&#xff0c;在进行选择适合自己需求的高低温试验箱型号时&#xff0c;面对市场上琳琅满目的设备&#xf…

给定两点所能得到的数学关系

给定两点所能得到的数学关系 正文 正文 这里介绍一个基础问题&#xff0c;如果给定平面上的两个点的坐标&#xff0c;那么它们之间能够得到什么数学关系呢&#xff1f; ω arctan ⁡ y 1 − y 0 x 1 − x 0 x 1 − x 0 d cos ⁡ ω y 1 − y 0 d cos ⁡ ω d ( x 1 − x…

GIT基础01 基础命令与分支

前言 我们知道git是开发中比较常见的版本控制工具 我们可以先提出一个场景: 老板让你去修改方案 第一次修改 打回 第二次修改 打回 第n次修改 老板让你使用第一次的版本 阁下如何应对??? 我对每个版本进行编号?? 是一种方案 但是这里也是有缺陷的 比如说在很多版本中找…

什么是MVC?什么是SpringMVC?什么是三层架构?

文章目录 应用分层什么是MVC?什么是 SpringMVC&#xff1f;三层架构三层架构和MVC的关系 应用分层 在讲解什么是MVC之前&#xff0c;先来理解一下什么是应用分层。 应用分层是一种软件开发设计思想&#xff0c;将应用程序划分成N个层次&#xff0c;每个层次都分别负责自己的…