Spring Cloud Alibaba

文章目录

  • Spring Cloud Alibaba
  • 1 介绍
  • 2 Nacos(注册中心和配置中心)
    • 2.1 示例
  • 3 Sentinel(流量控制和熔断降级)
    • 3.1 流量控制示例
  • 4 GateWay
    • 4.1 断言
    • 4.2 过滤器
      • 4.2.1 局部过滤器
      • 4.2.2 全局过滤器
    • 4.3 网关限流
  • 5 链路追踪Sleuth

Spring Cloud Alibaba

1 介绍

Spring Cloud Alibaba 是 Spring Cloud 的一个子项目,它为基于 Spring Cloud 的微服务架构提供了丰富的生态系统和工具,同时与阿里巴巴的一些开源产品(如 Nacos、Sentinel 等)深度集成,以提供更全面的解决方案。

以下是 Spring Cloud Alibaba 的一些主要组件和特性:

  1. Nacos(注册中心和配置中心): Nacos 是一个动态服务发现、配置管理和服务管理平台。Spring Cloud Alibaba 使用 Nacos 作为注册中心和配置中心,使得微服务实例的注册、发现和配置管理更加方便。

  2. Sentinel(流量控制和熔断降级): Sentinel 是一种流量控制、熔断降级的解决方案,可以保障微服务的稳定性。Spring Cloud Alibaba 集成了 Sentinel,使得开发者可以在微服务中方便地实现流量控制、熔断降级等功能。

  3. RocketMQ(消息驱动): RocketMQ 是阿里巴巴开源的消息中间件,支持分布式事务消息。Spring Cloud Alibaba 集成了 RocketMQ,为微服务架构提供了可靠的消息驱动能力。

  4. Seata(分布式事务): Seata 是一款开源的分布式事务解决方案,可以解决微服务架构中分布式事务的问题。Spring Cloud Alibaba 集成了 Seata,为开发者提供了分布式事务的支持。

  5. Dubbo(RPC通信): Spring Cloud Alibaba 提供了 Dubbo 的集成,使得开发者可以选择使用 Dubbo 作为微服务之间的 RPC 通信框架。

  6. Alibaba Cloud 支持: Spring Cloud Alibaba 与 Alibaba Cloud 紧密集成,提供了对阿里云服务的良好支持,包括配置中心、服务发现、负载均衡等。

总体而言,Spring Cloud Alibaba 通过整合阿里巴巴的开源产品,为基于 Spring Cloud 的微服务架构提供了一套全面的解决方案,帮助开发者构建和管理分布式系统。

在这里插入图片描述

2 Nacos(注册中心和配置中心)

Nacos(官方全称是 “Dynamic Naming and Configuration Service”)是阿里巴巴开源的一个动态服务发现、配置管理和服务治理平台。它提供了一种简单而强大的方式,帮助开发者实现微服务架构中的服务注册、发现、配置管理以及动态 DNS 服务等功能。以下是 Nacos 的一些主要特点和功能:

  1. 服务发现与注册: Nacos允许微服务应用在运行时进行服务注册和发现。服务提供者在启动时向 Nacos 注册自己的服务,而服务消费者可以通过 Nacos 查询并发现可用的服务实例。

  2. 配置管理: Nacos 提供了一套集中式的配置管理中心,可以帮助开发者集中管理应用的配置信息。Nacos 支持配置的版本管理、灰度发布等功能,使得配置的变更可以动态生效,而无需重启应用。

  3. 动态 DNS: Nacos 可以作为一个动态 DNS 服务,为微服务提供简单的域名解析。这样,服务之间可以通过域名进行通信,而无需硬编码 IP 地址。

  4. 服务健康检查: Nacos 通过心跳机制检测服务的健康状态,自动剔除不健康的实例,确保服务的可用性。

  5. 分布式系统支持: Nacos 是一个分布式系统的基础设施,支持多数据中心、多环境配置管理,以及集群部署,保障了高可用性和可扩展性。

  6. 开放API和插件扩展: Nacos 提供了 RESTful API,支持通过 API 进行服务注册、发现和配置管理。同时,Nacos 支持插件扩展,使得开发者可以根据自己的需求进行功能扩展。

  7. 轻量级和易集成: Nacos 设计为轻量级的系统,易于集成到不同的微服务架构中,包括 Spring Cloud、Dubbo、Kubernetes 等。

