微服务学习-Nacos 注册中心实战
1. 注册中心的设计思路
1.1. 微服务为什么会用到注册中心?
服务与服务之间调用需要有服务发现功能;例如订单服务调用库存服务,库存服务如果有多个,订单服务到底调用那个库存服务呢(负载均衡器),如果某个库存服务不可用了(心跳上报),如何知道不可用呢,这里就牵涉到服务的注册与发现。
1.2. 如何设计一个注册中心?
注册中心肯定需要存储服务的信息,服务的 ip 和端口,健康状态等,服务的注册与发现功能,心跳上报,健康检查功能是必要的。
1.3. 注册中心应该包含哪些常见功能?
服务的注册与发现、服务的健康检查、服务心跳,集群的话可能就需要服务同步。
1.4. 注册中心的设计思路
2. Nacos 注册中心核心概念和功能
2.1. 核心概念
官网 Nacos 的概念及架构:Nacos 概念 | Nacos 官网
- 服务(Service)
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。
- 服务注册中心(Service Registry)
服务注册中心,它是服务,其实例及源数据的数据库。
- 服务元数据(Service Metadata)
服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。
- 命名空间(Namespace)
用来进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 DataID 的配置。
Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
- 服务分组(Group)
不同的服务可以归类到同一分组。
2.2. 核心功能
- 服务注册
Nacos Client 会通过发送 REST 请求的方式向 Nacos Server 注册自己的服务,提供自身的元数据,比如 ip 地址、端口等信息。Nacos Server 接受到注册请求后,就会把这些元数据信息存储在一个双层的内存 Map 中。
- 服务心跳
在服务注册后,Nacos Client 会维护一个定时心跳来持续通知 Nacos Server,说明服务一直处于可用状态,防止被剔除。默认 5s 发送一次心跳。
- 服务同步
Nacos Server 集群之间会互相同步服务实例,用来保证服务信息的一致性。
- 服务发现
服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个 REST 请求给 Nacos Server,获取上面注册的服务清单,并且缓存在 Nacos Client 本地,同时会在 Nacos Client 本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。
- 服务健康检查
Nacos Server 会开启一个定时任务用来检查注册服务实例的健康情况,对于超过 15s 没有收到客户端心跳的实例会将它的 healthy 属性置为 false (客户端服务发现时不会发现),如果某个实例超过 30s 没有收到心跳,直接剔除该实例(被剔除的实力如果恢复发送心跳则会重新注册)。
3. 微服务整合 Nacos 注册中心常用配置项详解
3.1. 准备测试环境
会员服务:icoolkj-mall-user
订单服务:icoolkj-mall-order01
速通版:git checkout v2.0.0 版本:
icoolkj-microservices-code 标签 - Gitee.com
启动服务,获取会员订单信息:
http://localhost:8580/api/user/getOrderByUserId?userId=1
3.2. 服务逻辑隔离配置
3.2.1. 数据模型
Nacos 数据模型 Key 由三元组唯一确定,Namespace 默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
3.2.2. Namespace 隔离设计
命名空间(Namespace)用于进行租户(用户)粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
3.2.2.1. 在 nacos 控制台创建一个 dev 的命名空间
3.2.2.2. 配置订单服务 namespace 为 dev
cloud:nacos:discovery:server-addr: icoolkj-mall-nacos-server:8848namespace: dev # 指定 dev 开发环境命名空间
3.2.2.3. 重启订单服务,测试
用户调用订单接口能否查询到订单信息
问题:无法调用订单服务,提示:No instances available for icoolkj-mall-order01
原因:icoolkj-mall-order01 和 icoolkj-mall-user 使用了不同的 namespace,导致服务隔离,icoolkj-mall-user 无法发现可用的 icoolkj-mall-order01 服务。
3.2.3. group 服务分组隔离
不同的服务可以归类到同一个分组,group 也可以起到服务隔离的作用,yml 中可以通过 spring.cloud.nacos.discovery.group 参数配置。group 更多应用场景是配置分组。
3.2.3.1. 配置订单服务分组为 group1
cloud:nacos:discovery:server-addr: icoolkj-mall-nacos-server:8848namespace: dev # 指定 dev 开发环境命名空间group: group1 # 指定 group1 分组
3.2.3.2. 重启订单服务,测试
用户调用订单接口能否查询到订单信息
问题:无法调用订单服务,提示:No instances available for icoolkj-mall-order01
原因:icoolkj-mall-order01 和 icoolkj-mall-user 使用了不同的分组,导致服务隔离,icoolkj-mall-user 无法发现可用的 icoolkj-mall-order01 服务。
3.3. 服务领域模型
注册中心的核心数据是服务名称和它对应的网络地址,当服务注册了多个实例时,需要对不健康的实力进行过滤或者对实例的一些特征进行流量的分配,就需要再实例上存储一些例如 IP、端口、健康状态、权重等属性。随着服务的规模扩大,需要再整个服务级别设定一些权限规则,以及对所有实例都生效的一些开关,于是在服务级别又会设立一些属性。我们发现单个服务的实力又会划分为多个子集的需求,例如一个服务是多个机房部署的,可能需要对每个机房的实例做不同的胚子,这样有需要在服务和实例之间再设定一个数据级别。
Nacos 在经过内部多年生产经验,提炼除的数据模型,则是一种服务-集群-实例的三层模型。这样基本可以满足服务在所有场景下的数据存储和管理。
3.3.1. 集群配置
spring:cloud:nacos:discovery:server-addr: icoolkj-mall-nacos-server:8848namespace: dev # 指定 dev 开发环境命名空间#group: group1 # 指定 group1 分组cluster-name: BJ # 指定集群名称 北京机房
重启订单服务,测试,不同的集群的微服务之间是可以调用的,一般情况不隔离;可以实现本地集群优先调用,例如上海订单先调用上海机房集群,如果上海集群出问题了,可以调用其他地方集群。
3.3.2. 临时实例和持久化实例
3.3.2.1. 健康检查的方式
临时实例使用客户端上报模式,需要能够自动摘除不健康实例,而且无需持久化存储实例。
持久化实例使用服务端探测的健康检查方式,因为客户端不会上报心跳,所以不能自动摘除下线的实例。
3.3.2.2. 适用场景
上层业的业务服务,例如订单服务,库存服务都可以上报心跳,都是临时实例;
一些基础的组件例如数据库、缓存等,这些往往不能上报心跳,这种类型的服务在注册时,就需要作为持久化实例注册。
3.3.2.3. 如何配置
# 持久化实例
spring.cloud.nacos.discovery.ephemeral: false
Nacos 默认注册的都是临时实例。
常见错误:
Current service DEFAULT_GROUP@@icoolkj-mall-order01 is ephemeral service, can't register persistent instance. 在 Nacos2.0 中将是否持久化的数据抽象至服务级别,且不再允许一个服务同时存在持久化实例和非持久化实例,实例的持久化属性继承自服务的持久化属性。
The Raft Group [naming_persistent_service_v2] did not find the Leader node 要配置持久化实例必须得是 nacos 集群模式。
3.4. Nacos 安全配置
官方参考文档:配置鉴权 | Nacos 官网
Nacos 是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安全风险。
3.4.1. 如何实现安全配置
3.4.1.1. nacos server 端
nacos-server-2.3.2/nacos/conf/application.properties 添加如下配置:
# 开启认证
nacos.core.auth.enabled=true
# 配置自定义身份识别的key(不可为空)和value(不可为空)
#这两个属性是auth的白名单,用于标识来自其他服务器的请求。
#具体实现见 com.alibaba.nacos.core.auth.AuthFilter
# 用于服务端api鉴权,注意:并不是nacos的用户名密码
nacos.core.auth.server.identity.key=authKey
nacos.core.auth.server.identity.value=nacosSecurty# 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,使用默认值有安全风险 (2.2.0.1后无默认值)
#自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符。
nacos.core.auth.plugin.nacos.token.secret.key=pDEYqLTBvWAp16osN6dxLvZTo9RfNsY3DfhI
注意:在2.2.0.1版本后,社区发布版本需要自行填充nacos.core.auth.plugin.nacos.token.secret.key的值,否则无法启动节点。
随机字符串生产工具:随机字符串生成 - 程序员工具箱 - 在线工具
注意:鉴权开关是修改之后立马生效的,不需要重启服务端。
3.4.1.2. nacos client 端
nacos server 开启鉴权后,微服务提示 user not found!
微服务的 application.yml 中添加如下配置:
spring:application:name: icoolkj-mall-usercloud:nacos:discovery:server-addr: icoolkj-mall-nacos-server:8848namespace: dev # 指定 dev 开发环境命名空间#group: group1 # 指定 group1 分组#cluster-name: BJ # 指定集群名称 北京机房username: nacospassword: nacos
默认用户名密码都是 nacos,可以在 ncaos 控制台创建新用户。
4. Nacos 高可用集群最佳实践
4.1. nacos 部署方式
单机模式:用于测试和单机使用。默认使用的是 derby 数据库。
注意:单机模式下 Linux 运行Nacos:sh startup.sh -m standalone
集群模式:用于生产环境,确保高可用。
4.2. 官方文档
集群部署说明
4.3. 集群部署架构图
最终方案:nginx + 三个节点 nacos 集群 + mysql
为保证数据一致性,集群环境需要用 mysql(三个节点都可以访问到 mysql)替换内部的 derby 数据库。
4.4. 搭建步骤
官方部署手册:Nacos支持三种部署模式
4.4.1. 前期环境准备
4.4.1.1. 三台 Linux 虚拟机
# 准备三台 centOS7 服务器
200.8.9.16:8848
200.8.9.17:8848
200.8.9.18:8848
安装好 JDK,需要 1.8 及其以上版本;建议:2 核 CPU,4G 内存及其以上。
注意:nacos2.3.2 不能使用 OpenJDK,会出现开启鉴权后控制台无论使用什么密码登录都显示账号密码错误问题。
4.4.1.2. 准备好 Nacos2.3.2 的安装包
下载地址:发布历史 | Nacos 官网
4.4.2. 配置集群配置文件
在 nacos 的解压目录 nacos/的conf 目录下,有配置文件 cluster.conf,请每行配置成 ip:port。
#解压进入nacos 安装目录
unzip nacos-server-2.3.2.zip
cd nacos/
mv conf/cluster.conf.example conf/cluster.conf
vim conf/cluster.conf# ip:port
200.8.9.16:8848
200.8.9.17:8848
200.8.9.18:8848
注意:不要使用 localhost 或 127.0.0.1,针对多网卡环境,Nacos 可以指定网卡或 IP
当本地环境比较复杂的时候,Nacos 服务在启动的时候需要选择运行时使用的 IP 或者网卡。
#多网卡IP选择
# ip-address 参数可以直接设置 nacos 的 ip
#该参数设置后,将会使用这个 IP 去 cluster.conf 里进行匹配,请确保这个 IP 的值在 cluster.conf 里是存在的
nacos.inetutils.ip-address=200.8.9.16# use-only-site-local-interfaces 参数可以让nacos使用局域网 ip ,这个在 nacos 部署的机器有多网卡时很有用,可以让 nacos 选择局域网网卡
nacos.inetutils.use-only-site-local-interfaces=true# ignored-interfaces 支持网卡数组,可以让 nacos 忽略多个网卡
nacos.inetutils.ignored-interfaces[0]=eth0
nacos.inetutils.ignored-interfaces[1]=eth1# preferred-networks 参数可以让 nacos 优先选择匹配的 ip,支持正则匹配和前缀匹配
nacos.inetutils.preferred-networks[0]=200.8.9.
nacos.inetutils.preferred-networks[0]=200.8.9.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d))),200.8.9.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d)))
4.4.3. 开启默认鉴权插件
修改 conf 目录下的 application.properties 文件
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=${自定义,保证所有节点一致}
nacos.core.auth.server.identity.value=${自定义,保证所有节点一致}
nacos.core.auth.plugin.nacos.token.secret.key=${自定义,保证所有节点一致}
4.4.4. 配置数据源
使用外置 mysql 数据源,生产使用建议至少主备模式
4.4.4.1. 初始化 mysql 数据库
sql 脚本:nacos-server-2.3.2/nacos/conf/mysql-schema.sql
4.4.4.2. 修改 application.properties 配置
spring.sql.init.platform=mysql
db.num=1
db.url.0=jdbc:mysql://200.8.9.16:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456
4.4.4.3. 常见错误
java.lang.RuntimeException: [db-load-error]load jdbc.properties error
检查 nacos 的 mysql 连接,数据库的 ip、数据库、用户名和密码。
4.4.5. 分别启动三个 nacos 节点
以 200.8.9.16 为例,进入 nacos 目录,启动 nacos。
sh bin/startup.sh
4.4.6. 访问 nacos 管理界面
登录 200.8.9.16:8848/nacos,用户名和密码默认都是 nacos
5. 小结
通过 Nacos 注册中心可以实现微服务的注册与发现。生产环境搭建高可用集群模式。
相关文章:
微服务学习-Nacos 注册中心实战
1. 注册中心的设计思路 1.1. 微服务为什么会用到注册中心? 服务与服务之间调用需要有服务发现功能;例如订单服务调用库存服务,库存服务如果有多个,订单服务到底调用那个库存服务呢(负载均衡器)࿰…...
音频 PCM 格式 - raw data
文章目录 raw 音频格式:PCM其他音频格式:mp31. 无损压缩音频(类比 PNG 图像)2. 有损压缩音频(类比 JPEG 图像) 试了一下科大讯飞的音频识别云 api,踩了点坑 与本文无关:讯飞的 api 使…...
什么是波士顿矩阵,怎么制作?AI工具一键生成战略分析图!
当今商业环境瞬息万变,每个企业都面临着越来越多的挑战与机遇。如何科学合理地进行战略管理,成为了每个企业决策者必须直面的重要课题。 在众多战略管理框架中,波士顿矩阵作为一种经典的战略管理工具,因其简洁明了的分析方式而广…...
基于微信小程序的助农扶贫系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Maui学习笔记-SignalR简单介绍
SignalR是ASP.NET Core中的一个库,支持服务器与其连接的客服端之间的双象通信,它允许服务器立即将更新的消息推送到客服端,而不是要求客户端轮询服务器来获取更新 创建项目 使用SignalR在服务器实时发送消息给客服端,客服端拿到消息后在UI页面更新 首先创建一个Web API项目 …...
【学习笔记】深度学习网络-深度前馈网络(MLP)
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中用…...
C#,入门教程(05)——Visual Studio 2022源程序(源代码)自动排版的功能动画图示
上一篇: C#,入门教程(04)——Visual Studio 2022 数据编程实例:随机数与组合https://blog.csdn.net/beijinghorn/article/details/123533838https://blog.csdn.net/beijinghorn/article/details/123533838 新来的徒弟们交上来的C#代码&#…...
每日进步一点点(网安)
1.1 level5 查看源码关键部分 $str strtolower($_GET["keyword"]); $str2str_replace("<script","<scr_ipt",$str); $str3str_replace("on","o_n",$str2);<input namekeyword value".$str3.">关键…...
代理模式 - 代理模式的应用
引言 代理模式(Proxy Pattern)是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常会在客户端和目标对象之间起到中介的作用,从而可以在不改变目标对象的情况下,增加额外的功能或控…...
机器学习-线性回归(对于f(x;w)=w^Tx+b理解)
一、𝑓(𝒙;𝒘) 𝒘T𝒙的推导 学习线性回归,我们那先要对于线性回归的表达公示,有所认识。 我们先假设空间是一组参数化的线性函数: 其中权重向量𝒘 ∈ R𝐷 …...
【Salesforce】审批流程,代理登录 tips
审批流程权限 审批流程权限问题解决方案代理登录代理登录后Logout 审批流程权限 前几天,使用审批流程,但是是两个sandbox,同样的配置,我有管理员权限。但是profile不是管理员,只是通过具备管理员权限的permission set…...
第20篇:Python 开发进阶:使用Django进行Web开发详解
第20篇:使用Django进行Web开发 内容简介 在上一篇文章中,我们深入探讨了Flask框架的高级功能,并通过构建一个博客系统展示了其实际应用。本篇文章将转向Django,另一个功能强大且广泛使用的Python Web框架。我们将介绍Django的核…...
Elastic Agent 对 Kafka 的新输出:数据收集和流式传输的无限可能性
作者:来 Elastic Valerio Arvizzigno, Geetha Anne 及 Jeremy Hogan 介绍 Elastic Agent 的新功能:原生输出到 Kafka。借助这一最新功能,Elastic 用户现在可以轻松地将数据路由到 Kafka 集群,从而实现数据流和处理中无与伦比的可扩…...
IPoIB(IP over InfiniBand)数据接收与发送机制详解
IPoIB(IP over InfiniBand)是一种在InfiniBand网络上实现IP协议的技术,它允许在InfiniBand网络上传输IP数据包。IPoIB通过将IP数据包封装在InfiniBand的数据包中,实现了在InfiniBand网络上的高效通信。本文将详细分析IPoIB如何接收…...
快速更改WampServer根目录php脚本
快速更改WampServer根目录php脚本 <?php // 配置文件地址 $apacheConfPath C:\Install\CTF\Wampserver\bin\apache\apache2.4.62.1\conf\httpd.conf; $apacheConfPath2 C:\Install\CTF\Wampserver\bin\apache\apache2.4.62.1\conf\extra\httpd-vhosts.conf; // 新根目录…...
C#,入门教程(08)——基本数据类型及使用的基础知识
上一篇: C#,入门教程(07)——软件项目的源文件与目录结构https://blog.csdn.net/beijinghorn/article/details/124139947 数据类型用于指定数据体(DataEntity,包括但不限于类或结构体的属性、变量、常量、函数返回值)…...
【自定义函数】编码-查询-匹配
目录 自定义编码匹配编码匹配改进 sheet来源汇总来源汇总改进 END 自定义编码匹配 在wps vb环境写一个新的excel函数名为编码匹配,第一个参数指定待匹配文本所在单元格(相对引用),第二个参数指定关键词区域(绝对引用&…...
docker-制作镜像gcc添加jdk运行java程序
最近的项目需要使用java调用c的链接库,.OS文件,一开始准备在jdk的镜像下去安装c的环境,不过安装的内容很多,比较复杂也容易缺很多的包,经过实验,我们决定使用gcc的镜像安装jdk来正确的运行java程序。 基础镜…...
工业相机 SDK 二次开发-Sherlock插件
本文介绍了 sherlock 连接相机时的插件使用。通过本套插件可连接海康的工业相机。 一.环境配置 1. 拷贝动态库 在用户安装 MVS 目录下按照如下路径 Development\ThirdPartyPlatformAdapter 找到目 录为 DalsaSherlock 的文件夹,根据 Sherlock 版本找到…...
智慧消防营区一体化安全管控 2024 年度深度剖析与展望
在 2024 年,智慧消防营区一体化安全管控领域取得了令人瞩目的进展,成为保障营区安全稳定运行的关键力量。这一年,行业在政策驱动、技术创新应用、实践成果及合作交流等方面呈现出多元且深刻的发展态势,同时也面临着一系列亟待解决…...
On to OpenGL and 3D computer graphics
2. On to OpenGL and 3D computer graphics 声明:该代码来自:Computer Graphics Through OpenGL From Theory to Experiments,仅用作学习参考 2.1 First Program Square.cpp完整代码 /// // square.cpp // // OpenGL program to draw a squ…...
python实现http文件服务器访问下载
//1.py import http.server import socketserver import os import threading import sys# 获取当前脚本所在的目录 DIRECTORY os.path.dirname(os.path.abspath(__file__))# 设置服务器的端口 PORT 8000# 自定义Handler,将根目录设置为脚本所在目录 class MyHTT…...
Redis高阶5-布隆过滤器
Redis布隆过滤器 由一个初始值都为零的bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素 目的减少内存占用方式不保存数据信息,只是在内存中做一个是否存在的标记flag 布隆过滤器(英语:Bloom Filter࿰…...
Hive关于数据库的语法,warehouse,metastore
关于数据库的语法 在default数据库下,查看其他数据库的表 in 打开控制台 字体大小的设置 Hive默认的库: default, 1/4说明一共有4个库,现在只展示了1个,单击>>所有架构 数据库的删除 方法一: 语法 删除有表的数据库,加cascade 方法二 当前连接的数据库 切换当前数据库…...
Kafka 深入服务端 — 时间轮
Kafka中存在大量的延迟操作,比如延时生产、延时拉取和延时删除等。Kafka基于时间轮概念自定义实现了一个用于延时功能的定时器,来完成这些延迟操作。 1 时间轮 Kafka没有使用基于JDK自带的Timer或DelayQueue来实现延迟功能,因为它们的插入和…...
ubuntu系统docker环境搭建
ubuntu系统docker环境搭建 docker引擎安装 高版本docker引擎安装时已经自带有docker compose 安装参考docker官网Install Docker Engine on Ubuntu 方式一: 在线安装 参考apt方式安装 1、Set up Docker’s apt repository. # Add Dockers official GPG key: …...
安宝特方案 | AR在供应链管理中的应用:提升效率与透明度
随着全球化的不断深入和市场需求的快速变化,企业对供应链管理的要求也日益提高。如何在复杂的供应链环境中提升效率、降低成本,并确保信息的透明度,成为了各大行业亟待解决的问题。而增强现实(AR)技术,特别…...
[ Spring ] Spring Cloud Alibaba Message Stream Binder for RocketMQ 2025
文章目录 IntroduceProject StructureDeclare Plugins and ModulesApply Plugins and Add DependenciesSender PropertiesSender ApplicationSender ControllerReceiver PropertiesReceiver ApplicationReceiver Message HandlerCongratulationsAutomatically Send Message By …...
再述 Dijkstra
再述 Dijkstra 学 Dijkstra 好久了,今天再学了一遍,感觉推翻了好多自己的知识…… 定义 一种用于求非负权值的图的单源最短路径的算法。 方法 已知:如果要求从起始点 s 到某一个点 x 的最短路径,显然只能从某一个已确认为最短…...
大语言模型之prompt工程
前言 随着人工智能的快速发展,我们正慢慢进入AIGC的新时代,其中对自然语言的处理成为了智能化的关键一环,在这个大背景下,“Prompt工程”由此产生,并且正逐渐成为有力的工具... LLM (Large Language Mode…...
JavaScript系列(43)--依赖注入系统实现详解
JavaScript依赖注入系统实现详解 💉 今天,让我们深入探讨JavaScript的依赖注入系统实现。依赖注入是一种设计模式,它通过将依赖关系的创建和管理从代码中分离出来,提高了代码的可维护性和可测试性。 依赖注入基础概念 …...
Mono里运行C#脚本36—加载C#类定义的成员变量和方法的数量
前面分析了加载类和基类的基本过程, 接着来分析一下加载成员变量和方法的数量。 因为我们知道C#语言定义一个类,主要就是定义成员变量,以及那些对此成员变量进行操作的方法, 所以需要使用一种方法来描述C#语言定义类的能力。 一般情况下,主要有两种类型: 普通的类,比如前…...
SWPU 2022 新生赛--web题
奇妙的MD5 进入靶场 然我们输入一个特殊的字符串,然后我到处翻了翻,发现有提示 在MD5中有两个特殊的字符串 0e215962017 //MD5加密后弱比较等于自身 ffifdyop //MD5加密后变成万能密码 这里明显就是万能密码了 输入之后就来到了这个页…...
Windows 靶机常见服务、端口及枚举工具与方法全解析:SMB、LDAP、NFS、RDP、WinRM、DNS
在渗透测试中,Windows 靶机通常会运行多种服务,每种服务都有其默认端口和常见的枚举工具及方法。以下是 Windows 靶机常见的服务、端口、枚举工具和方法的详细说明: 1. SMB(Server Message Block) 端口 445/TCP&…...
记一次Linux共享内存段排除Bug:key值为0x0000000的共享内存段删除不了
本文目录 一、问题情况二、解决方法2.1 通过kill命令删除2.2 通过程序删除 一、问题情况 今天查看共享内存段发现好多共享内存段,而且命令ipcrm -m <shmid>删除不了。 回想了一下,应该是有一些程序跑while循环,或者死循环,…...
RV1126画面质量四:GOP改善画质
一. 什么是 GOP GOP 实际上就是两个 I 帧的间隔,比方说分辨率是 1920 * 1080 50 帧,假设 GOP 为 5,那就是大概 2s 插入一个 I 帧。我们再 回顾下,H264/H265 的帧结构。H264/H265 分别分为三种帧类型:I 帧、…...
手机app如何跳过无障碍权限实现弹框自动点击-ADB连接专题
手机app如何跳过无障碍权限实现弹框自动点击 --ADB连接专题 一、前言 我们在前期的时候,在双SIM卡进行协同外呼和SIM卡切换时,对如何在手机中“执行批处理脚本做自动点击”的内容进行预研,力图使用事件触发和坐标点击等方式来实现手机安装…...
kafka-保姆级配置说明(consumer)
bootstrap.servers #deserializer应该与producer保持对应 #key.deserializer #value.deserializer ##fetch请求返回时,至少获取的字节数,默认值为1 ##当数据量不足时,客户端请求将会阻塞 ##此值越大,客户端请求阻塞的时间越长&…...
c语言中的数组(上)
数组的概念 数组是⼀组相同类型元素的集合; 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。 数组中存放的多个数据,类型是相同的。 数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。 数组创建 在C语言…...
20250122-正则表达式
1. 正则标记 表示一位字符:\\ 表示指定的一位字符:x 表示任意的一位字符:. 表示任意一位数字:\d 表示任意一位非数字:\D 表示任意一个字母:[a-zA-Z](大写或小写) 表示任意一个…...
(回溯法 子集)leetcode78
#include<iostream> #include<string> #include<vector> //只有子集需要在每个结点收集结果,其余在叶子结点收集结果 using namespace std; vector<vector<int>>ans; vector<int>combine; void backtracking(int index,vector&…...
Pyecharts之图表组合与布局优化
在数据可视化中,我们经常需要将多个图表组合在一起,以展示不同维度的数据或者进行对比分析。同时,合理的布局能够提升图表的可读性和用户体验。Pyecharts 提供了强大的组件和方法,让我们可以轻松实现图表的组合和布局优化。本篇将…...
代码随想录训练营第五十六天| 108.冗余连接 109.冗余连接II
108.冗余连接 题目链接:卡码网题目链接(ACM模式) (opens new window) 讲解链接:代码随想录 并查集可以解决什么问题:两个节点是否在一个集合,也可以将两个节点添加到一个集合中。 引自代码随想录ÿ…...
私有包上传maven私有仓库nexus-2.9.2
一、上传 二、获取相应文件 三、最后修改自己的pom文件...
二叉搜索树中的搜索(力扣700)
首先介绍一下什么是二叉搜索树。 二叉搜索树是一个有序树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉…...
社区养老服务平台的设计与实现(代码+数据库+LW)
摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差&#…...
高速光模块中的并行光学和WDM波分光学技术
随着AI大模型训练和推理对计算能力的需求呈指数级增长,AI数据中心的网络带宽需求大幅提升,推动了高速光模块的发展。光模块作为数据中心和高性能计算系统中的关键器件,主要用于提供高速和大容量的数据传输服务。 光模块提升带宽的方法有两种…...
python生成图片和pdf,快速
1、下载安装 pip install imgkit pip install pdfkit2、wkhtmltopdf工具包,下载安装 下载地址:https://wkhtmltopdf.org/downloads.html 3、生成图片 import imgkit path_wkimg rD:\app\wkhtmltopdf\bin\wkhtmltoimage.exe # 工具路径,安…...
浅谈在AI时代GIS的发展方向和建议
在AI时代,GIS(地理信息系统)的发展正经历着深刻的变革,随着人工智能技术的进步,GIS不再仅仅是传统的地图和空间数据处理工具,而是向更加智能化、自动化、精准化的方向发展。作为一名GIS开发工程师ÿ…...
【25考研】中科院软件考研复试难度分析!
中科院软件复试不需要上机!且对专业综合能力要求较高!提醒同学一定要认真复习! 一、复试内容 二、参考书目 官方并未明确给出,建议同学参考初试书目: 1)《数据结构(C语言版)》严蔚…...