Sentinel结合Nacos实现配置持久化(全面)
1、前言
我们在进行分布式系统的开发中,无论是在开发环境还是发布环境,配置一定不能是内存形式的,因为系统可能会在中途宕机或者重启,所以如果放在内存中,那么配置在服务停到就是就会消失,那么此时就需要重新再进行配置,一个两个服务还好,如果服务一多,那就是一件很费时费力的事情了。
所以我们还是需要把我们的配置信息持久化到配置中心,这也是目前主流的方式。
分布式系统中常见的配置中心有Nacos、ZooKeeper、Apollo、Consul等等,
本文中使用Nacos作为配置中心和服务中心。
配置持久化主要有以下原因:
- 数据安全性:持久化配置可以保证在系统或者应用重启后,重要的配置数据不会丢失,可以确保数据的安全性和稳定性。
- 数据可恢复性:持久化配置可以在数据丢失或者损坏时进行恢复,保证系统的正常运行。
- 支持分布式系统:对于分布式系统来说,配置的持久化可以确保各个节点的一致性,避免因为节点的临时变动导致的问题。
- 可扩展性:持久化配置易于进行扩展和修改,可以适应不同的应用场景和业务需求。
- 提高系统性能:通过实现配置的持久化,可以有效减少读取配置文件的次数,提高系统的运行效率。
- 降低耦合性:持久化配置可以使得应用和配置之间松散耦合,方便系统的维护和升级。
2、微服务整合Sentinel和Nacos
在分布式的系统中,微服务是最基本的要求,所以我们就需要对微服务进行服务注册发现、配置和流控。
2.1、引入依赖
在微服务整合sentinel和Nacos是需要父pom中已经引入了spring-cloud-alibaba-dependencies
这个依赖,这个依赖中管理里当前版本中所有组件的版本信息。切记:在微服务中要特别注意各种依赖的版本。
<!--nacos服务注册与发现-->
<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><!--sentinel依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency><!--以nacos作为sentinel数据源的依赖-->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2.2、application.yaml文件的编写
spring:application:name: ${application_name}main:banner-mode: offlazy-initialization: truecloud:nacos: # 配置nacos信息discovery:server-addr: ${nacos_server}config:server-addr: ${nacos_server}file-extension: yaml
因为我们用nacos作为了配置中心,我们可以将sentinel的基本配置放入到nacos中就可以了,所以当前服务的yaml配置文件中只需要写一些基本的配置就可以了。
2.3、在Nacos中配置sentinel信息
spring:cloud:sentinel:transport:dashboard: localhost:8080 ##sentinel的控制面板地址datasource: # sentinel用nacos作为数据源的配置flux-control: # 流控管理(这个名称可以自定义)nacos: # 告诉sentinel用nacos作为数据源data-id: feign-test_flux-control_config.json # 配置中心里执行文件的dataIdserver-addr: ${nacos_server} # nacos的地址rule-type: flow # 指定文件配置的是那种规则degrade-control: # 熔断管理(这个名称可以自定义)nacos:data-id: feign-test_degrade-control_config.jsonserver-addr: ${nacos_server}rule-type: degradeparam-flow-control: # 热点参数管理(这个名称可以自定义)nacos:data-id: feign_test-hot_flux-config.jsonserver-addr: ${nacos_server}rule-type: param-flow
我们使用nacos配置文件来对服务进行流控、熔断等操作,所以就需要有以下几个必须的参数:
- data-id:需要告诉sentinel读取配置中心中的哪个配置文件。
- rule-type:告诉sentinel配置文件配置的控制规则,flow:流控、degrade:熔断、param-flow热点参数,想看有哪些规则参数可以查看
com.alibaba.cloud.sentinel.datasource
包下的枚举类:RuleType
。
public enum RuleType {FLOW("flow", FlowRule.class),DEGRADE("degrade", DegradeRule.class),PARAM_FLOW("param-flow", ParamFlowRule.class),SYSTEM("system", SystemRule.class),AUTHORITY("authority", AuthorityRule.class),GW_FLOW("gw-flow", "com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule"),GW_API_GROUP("gw-api-group", "com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition");//省略部分代码
}
2.4、配置信息
我们这里使用的是配置文件的形式对sentinel的控制信息进行持久化,所以会存在一个问题:nacos中的配置文件对于sentinel来讲是单项数据读入,sentinel能监听到nacos中配置的变化,但是我们在sentinel中修改了配置,nacos是不会监听到并进行修改。
如果想进行双向绑定,就需要对sentinel的代码进行修改。
2.4.1、流控配置
流控指的是流量控制
,也称作限流。它主要是用来限制每单位时间进入系统的请求数量,主要用来保证系统的可用性,防止大流量把系统压死。
[{"resource": "/test", // 资源名"limitApp": "default", // // 针对来源,若为 default 则不区分调用来源"grade": 1, // 限流阈值类型(1:QPS; 0:并发线程数)"count": 1, // 阈值"clusterMode": false, // 是否是集群模式"controlBehavior": 0, // 流控效果 (0:快速失败; 1:Warm Up(预热模式); 2:排队等待)"strategy": 0, // 流控模式(0:直接; 1:关联; 2:链路)"warmUpPeriodSec": 10, // 预热时间(秒,预热模式需要此参数)"maxQueueingTimeMs": 500, // 超时时间(排队等待模式需要此参数)"refResource": "rrr" // 关联资源、入口资源(关联、链路模式)}
]
2.4.2、熔断降级配置
在微服务中,熔断降级是一种保障服务稳定性的策略。
熔断降级可以简单理解为一个“保险丝”的作用。当某个服务发生严重故障(例如超时、异常等),为了防止整个系统的崩溃,会切断对这个服务的调用。这就像电流过大,保险丝会熔断以保护电路。
具体来说,熔断降级有两个目的:
防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”。
当某个服务提供者发生故障的时候,向调用方返回一个错误响应或者替代响应,而不是让调用方等待超时。
这样,即使个别服务出现问题,整个系统的运行也不会受到影响,这就是熔断降级的作用。
[{"resource": "/degrade","grade": 0, // 熔断策略,支持慢调用比例(0),异常比例(1),异常数(2)策略"count": 1000, // 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用,单位ms);异常比例/异常数模式下为对应的阈值"slowRatioThreshold": 0.1,// 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)"minRequestAmount": 10, //熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断"timeWindow": 10, // 熔断时长,单位为 s"statIntervalMs": 1000 // 统计时长(单位为 ms),如 60*1000 代表分钟级}
]
2.4.3、热点参数配置
在微服务中,热点参数限流是一种特殊的限流方法。
热点参数限流主要是对参数值相同的请求进行分别统计,判断是否超过每秒事务处理量(QPS)的阈值。这种方法相较于传统的限流方式,更精细化和个性化,可以针对具体的应用和服务的瓶颈进行限流。
例如,在一个微服务系统中,“查询用户信息”这个服务可能存在一个热点参数“用户ID”,我们可以通过热点参数限流来控制单位时间内对同一个用户ID的查询请求数量,防止因为某个热点的参数导致整体服务的故障。
[{"resource": "/test1","grade": 1, // 限流模式(QPS 模式,不可更改)"paramIdx": 0, // 参数索引"count": 13, // 单机阈值"durationInSec": 6, // 统计窗口时长"clusterMode": false, // 是否集群 默认false"controlBehavior": 0, // 流控效果(支持快速失败和匀速排队模式)"limitApp": "default",// 高级选项"paramFlowItemList": [{"classType": "int", // 参数类型"count": 222, // 限流阈值"object": "2" // 参数值}]}
]
2.4.4、系统规则配置
系统规则是用于定义和配置分布式系统的流量控制和防护的一种策略。
可以根据不同的维度(如Load、CPU使用率、总体平均RT、入口QPS和并发线程数等)来设定系统保护规则,以保证系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
[{"avgRt": 1, // RT"highestCpuUsage": -1, // CPU 使用率"highestSystemLoad": -1, // LOAD"maxThread": -1, // 线程数"qps": -1, // 入口 QPS"count": 55, // 阈值,在CPU使用率中是百分比}
]
2.4.5、授权规则配置
授权规则是用于控制服务请求者访问受保护资源的一种权限判断。它可以基于请求的来源或其他因素,对请求进行授权或者拒绝。
授权规则有多种实现方式,例如白名单和黑名单。白名单是允许来源在白名单内的调用者访问受保护资源,而黑名单则是禁止来源在黑名单内的调用者访问受保护资源。
在Sentinel中,可以通过自定义RequestOriginParser接口,从请求对象中获取请求者的来源,并按照白名单或黑名单的规则进行授权判断。
[{"resource": "sentinel_spring_web_context","limitApp": "/test","strategy": 0 // 授权类型(0代表白名单;1代表黑名单。)}
]
3、Gateway整合Sentinel和Nacos
在分布式系统中,一般使用Gateway网关来作为系统的入口,整合了网关后,请求会通过Gateway进行转发,就相当于Servlet中的forward,转发过程不会在浏览器中进行记录。
所以当我们为系统添加了Gateway之后,我们就可以不为每一个微服务添加流控效果了,只需要在Gateway中设置流控就可以了。
我们在Gateway中进行流控、熔断等操作,resource指的就是我们的服务名称。
3.1、流控配置
Gateway的流控配置和普通的流控配置不一样。
[{"resource": "feign-test", // 资源名"resourceMode": 0, // API类型, 0: ROUTE ID区分, 1: API"count": 1, // 阈值,QPS类型就是限制时间间隔的请求数,线程数类型就是指并行的线程数"grade": 1, // 阈值类型,0:线程数,1:QPS"controlBehavior": 2, // 流控方式,0:快速失败,2:匀速排队"intervalSec": 10, // 间隔,单位是秒"burst": 0, // burst,只有在快速失败时才有效"maxQueueingTimeoutMs": 1000 // 超时时间,单位是毫秒}
]
3.1.1、网关流控的所有配置参数
参数名 | 参数描述 |
---|---|
resourceMode | API类型,0:ROUTE ID,1:API |
resource | 资源名 |
grade | 阈值类型,0:线程数,1:QPS |
count | 阈值,QPS类型就是限制时间间隔的请求数,线程数类型就是指并行的线程数 |
intervalSec | 间隔 ,单位是秒 |
controlBehavior | 流控方式,0:快速失败,2:匀速排队 |
burst | 额外流量,快速失败流控方式下,允许突出的流量数 |
maxQueueingTimeoutMs | 排队时间,单位是毫秒,匀速排队流控方式下,允许排队的时间 |
paramItem | 请求属性key,json对象,为配置的json key,value就是余下的配置项 |
parseStrategy | 参数属性,0 :ClientIP,1:RemoteHost,2:Header ,3:URL参数,4 Cookie |
fieldName | 参数名称,若参数属性选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称 |
matchStrategy | 参数值匹配策略,0: 精确匹配,1:子串查询匹配,2:正则表达式匹配 |
pattern | 参数值匹配内容,按匹配策略来配置的值,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。 |
3.1.2、注意事项
- 参数值如果是数字,那么字符串和数字都可以。
- 当Gateway使用了流控配置的持久化,那么sentinel中
datasource
配置下的rule-type
参数值就得是gw_flow
, 不能是flow
,但也不是一定不能。
spring:cloud:sentinel:transport:dashboard: http://localhost:8080datasource:flow-control:nacos:server-addr: ${nacos_server}data-id: gateway_flux-control_config.json
# rule-type: flowrule-type: gw_flow
1、如果配置的是
flow
,那么在sentinle中就不会显示处Gateway的流控配置,但是不影响功能。
2、如果配置的是gw_flow
,才会在sentinel中显示Gateway的流控配置,同时也不影响功能。
3.2、熔断降级配置
Gateway的熔断降级配置和之前的配置是一样的。
[{"resource": "feign-test", // 资源名"count": 1000, // 当熔断策略是慢调用时,此值为最大RT,单位是毫秒。当熔断是策略是异常比例时,此值为异常比例。当熔断策略是异常数时,此值为异常数目"timeWindow": 5, // 熔断时长,单位是秒"grade": 0, // 0: 慢调用, 1: 异常比例,2:异常数"minRequestAmount": 2, // 最小请求数"slowRatioThreshold": 0.2, // 比例阈值"statIntervalMs": 10000 // 统计时长,单位毫秒}
]
相关文章:
Sentinel结合Nacos实现配置持久化(全面)
1、前言 我们在进行分布式系统的开发中,无论是在开发环境还是发布环境,配置一定不能是内存形式的,因为系统可能会在中途宕机或者重启,所以如果放在内存中,那么配置在服务停到就是就会消失,那么此时就需要重…...
Verilog中什么是断言?
断言就是在我们的程序中插入一句代码,这句代码只有仿真的时候才会生效,这段代码的作用是帮助我们判断某个条件是否满足(例如某个数据是否超出了范围),如果条件不满足(数据超出了范围)࿰…...
Oracle分区的使用详解:创建、修改和删除分区,处理分区已满或不存在的插入数据,以及分区历史数据与近期数据的操作指南
一、前言 什么是表分区: Oracle的分区是一种将表或索引数据分割为更小、更易管理的部分的技术。它可以提高查询性能、简化维护操作,并提供更好的数据组织和管理。 表分区和表空间的区别和联系: 在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对…...
SLAM从入门到精通(amcl定位使用)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 学习slam,一般就是所谓的边定位、边制图的知识。然而在实际生产过程中,比如扫地机器人、agv、巡检机器人、农业机器人&…...
【C/C++】C/C++面试八股
C/C面试八股 C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的?构造函数为什么不能是虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存对齐是什么?为什么要内存对齐static关键…...
Scala第八章节
Scala第八章节 scala总目录 章节目标 能够使用trait独立完成适配器, 模板方法, 职责链设计模式能够独立叙述trait的构造机制能够了解trait继承class的写法能够独立完成程序员案例 1. 特质入门 1.1 概述 有些时候, 我们会遇到一些特定的需求, 即: 在不影响当前继承体系的情…...
k8s-实战——kubeadm二进制编译
文章目录 源码编译获取源码修改证书有效期修改 CA 有效期为 100 年(默认为 10 年)修改证书有效期为 100 年(默认为 1 年)CentOS7.9环境准备centos脚本安装执行脚本脚本内容手动安装验证编译查看编译后的版本信息参考链接脚本修改源码编译 源码编译kubeadm文件、修改证书的默…...
vite 和 webpack 的区别
1. 构建原理: Webpack 是一个静态模块打包器,通过对项目中的JavaScript、css、Image 等文件进行分析,生成对应的静态资源,并且通过一些插件和加载器来实现各种功能。 Vite 是一种基于浏览器元素 ES 模块解析构建工具,…...
传统遗产与技术相遇,古彝文的数字化与保护
古彝文是中国彝族的传统文字,具有悠久的历史和文化价值。然而,由于古彝文的形状复杂且没有标准化的字符集,对其进行文字识别一直是一项具有挑战性的任务。本文介绍了古彝文合合信息的文字识别技术,旨在提高古彝文的自动识别准确性…...
多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)
多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制) 目录 多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述…...
1042 字符统计
description 请编写程序,找出一段给定文字中出现最频繁的那个英文字母。 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束ÿ…...
3 OpenCV两张图片实现稀疏点云的生成
前文: 1 基于SIFT图像特征识别的匹配方法比较与实现 2 OpenCV实现的F矩阵RANSAC原理与实践 1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式…...
在Springboot项目中使用Redis提供给Lua的脚本
在Springboot项目中使用Redis提供给Lua的脚本 在Spring Boot项目中,你可以使用RedisTemplate来执行Lua脚本。RedisTemplate是Spring Data Redis提供的一个Redis客户端,它可以方便地与Redis进行交互。以下是使用RedisTemplate执行Lua脚本的一般步骤&…...
分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测
分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测&…...
Linux或Centos查看CPU和内存占用情况_top只能查看对应的命令_如何查看具体进程---linux工作笔记062
一般我们都是用top去查看,但是top查看的结果,不能看出,具体是哪个程序占用的,这就很苦恼.. 其实如果有时间的话,再去专门看一下网络安全和linux脚本以及命令方面的,比较系统的看一下比较好.现在积累的都是工作中用到的,比较零散的知识. 如果用top,比如说这里的java,就只能知道…...
什么是DevOps
文章目录 一、概念二、地位三、目标四、要求五、具体手段 一、概念 是一组过程、方法与系统的统称,有助于打破开发、测试、运维、交付部门之间的壁垒,提高部门间的沟通协助能力。 二、地位 应成为公司的一种理念、文化、哲学。 三、目标 实现更加高…...
力扣每日一题
605. 种花问题 - 力扣(LeetCode) 动态规划 class Solution { public:bool canPlaceFlowers(vector<int>& flowerbed, int n) {int m flowerbed.size();if(1 m)return !flowerbed[0] > n;else if(2 m)return ((!flowerbed[0] &&…...
测试OpenCvSharp库的模板匹配功能
微信公众号“Dotnet讲堂”的文章《c#实现模板匹配,并输出匹配坐标》(参考文献1)中介绍了采用OpenCVSharp库实现模板匹配功能,也即在目标图片中定位指定图片内容的示例,本文参照参考文献1-4,学习并测试OpenC…...
网络编程day04(网络属性函数、广播、组播、TCP并发)
今日任务 对于newfd的话,最好是另存然后传入给分支线程,避免父子线程操作同一个文件描述符 ------------在tcp多线程服务端---------- 如果使用全局变量,或者指针方式间接访问,会导致所有线程共用一份newfd和cin,那么…...
HALCON支持GPU加速的算子有哪些?
参考例程get_operator_info。 get_opencl_operators这里可以查看到所有支持gpu加速的算子。 支持的算子列表: crop_rectangle1,deviation_image,mean_image,points_harris,gray_opening_shape, gray_dilat…...
MacBook Pro 电池电量限制充电怎么设置AlDente Pro for Mac最大充电限制工具
通过充电电量限制工具可以更好的保护MacBook Pro的电池,通过 AlDente Pro 您可以设置电池的最大充电百分比设置为 20% 至 100%,然后,它将保持在所需的电池百分比,然后再次使用电源适配器进行充电。 AlDent…...
毕业设计选题之Java+springboot线上蔬菜销售与配送系统(源码+调试+开题+lw)
💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…...
【Leetcode】162.寻找峰值
一、题目 1、题目描述 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] = nums[n] = -∞ 。 你必须实现时间复杂度为 O(log n…...
SpringBoot集成MinIO8.0
一、安装MinIO 中文官网地址:https://www.minio.org.cn/download.shtml 官网地址:https://min.io/download 官网有相应的安装命令,可查看 建议引用相应版本的依赖 二、集成SpringBoot 1.引入依赖 <dependency><groupId>io.…...
蓝桥等考Python组别五级007
第一部分:选择题 1、Python L5 (15分) 表达式“not a > 0”等价于下面哪个表达式?( ) a < 0a == 0a <= 0a in 0正确答案:C 2、Python L5 (15分) 执行下面的程序,当用键盘输入10时,输出结果是( )。 n &...
【装机】通过快捷键设置BIOS从U盘启动
当要重装系统的时候,是否会遇到一个问题,进入bios的时候就开始凌乱了,因为不懂得怎么用bios设置u盘启动.不要着急,下面来一波小白装机教程 总的来讲,设置电脑从U盘启动一共有两种方法: 第一种:开机时候按快捷键,然后选择U盘启动第…...
关于操作系统与内核科普
关于操作系统与内核科普 一.什么是操作系统 操作系统是管理计算机硬件与软件资源的计算机程序。它为计算机硬件和软件提供了一种中间层。 操作系统是一种软件,主要目的有三种: 一.管理计算机资源,这些资源包括CPU,内存࿰…...
算法练习3——删除有序数组中的重复项
LeetCode 26 删除有序数组中的重复项 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums …...
《YOLOv5:从入门到实战》报错解决 专栏答疑
前言:Hello大家好,我是小哥谈。《YOLOv5:从入门到实战》专栏上线后,部分同学在学习过程中提出了一些问题,笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容,笔者特意推出了该篇专…...
[2023.09.25]:Rust编写基于web_sys的编辑器:输入光标再次定位的小结
前些天,写了探索Rust编写基于web_sys的WebAssembly编辑器:挑战输入光标定位的实践,经过后续的开发检验,我发现了一个问题,就是光标消失了。为了继续输入,用户需要再次使用鼠标点击。现在我已经弄清楚了导致…...
国能商旅app下载/无锡seo网络推广
一、什么是pamPAM(Pluggable Authentication Modules ) Sun公司于1995 年开发的一种与认证相关的通用框架机制, PAM 是关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API,将系统 提供的服务和该服务的认证方式分开, 使得系统管理员可…...
搭建网站 网页/营销策划方案模板范文
swift 常用高阶函数swift的高阶函数怎么使用?什么是高阶函数 文章出自我的博客:huhansome的博客 mapvar arr [1, 2, 3] //map函数是有返回值的,想要arr里面的值map过去需要arr重新接收新值 arr.map { (a : Int) -> Int inreturn a * 2 }…...
青岛市建设网站/百度网盘手机版
某天无意中看见一道关于Integer的笔试题,问下面的输出结果是多少:package test;public class Test {public static void main(String[] args) {Integer i1 127;Integer i2 127;System.err.println(i1 i2);i1 128;i2 128;System.err.println(i1 i2)…...
wordpress自然志/2021全国大学生营销大赛
Windows Phone 7上的异步编程模型其实也就是说把C#里面的异步编程模型在Windows Phone 7应用开发上使用。下面来看一下异步编程模型里面的一些关键的概念。 2个方法和一个委托和一个接口: (1)BeginInvoke方法用于启动异步调用 Begin 方法包含同步方法签名中的任何参…...
聊城定制化网站建设/怎么创建网站链接
文章目录动态规划的三大步骤实例例1:简单的一维DP例2:不同路径例3:最小路径和例4:编辑距离优化例2不同路径数的优化例4编辑距离优化文章出处:告别动态规划,连刷 40 道题,我总结了这些套路&#…...
专业做汽车零部件平台的网站/域名注册腾讯云
1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法。 它是对对象行为的定义,也是对功能的规范。 示例: // GoodChild.h #import <Foundation/Foundation.h> protocol GoodChild <NSObject> -(…...