Nacos(Namespace and Configuration Service)是阿里巴巴开源的一个分布式服务和配置中心。它提供了服务发现、服务健康监测、动态配置管理等功能。以下是一个简单的示例,演示如何使用 Nacos 进行服务注册和配置管理。

2.1 示例

  1. 下载并启动 Nacos

    首先,需要下载并启动 Nacos 服务器。可以从 Nacos GitHub Releases 页面下载最新版本的 Nacos,并按照 Nacos Quick Start 的说明进行部署。

  2. 创建 Spring Boot 项目

    创建一个简单的 Spring Boot 项目,并添加以下 Maven 依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </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>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>
    
  3. 配置应用信息和 Nacos 配置

    application.properties 文件中配置应用信息和连接 Nacos 服务的信息:

    # 应用信息
    spring.application.name=application
    server.port=8080
    
    # Nacos 服务地址
    spring.cloud.nacos.discovery.server-addr=localhost:8848
    
  4. 创建一个简单的控制器,演示从 Nacos 获取配置和服务注册的信息:

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class DemoController {
    
        @Value("${config.info:default-config}")
        private String configInfo;
    
        @GetMapping("/config")
        public String getConfigInfo() {
            return "Config Info: " + configInfo;
        }
    
        @GetMapping("/hello")
        public String sayHello() {
            return "Hello from Nacos";
        }
    }
    
  5. 启动应用
    运行应用,应用会自动注册到 Nacos,并提供 /config/hello 两个接口。可以在 Nacos 控制台中查看注册的服务和配置信息。可以根据 Nacos 文档 进一步了解和使用 Nacos。

3 Sentinel(流量控制和熔断降级)

Sentinel(中文名“哨兵”)是一款由阿里巴巴开源的分布式系统的流量防卫工具。它旨在提供高可用性和高稳定性的服务,通过实时的流量控制、熔断降级、系统负载保护等手段,确保分布式系统在面临大流量、复杂业务场景时仍能保持稳定。

以下是 Sentinel 的一些主要特点和功能:

  1. 流量控制: Sentinel 提供实时的流量控制功能,可以根据系统的实际情况对入口流量进行控制,防止系统因过载而崩溃。

  2. 熔断降级: Sentinel 支持熔断降级功能,当系统的某个服务出现问题或不可用时,可以迅速切断对该服务的请求,防止故障蔓延,提高系统的整体稳定性。

  3. 系统负载保护: Sentinel 可以根据系统负载情况进行保护,避免系统因过度负载而崩溃。它可以通过控制并发线程数、QPS(每秒查询数)等方式来保护系统。

  4. 实时监控和统计: Sentinel 提供实时的监控和统计功能,可以查看系统的实时运行情况、异常情况和流量等信息,帮助开发者及时发现和解决问题。

  5. 规则配置: Sentinel 允许开发者通过配置规则来定义流量控制、熔断降级等策略,使其更加灵活适应不同的业务场景。

  6. 集成 Spring Cloud、Dubbo 等: Sentinel 提供了对多种框架的集成支持,包括 Spring Cloud、Dubbo 等,使其在微服务架构中的使用更加方便。

  7. 广泛的应用场景: Sentinel 可以应用于各种场景,包括网关限流、服务降级、热点参数限流等,适用于互联网、金融、电商等多个领域。

总体而言,Sentinel 是一款强大的分布式系统流量防卫工具,通过对流量进行实时控制和监控,可以帮助开发者构建稳定、高可用的分布式系统。.

3.1 流量控制示例

cmd命令框执行

java -jar sentinel-dashboard-1.8.1.jar

打开浏览器输入http://localhost:8080:
在这里插入图片描述
用户名和密码都为sentinel,输入后跳转,先执行:
在这里插入图片描述
点击流控规则
在这里插入图片描述

第一次访问:
在这里插入图片描述
再次访问,被限流:
在这里插入图片描述

4 GateWay

4.1 断言

application.yml添加内容:

predicates:
  - Path=/order-ser/**  # 如果要访问我们的order-server的微服务,请求路径中必须携带 order-ser
  - Before=2023-12-08T00:00:00.000+08:00[Asia/Shanghai] #限制请求时间在 2023-12-08之前
  - Method=GET  #限制请求方式只能是 GET请求
  - Age=20,60 #限制年龄是20岁到60岁可以访问

浏览器输入http://localhost:7000/order-ser/order/prod/1:
在这里插入图片描述
发现行不通,由于加入了年龄断言工厂,并且设置可访问的年龄区间为20到60岁。
浏览器输入http://localhost:7000/order-ser/order/prod/1?age=18:
在这里插入图片描述
由于18不在规定的年龄范围,所以访问失败,将18改为28:
在这里插入图片描述
访问成功!断言设置成功!

4.2 过滤器

4.2.1 局部过滤器

application.yml添加内容:

filters:
   - StripPrefix=1 #请求转发之前去掉一层路径
   - Log=true,false #日志是否开启

浏览器输入http://localhost:7000/order-ser/order/prod/1?age=28,访问成功后查看控制台打印:
在这里插入图片描述

4.2.2 全局过滤器

先注释掉- Age 和 - Log

 predicates:
            - Path=/order-ser/**  # 如果要访问我们的order-server的微服务,请求路径中必须携带 order-ser
            - Before=2023-12-08T00:00:00.000+08:00[Asia/Shanghai] #限制请求时间在 2023-12-08之前
            - Method=GET  #限制请求方式只能是 GET请求
          #  - Age=20,60 #限制年龄是20岁到60岁可以访问
          filters:
            - StripPrefix=1 #请求转发之前去掉一层路径
          #  - Log=true,false #日志是否开启

自定义 AuthGlobalFilter 网关全局过滤器:

import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

//全局的权限过滤器
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    //完成逻辑判断
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取浏览器传递过来的token
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        //实际可以注入 userService.findUserByName()获取token
        if(!StringUtils.equals(token,"admin")){   // import org.apache.commons.lang3.StringUtils;
            System.out.println("鉴权失败!");
            //设置没有权限
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            //就不能往下面的流程
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    //优先级  ,数字越小 级别越高
    @Override
    public int getOrder() {
        return 0;
    }
}

浏览器输入http://localhost:7000/order-ser/order/prod/1?token=admin
在这里插入图片描述
浏览器输入http://localhost:7000/order-ser/order/prod/1?token=ad:
在这里插入图片描述
查看控制台打印:
在这里插入图片描述
全局的权限过滤器设置成功!

4.3 网关限流

添加依赖

<dependency>
	<groupId>com.alibaba.csp</groupId>
	<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>

网关限流配置类GatewayConfiguration:

import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.reactive.result.view.ViewResolver;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import javax.annotation.PostConstruct;
import java.util.*;

//网关限流配置类
@Configuration
public class GatewayConfiguration {

    private  final List<ViewResolver> viewResolvers;

    private  final ServerCodecConfigurer serverCodecConfigurer;

    public GatewayConfiguration(List<ViewResolver> viewResolvers, ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolvers;
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    //初始化限流的过滤器
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)//Spring 4.0中默认情况下遵循从低到高的顺序,即最低值具有高优先级。
    //这意味着它们首先出现在列表或数组中
    public GlobalFilter sentinelGatewayFilter(){
        return new SentinelGatewayFilter();
    }

    // 配置初始化的限流参数
    @PostConstruct
    public void initGatewayRules(){
        Set<GatewayFlowRule> rules = new HashSet<>();
        //添加资源名,对应的是路由id
        rules.add(new GatewayFlowRule("order_route").setCount(1).setIntervalSec(1));//统计时间窗口,单位是秒
        //加入网关
        GatewayRuleManager.loadRules(rules);
    }

    //配置限流异常处理接口
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler(){
        return  new SentinelGatewayBlockExceptionHandler(viewResolvers,serverCodecConfigurer);
    }

    //自定义一个处理异常的页面
    @PostConstruct
    public void initBlockExceptionHandler(){

        BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                Map map = new HashMap();
                map.put("code",500012);
                map.put("message","接口已被限流了");

                return ServerResponse.status(HttpStatus.OK).
                        contentType(MediaType.APPLICATION_JSON_UTF8).
                        body(BodyInserters.fromObject(map));

            }
        };
        GatewayCallbackManager.setBlockHandler(blockRequestHandler);
    }
}

第一次访问http://localhost:7000/order-ser/order/prod/1:
在这里插入图片描述
第二次访问http://localhost:7000/order-ser/order/prod/1:
在这里插入图片描述

5 链路追踪Sleuth

SpringCloud Alibaba技术栈中没有自己的链路追踪,可以用 Sleuth + Zipkin 来做链路追踪技术

添加依赖

<!--链路追踪-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

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

在zipkin-server-2.12.9-exec.jar目录下的cmd命令框执行

java -jar zipkin-server-2.12.9-exec.jar

浏览器访问http://localhost:9411:
在这里插入图片描述
然后浏览器访问http://localhost:7000/order-ser/order/prod/1:
在这里插入图片描述
刷新http://localhost:9411页面,点击查找:
在这里插入图片描述
点击下面的蓝条:
在这里插入图片描述
可以看到明显的调用关系,点击任意一个服务(这里点击的是order-server):
在这里插入图片描述
可以清晰的看到

在这里插入图片描述

在这里插入图片描述
zipkin 持久化命令行:

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=kdx010908

在zipkin-server-2.12.9-exec.jar目录下的cmd命令框执行该命令
然后浏览器访问http://localhost:7000/order-ser/order/prod/1,查看数据库表zipkin_spans:
在这里插入图片描述
查看数据库表zipkin_annotations:
在这里插入图片描述
实现了zipkin 持久化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT案例 使用WMI获取win_32类的属性值,包括Win32提供程序类中的属性

最近涉及到读取WINDOWS 系统电脑设备的各种信息&#xff0c;在一些特殊的PE或者简化系统中是没有WMI查询工具的&#xff0c;所以就自己写了个查询大部分WMI属性值的工具&#xff0c;免去了查网站的功夫。涉及到的方法内容就汇总做个总结。 PS:因为工作中软件基本都是我一个人开…

改进lora-scripts,支持SDXL训练,以及启动脚本

分享下自己改进的一个lora训练脚本&#xff0c;在ubuntu下如果SD-WEBUI的环境已经搭好的话&#xff0c;只需要下载lora-script就可以支持训练了&#xff0c;直接命令行方式训练。 首先&#xff0c;我们需要克隆下项目&#xff1a; git clone https://github.com/Akegarasu/lo…

docker安装Prometheus

docker安装Prometheus Docker搭建Prometheus监控系统 环境准备(这里的环境和版本是经过测试没有问题,并不是必须这个版本) 主机名IP配置系统说明localhost随意2核4gCentOS7或者Ubuntu20.0.4docker版本23.0.1或者24.0.5,docker-compose版本1.29 安装Docker Ubuntu20.0.4版本…

NO-IOT翻频,什么是翻频,电信为什么翻频

1.1 翻频迁移最终的目的就是减少网络的相互干扰&#xff0c;提供使用质量. 1.2 随着与日俱增的网络规模的扩大&#xff0c;网内干扰已成了影响网络的质量标准之一&#xff0c;为了保障电信上网体验&#xff0c;满足用户日益增长的网速需求,更好的服务客户&#xff0c;电信针对…

JAVAEE大型金融支付-第1章-讲义-项目介绍

第1章 讲义-项目介绍与环境搭建 1.项目背景 1.1 项目背景 随着移动支付的盛行&#xff0c;商业银行、第三方支付公司、其它清算机构、消费金融公司等众多类型的机构&#xff0c;都在为商户 提供网络&#xff08;移动&#xff09;支付解决方案。另一方面&#xff0c;用户的支…

视频推拉流平台EasyDSS点播文件播放请求添加token验证的实现方法

EasyDSS视频直播点播平台可提供一站式的视频推拉流、转码、点播、直播、播放H.265编码视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播等应用。今天我们来介绍下EasyDSS系统点播文件播放请求添加tok…

谷歌的开源供应链安全

本内容是对Go项目负责人Russ Cox 在 ACM SCORED 活动上演讲内容[1]的摘录与整理。 SCORED 是Software Supply Chain Offensive Research and Ecosystem Defenses的简称, SCORED 23[2]于2023年11月30日在丹麦哥本哈根及远程参会形式举行。 摘要 &#x1f4a1; 谷歌在开源软件供应…

Tor网络原理详解

引入 匿名通信是一种通过采用数据转发、内容加密、流量混淆等措施来隐藏通信内容及关系的隐私保护技术。为了提高通信的匿名性&#xff0c;这些数据转发链路通常由多跳加密代理服务节点构成&#xff0c;而所有这些节点即构成了匿名通信系统&#xff08;或称匿名通信网络&#…

Flask学习四:补充

插件 flask-caching 简介 Flask-Caching 是一个 Flask 扩展&#xff0c;旨在为 Flask 应用程序添加缓存功能。缓存是一种提高应用性能的技术&#xff0c;通过将常用数据暂时存储在一个快速访问的位置&#xff08;如内存或磁盘&#xff09;&#xff0c;从而减少对较慢资源&…

【Nginx】Nginx了解(基础)

文章目录 Nginx产生的原因Nginx简介Nginx的作用反向代理负载均衡策略动静分离 Nginx的Windows下的安装Linux下的安装Nginx常用命令 负载均衡功能演示 Nginx产生的原因 背景 一个公司的项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发…

MIT6.5840-2023-Lab2C: Raft-Persistence

前置知识 见上一篇 Lab2A。 实验内容 实现 RAFT&#xff0c;分为四个 part&#xff1a;leader election、log、persistence、log compaction。 实验环境 OS&#xff1a;WSL-Ubuntu-18.04 golang&#xff1a;go1.17.6 linux/amd64 Part 2C: persistence 大部分的bug都与这…

Datawhale 12月组队学习 leetcode基础 day3 递归

这是一个新的专栏&#xff0c;主要是一些算法的基础&#xff0c;对想要刷leedcode的同学会有一定的帮助&#xff0c;如果在算法学习中遇到了问题&#xff0c;也可以直接评论或者私信博主&#xff0c;一定倾囊相助 进入正题&#xff0c;今天咱们要说的是递归&#xff0c;递归是是…

SpringBoot 自动装配原理---源码详解

目录 SpringBoot 自动装配原理源码流程详解&#xff1a;流程总结&#xff1a;条件匹配解释&#xff1a;其他解释&#xff1a; SpringBoot 自动装配原理 源码流程详解&#xff1a; 1、先看启动类&#xff0c;启动这个main方法&#xff0c;然后调用这个run方法。 2、把 启动类作…

牛客网 DP35 【模板】二维前缀和

代码&#xff1a; import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { //…

netty-daxin-3(rpc远程调用)

文章目录 nettyRpcObjectEncoder 与 ObjectDecoderjdk动态代理回顾Rpc调用过程简析服务端客户端 nettyRpc ObjectEncoder 与 ObjectDecoder ObjectEncoder继承自MessageToByteEncoder<Serializable>&#xff0c;它内部使用ByteBufOutputStream包装ByteBuf对象&#xff…

Python 爬虫之简单的爬虫(一)

爬取网页上所有链接 文章目录 爬取网页上所有链接前言一、基本内容二、代码编写1.引入库2.测试网页3.请求网页4.解析网页并保存 三、如何定义请求头&#xff1f;总结 前言 最近也学了点爬虫的东西。今天就先给大家写一个简单的爬虫吧。循序渐进&#xff0c;慢慢来哈哈哈哈哈哈…

TrustGeo代码理解(一)main.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入各种模块和数据库 # -*- coding: utf-8 -*- import torch.nnfrom lib.utils import * import argparse, os import numpy as np import random from lib.model import * import copy from thop import profile imp…

devc++如何建立一个c++项目?devc++提示源文件未编译?

打开devc APP后是这样的界面&#xff1b; 点击文件-> 新建->项目&#xff0c;这一点应该不难&#xff0c;主要是最后这个选择什么&#xff1f; 这样即可。 devc提示源文件未编译&#xff1f; 点击工具->编译选项&#xff1b; 如果不能解决&#xff0c;那就是可能路径…

NNDL 循环神经网络-梯度爆炸实验 [HBU]

目录 6.2.1 梯度打印函数 6.2.2 复现梯度爆炸现象 6.2.3 使用梯度截断解决梯度爆炸问题 【思考题】梯度截断解决梯度爆炸问题的原理是什么&#xff1f; 总结 前言&#xff1a; 造成简单循环网络较难建模长程依赖问题的原因有两个&#xff1a;梯度爆炸和梯度消失。 循环…

代码随想录算法训练营第53天| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

JAVA代码编写 1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情…