【Spring Cloud】深入探索 Nacos 注册中心的原理,服务的注册与发现,服务分层模型,负载均衡策略,微服务的权重设置,环境隔离
文章目录
- 前言
- 一、初识 Nacos 注册中心
- 1.1 什么是 Nacos
- 1.2 Nacos 的安装,配置,启动
- 二、服务的注册与发现
- 三、Nacos 服务分层模型
- 3.1 Nacos 的服务分级存储模型
- 3.2 服务跨集群调用问题
- 3.3 服务集群属性设置
- 3.4 修改负载均衡策略为集群策略
- 四、根据服务的权重进行负载均衡
- 五、Nacos 环境隔离
- 5.1 什么是 Nacos 的环境隔离(namespace)
- 5.2 为什么需要环境隔离
- 5.3 设置 Nacos 的环境隔离
- 5.4 重启 order-service 服务
- 六、Nacos 注册中心原理剖析
- 6.1 Nacos 注册中心的执行流程
- 6.2 临时实例和非临时实例的设置
- 总结:Nacos 和 Eureka 的区别
前言
在微服务架构中,服务注册中心是整个体系中的关键组件之一。它负责服务的注册、发现和管理,为微服务之间的通信提供了基础设施。在这方面,Nacos(Namespace Aware Clustered Object Storage)作为一种服务发现和配置管理系统,提供了丰富的功能,旨在简化微服务架构中的服务注册、配置管理以及服务元数据的处理。
一、初识 Nacos 注册中心
1.1 什么是 Nacos
Nacos(Namespace Aware Clustered Object Storage) 是一个开源的、易于配置的、多功能的服务发现和配置管理系统。它由阿里巴巴开发,提供了一种简化微服务架构中服务发现、动态配置和服务元数据的解决方案。
Nacos 具有以下主要特性:
-
服务发现与健康检查: Nacos 提供了服务注册和发现的功能,可以方便地管理微服务的实例。它还支持对服务进行健康检查,及时发现不可用的实例。
-
动态配置管理: Nacos 允许将配置信息存储在服务端,并支持动态更新配置,实现了配置的集中管理。
-
动态 DNS 服务: Nacos 提供了内置的 DNS 服务,通过 DNS 查询可以获取到注册在 Nacos 上的服务实例信息。
-
多环境和命名空间: Nacos 支持多环境(例如开发、测试、生产)和命名空间的管理,可以更灵活地组织和管理配置信息。
1.2 Nacos 的安装,配置,启动
1. 安装
1. 下载安装包
在 Nacos 的 GitHub 页面,提供有下载链接,可以下载编译好的 Nacos 服务端或者源代码:
GitHub主页: https://github.com/alibaba/nacos
GitHub的Release下载页: https://github.com/alibaba/nacos/releases
如图:
2. 点击右侧的 Tags
标签更加直观的选择历史版本,这里以 Nacos 1.4.1 为例:
3. Windows 环境选择 zip
,如果是 Linux 则选择 tar.gz
压缩包。这里以Windows环境为例:
4. 下载完成之后,将其解压到一个没有中文的路径下,此时就安装完成了。
5. Nacos 的目录结构
目录说明:
- bin:启动 Nacos 的脚本文件。
- conf:Nacos 的配置文件。
2. 配置
Nacos的默认端口是8848,如果电脑上的其它进程占用了8848端口,请先尝试关闭该进程。
如果无法关闭占用8848端口的进程,也可以进入 Nacos 的 conf 目录,修改配置文件中的端口:
修改其中的内容:
修改端口:
3. 启动
启动 Nacos 非常简单,进入 bin 目录,结构如下:
然后执行命令即可:
startup.cmd -m standalone
执行后的效果如图:
访问启动日志中提供的地址,或者是在浏览器输入地址http://127.0.0.1:8848/nacos
即可访问 Nacos 控制台:
默认的账号和密码都是 nacos,进入后:
二、服务的注册与发现
Nacos 的服务注册非常简单,Spring Cloud 提供了通用接口规范,因此使用不同的注册中心只需要更改配置,而不需要修改代码即可完成注册中心的切换。例如,切换 Eureka 到 Nacos 的操作方式如下:
- 在
cloud-demo
父工程中添加spring-cloud-alilbaba
的管理依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>
- 注释掉
order-service
和user-service
中原有的 Eureka 依赖,添加 Nacos 的客户端依赖:
<!-- Nacos 客户端依赖 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 修改
application.yml
文件,注释掉 Eureka 相关配置,添加 Nacos 相关配置:
spring:cloud:nacos:server-addr: localhost:8848 # Nacos 服务地址
- 根据上述的修改步骤,同时修改
user-service
和order-service
两个微服务的配置,然后分别启动这两个微服务:
此时启动了一个 order-service
服务实例和三个 user-service
服务实例。
- 启动之后就可以在 Nacos 控制台的服务列表中查看注册的所有服务了:
并且可以查看服务的详情:
通过上述步骤,我们成功将服务的注册中心从 Eureka 切换到 Nacos,实现了服务的注册与发现。 Nacos 提供了强大的服务治理功能,是一个优秀的云原生应用的服务中心。
三、Nacos 服务分层模型
3.1 Nacos 的服务分级存储模型
Nacos 的服务分级存储模型是其设计架构的一个重要组成部分,它有助于更好地管理和组织服务信息。这个模型分为三个层级,分别是服务(Service)、集群(Cluster)和实例(Instance)。
例如,Nacos 的服务分级存储模型如下图所示:
这模型分为三个层级:
-
服务(Service): 服务是 Nacos 中的最高层级,它代表了一个抽象的服务实体,通常以服务的名称来标识,例如 userservice。服务可以包含一个或多个集群。
-
集群(Cluster): 集群是服务的下一层级,用于表示同一个服务的多个实例的分组。一个服务可以分布在不同的集群中,每个集群可以包含一个或多个实例。以地理位置或部署环境为例,一个服务可以有多个集群,如杭州集群、上海集群等。
-
实例(Instance): 实例是服务的最低层级,它代表了一个具体的服务实例,通常对应一个运行中的服务节点。每个集群中可以包含一个或多个实例,每个实例都具有唯一的 IP 地址和端口号,并提供了服务的访问地址。
这个模型的设计使得 Nacos 能够更好地管理和组织服务信息,尤其是在多地理位置、多环境下部署的场景中。服务可以以地理位置、部署环境等为单位进行划分,每个集群中包含多个实例,具备了高可用性和负载均衡的特性。这种结构也有助于更好地理解和管理微服务架构中的服务体系,使得服务的注册、发现和管理更加直观和可控。
3.2 服务跨集群调用问题
在微服务架构中,服务通常会分布在不同的集群中,而服务之间的调用可能涉及到跨集群的情况。在 Nacos 中,服务跨集群调用时需要考虑一些问题,其中一个重要的问题是延迟。
服务调用时的一般原则是尽可能选择本地集群的服务进行调用,因为本地调用通常延迟较低。当本地集群的服务不可访问时,才考虑跨集群调用。
以一个示例来说明:
假设有两个集群,一个是杭州集群,另一个是上海集群。在杭州集群中有一个 order-service
服务,而在上海集群中也有一个相同的 user-service
服务。如果 order-service
这个微服务需要调用 user-service
,它首先会尝试调用本地集群的服务,即杭州集群的 user-service
。只有当杭州集群的服务不可访问时,才会考虑跨集群调用,去访问上海集群的 user-service
。
这样的设计可以有效降低服务调用的延迟,因为本地调用通常比跨集群调用更快速。同时,也提高了系统的稳定性,避免了出现某个集群不可用时,整个系统都无法正常工作的情况。
3.3 服务集群属性设置
当我们在 Nacos 的控制台查看具体服务的详情的时候,会发现当前服务处于的集群的 DEFAULT
:
此时,如果我们想要修改服务的所属集群,则可以通过修改 application.yml
文件来进行配置:
spring:cloud:nacos:server-addr: localhost:8848 # nacos 服务地址discovery:cluster-name: name # 集群名称
例如,将user-service
服务的一个实例设置到杭州集群中,另外两个实例设置到上海集群中,重新启动后再次查看 Nacos 的控制台:
此时就成功配置user-service
了服务的集群属性。但是,如果要想order-service
调用里自己最近的集群,还需要对 order-service
服务进行集群属性的配置。
例如,将其配置到杭州集群:
配置完成之后,现在 order-service
和 8081端口的 user-service
就在同一个集群中了,而 8082 和 8083 端口的 user-service
则在上海集群中。
3.4 修改负载均衡策略为集群策略
重启 order-service
服务,然后再进行多次查询订单操作,观察调用 user-service
服务的情况:
此时我们发现了,好像没有采用优先访问相同集群的策略,而是采取轮询的负载均衡方式。当然,应该采取这种方式,因为目前order-service
中设置的就是随机选择的负载均衡策略:
如果要想优先访问相同集群的策略,则需要修改 order-service
的application.yml
文件,设置负载均衡的 IRule
为 com.alibaba.cloud.nacos.ribbon.NacosRule
,这个规则优先会寻找与自己同集群的服务:
# 修改 Ribbon 负载均衡策略
userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 集群优先负载均衡规则
再次重启 order-service
服务,然后多次进行订单查询操作,观察 user-service
的调用情况:
此时可以发现,访问的都是 8081 端口的 user-service
实例,而没有服务另外两个实例。这是因为 8081 端口的 user-service
服务和order-service
在同一个集群中。
如果此时停止 8081 的user-service
服务,再次访问会出现什么样的状况呢?例如:
此时就跨集群的访问到了 8083 端口的这个 user-service
服务。
并且,在order-service
服务的日志中也出现了警告:
其含义就是进行了跨集群的调用,即 order-service
想要服务的集群是杭州集群,但是实际上访问的是上海集群。
四、根据服务的权重进行负载均衡
在实际部署中,服务器设备的性能可能存在差异,一些实例所在机器的性能较好,而另一些性能较差。为了合理利用资源,我们希望性能较好的机器能够承担更多的用户请求。Nacos 提供了权重配置的功能,通过设置权重,可以控制访问频率,权重越大的实例被选中的概率就越高。
下面演示如何在 Nacos 控制台中设置服务实例的权重:
-
在 Nacos 控制台中,选中相应实例后点击编辑按钮,就发现了权重的配置项:
-
设置某个实例的权重,例如将 8081 端口的服务的权重设置为 0.1:
设置了权重之后,进行多次访问,观察 user-service
服务的调用情况:
可以看到,经过多次访问后,8081 端口对应的 user-service
被访问的次数相对较少,说明权重设置生效。这种方式可以有效地利用资源,使性能较好的机器更多地承担用户请求,实现负载均衡。
注意:
- 如果将权重设置为0,那么这个服务就不会被服务到了。
- 在实际生产环境中,可以在某个服务需要升级的时候,将其权重设置为0,从而避免将流量导向到正在升级的实例,防止影响用户体验,等升级完成后,再将权重恢复为正常值。
- 同时,这个设置也适用于故障处理,通过将故障的服务实例的权重设置为0,暂时屏蔽掉该实例,以保证整体服务的可用性。
五、Nacos 环境隔离
5.1 什么是 Nacos 的环境隔离(namespace)
通过上文我们知道了 Nacos 是一个注册中心,但是同时 Nacos 还是一个数据中心。因此,Nacos 为了管理服务和数据,它还提供了对环境隔离的支持。Nacos 中服务存储和数据存储的最外层都是一个名为 namespace
的东西,用来做最外层隔离。
如下图所示:
从外到里,Nacos 的层级关系如下:
-
Namespace(命名空间): 是最外层的隔离单位。一个 Namespace 对应一个隔离环境,包含独立的服务和配置信息。每个 Namespace 都有唯一的命名空间 ID 和名称。
-
Group(分组): 在一个 Namespace 下,服务和配置可以根据 Group 进行划分。不同的 Group 中可以包含相同服务名(Service)或配置名(Data)的不同版本。Group 的作用是在一个 Namespace 中更细粒度地划分服务和配置。
-
Service/Data(服务/配置): 是 Namespace 和 Group 中最基本的单位。Service 代表服务,Data 代表配置。在一个 Namespace 和 Group 的范围内,服务和配置的名称是唯一的。
这种分层结构使得 Nacos 具有很好的灵活性和隔离性。Namespace 提供最大范围的隔离,Group 进一步细化隔离,而 Service 和 Data 则是具体的服务和配置单元。
5.2 为什么需要环境隔离
环境隔离在分布式系统和微服务架构中是一项重要的实践,对于 Nacos 来说,引入环境隔离的主要原因包括:
-
多环境支持: 在软件开发和运维过程中,通常会存在多个环境,例如开发环境、测试环境、生产环境等。通过使用 Namespace 来隔离环境,可以使得不同环境下的服务和配置信息得以独立管理,不会相互干扰。
-
团队协作: 在大型项目中,可能有多个开发团队同时在开发和维护服务。每个团队都可以在自己的 Namespace 下独立管理服务和配置,确保彼此之间的隔离。
-
版本管理: 随着业务的发展,服务和配置可能会有多个版本。通过使用 Group 和 Namespace 的结构,可以更好地进行版本管理,不同版本的服务和配置可以在同一个 Namespace 下通过 Group 进行区分。
-
隔离风险: 在微服务架构中,服务之间是相互独立的。如果没有环境隔离,一个服务的错误可能会波及到其他服务,导致整个系统出现问题。通过使用 Namespace 隔离环境,可以最小化这种风险。
总的来说,Nacos 的环境隔离功能为多环境、多团队、多版本的复杂场景提供了灵活的解决方案,使得服务和配置的管理更加清晰和可控。
5.3 设置 Nacos 的环境隔离
查看 Nacos 控制台中的“命名空间”,可以发现为我们提供了一个默认的命名空间public
:
而此时所有的服务也都在这个命名空间中:
通过 Nacos 控制台以及相关配置文件的修改即可完成 Nacos 环境隔离的设置,具体的操作步骤如下:
-
在 Nacos 控制台可以的“命名空间”中创建 namespace,用来隔离不同环境:
此时创建一个dev
的命名空间,用于开发环境。其中还有一个命名空间 ID,这个ID可以填也可以不填,不填则会使用 UUID 自动生成一个唯一 ID。 -
点击确认之后,就会发现为
dev
自动生成了命名空间 ID:
并且此时的服务列表中也多了一个 dev
的命名空间,但其中还没有注册任何服务:
- 修改
order-service
的application.yml
,添加新创建的 namespace:
spring:cloud:nacos:server-addr: localhost:8848 # nacos 服务地址discovery:namespace: ID # 命名空间 ID
注意,这个 ID 要与 Nacos 中的 命名空间 ID 保持一致。
例如,设置为 dev
命名空间的 ID:
5.4 重启 order-service 服务
设置完了 order-service
服务的命名空间之后,重启并查看控制台服务列表:
此时,可以发现在 dev
命名空间中就成功注册了order-service
服务了。
如果此时再次访问订单信息,那么会访问成功吗?
发现结果报错了,原因是没有可以的 user-service
可用实例,但是现在明明启动了三个 user-service
实例啊。
原来三个 user-service
实例是位于 public
命名空间中的,而 order-service
位于 dev
命名空间,由于命名空间具有隔离性,因此就访问不到其他命名空间的 user-service
服务了。
此时,以同样的方式也将user-service
服务也注册到 dev
命名空间中:
重启服务,查看 Nacos 控制台:
发现所有服务都在dev
命名空间中了,再次服务订单信息,就可以正常访问了:
六、Nacos 注册中心原理剖析
6.1 Nacos 注册中心的执行流程
Nacos(Naming and Configuration Service)是一个开源的服务发现和配置管理平台,用于构建和管理微服务体系结构。在微服务架构中,服务的注册与发现是至关重要的,而Nacos作为一种服务注册中心,承担了这一关键任务。下面将深入剖析 Nacos 注册中心的执行流程,详细说明其背后的原理。
Nacos 注册中心执行流程概览:
对上图流程的详细说明:
-
服务提供者注册: 服务提供者在启动时,将自己的服务信息注册到Nacos注册中心。这包括服务名称、IP地址、端口号等关键信息。注册的实例可以是临时实例或非临时实例,根据实际需要选择注册类型。
-
健康检测:
- 对于临时实例,Nacos采用心跳检测机制。注册的临时实例会定期向Nacos注册中心发送心跳包,证明自己正常运行。如果心跳包未按时到达,Nacos将删除该实例,确保注册中心中只有健康的服务实例。
- 对于非临时实例,Nacos会主动向实例发起询问,检查其健康状态。如果发现异常,Nacos将更新实例的健康状态,同时在实例恢复正常后,将其状态恢复。
-
服务消费者拉取: 服务消费者定期向Nacos注册中心拉取最新的服务列表。这个服务列表包含了可用的服务实例信息,使得消费者能够了解到当前可用的服务。
-
异常处理与服务推送: Nacos注册中心具有异常处理机制。当注册中心发生异常或停止运行时,它会主动推送更新后的服务信息给服务消费者。这样,消费者能够及时感知到注册中心的状态变化,并作出相应的调整,确保系统的稳定性。
-
负载均衡: 服务消费者在获取到服务列表后,会在缓存的服务列表上进行负载均衡。这确保了请求能够被均匀分配到不同的服务实例上,避免了单点故障的发生。
6.2 临时实例和非临时实例的设置
查看 Nacos 的控制台中的实例详情:
可以发现,前面注册的实例默认都是临时实例的。
如果要修改为非临时实例,则可以通过修改 application.yml
文件进行设置:
spring:cloud:nacos:discovery:ephemeral: false # 设置为非临时实例
例如,修改 order-service
服务为非临时实例:
重启服务,再次查看 Nacos 控制台:
此时就成功将 order-service
服务设置为了非临时实例的。
如果此时停止 order-service
服务,可以发现健康状态变为 false
,但是并没有从服务列表中删除:
再次重启 order-service
服务,可以发现健康状态又变成了 true
:
总结:Nacos 和 Eureka 的区别
Nacos 和 Eureka 是两个常见的服务注册与发现工具,它们有一些区别,主要体现在以下几个方面:
-
数据存储方式:
- Nacos: Nacos不仅是服务注册中心,还是一个支持配置管理的平台。它使用类似数据库的方式存储服务和配置信息,提供了命名空间、组、服务、实例等多层次的存储结构,支持更细粒度的管理。
- Eureka: Eureka主要是一个简单的服务注册与发现系统,它的服务信息存储在一个全局的注册表中,相对来说简单直接。
-
多环境隔离:
- Nacos: Nacos提供了Namespace(命名空间)和Group的概念,支持多环境、多团队、多版本的隔离和管理。
- Eureka: Eureka没有直接支持多环境隔离的概念,需要通过其他手段来实现。
-
配置管理:
- Nacos: Nacos作为配置中心,支持动态配置、配置的版本管理、监听配置变更等功能。
- Eureka: Eureka主要关注服务注册与发现,没有显式的配置管理功能。
-
服务权重与流量控制:
- Nacos: Nacos支持通过权重配置来实现流量控制,可以根据服务的性能设置不同的权重。
- Eureka: Eureka在原生形态下并没有提供类似权重配置的功能,需要借助其他组件(比如Ribbon)来实现。
-
兼容性:
- Nacos: Nacos提供了Spring Cloud的原生支持,更好地与Spring Cloud应用集成。
- Eureka: Eureka是Netflix开发的,也有与Spring Cloud的天然集成。
总体而言,Nacos 相对于 Eureka 更加全面,支持更多的功能,尤其在配置管理、多环境隔离等方面更加灵活。选择使用哪个取决于具体的需求和场景。
相关文章:
【Spring Cloud】深入探索 Nacos 注册中心的原理,服务的注册与发现,服务分层模型,负载均衡策略,微服务的权重设置,环境隔离
文章目录 前言一、初识 Nacos 注册中心1.1 什么是 Nacos1.2 Nacos 的安装,配置,启动 二、服务的注册与发现三、Nacos 服务分层模型3.1 Nacos 的服务分级存储模型3.2 服务跨集群调用问题3.3 服务集群属性设置3.4 修改负载均衡策略为集群策略 四、根据服务…...
No156.精选前端面试题,享受每天的挑战和学习
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...
如何在PIL图像和PyTorch Tensor之间进行相互转换,使用pytorch进行PIL和tensor之间的数据转换
目录 引言PIL简介PyTorch和Torchvision简介PIL转换为TensorTensor转换为PIL实例代码和解释结论参考文献 📝 引言 在计算机视觉领域,使用图像处理库对图像进行预处理是非常常见的。其中,Python Imaging Library(PIL)以…...
STM32F4X UCOSIII任务消息队列
STM32F4X UCOSIII任务消息队列 任务消息队列和内核消息队列对比内核消息队列内核消息队列 UCOSIII任务消息队列API任务消息队列发送函数任务消息队列接收函数 UCOSIII任务消息队列例程 之前的章节中讲解过消息队列这个机制,UCOSIII除了有内核消息队列之外࿰…...
8个居家兼职,帮助自己在家搞副业
越来越多的人开始追求居家工作的机会,无论是为了获得更多收入以改善生活质量,还是为了更好地平衡工作和家庭的关系,居家兼职已成为一种趋势。而在家中从事副业不仅能够为我们带来额外的收入,更重要的是,它可以让我们在…...
管理与系统思维
技术管理者不仅仅需要做事情,还需要以系统思维的方式推动组织变革,从而帮助团队和个人做到更好。原文: Management and Systems Thinking 图片来源: Dall-E "除非管理者考虑到组织的系统性,否则大多数提高绩效的努力都将注定失败。"…...
电死人的是电流还是电压?
先说答案,是电流。 这个有两个派别,一个是电流派,一个是电压派。 举个例子,拿我们的头发或者指甲之类的高电阻物质去接触高压,你会发现基本没有什么作用;还有就是冬天我们脱毛衣的时候,噼里啪啦…...
mac 编译问题记录
1、mac 编译提示 Unsupported option ‘--no-pie‘ Linux 上用 --no-pie mac 上用 -no-pie 2、mac 找不到 malloc.h 使用 #include <sys/malloc.h> Mac上使用malloc函数报错_mac malloc.h-CSDN博客...
centos 7.9同时安装JDK1.8和openjdk11两个版本
1.使用的原因 在服务器上,有些情况因为有一些系统比较老,所以需要使用JDK8版本,但随着时间的发展,新的软件出来,一般都会使用比较新的JDK版本。所以就出现了我们标题的需求,一个系统内同时安装两个不同的版…...
【JavaEE】HTML
JavaWeb HTML 超文本标记语言 超文本:文本、声音、图片、视频、表格、连接标记:有许许多多的标签组成 vscode开发工具搭建 因为我使用的IDEA是社区版,代码高亮补全缩进都有些问题,使用vscode是最好的选择~ 安装 Visual Stu…...
【数据结构--八大排序】之堆排序
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
c# 中的类
反射 Activator.CreateInstance class Program {static void Main(string[] args){//反射Type t typeof(Student);object o Activator.CreateInstance(t, 1, "FJ");Student stu o as Student;Console.WriteLine(stu.Name);//动态编程dynamic stu2 Activator.Cre…...
基于单片机的煤气泄漏检测报警装置设计
一、项目介绍 煤气泄漏是一种常见的危险情况,可能导致火灾、爆炸和人员伤亡。为了及时发现煤气泄漏并采取相应的安全措施,设计了一种基于单片机的煤气泄漏检测报警装置。 主控芯片采用STM32F103C8T6作为主控芯片,具有强大的计算和控制能力。…...
[导弹打飞机H5动画制作] 导弹每次飞行的随机路线制作
技术核心提示: 第一步:检测引导层插件是否具备,如果没有手工添加: createjs.MotionGuidePlugin.install(); 第二步:增加全局变量: var fValue=0; var iOddEven =0; var missileObj=null; 第三步:填写 第一帧 代码: if (missileObj)stage.removeChild(missileObj);missile…...
OpenCV实现FAST算法角点检测 、ORB算法特征点检测
目录 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 非极大值抑制 1.3 代码实现 1.4 结果展示 2 ,ORB算法 2.1代码实现 2.2 结果展示 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 …...
【Unity的 Built-in 渲染管线下实现好用的GUI模糊效果_Blur_案例分享(内附源码)】
CGPROGRAM实现好用的GUI模糊效果 实现Blur模糊方式1C#代码如下方式1_Shader代码如下实现Blur模糊方式2方式2_Shader如下实现Blur模糊方式1 其他的模糊效果,在这一篇。 效果如图: 新建一个C#文件,命名为"CommandBlur",打开C#,删除内容,复制粘贴下面的代码:…...
AR智能眼镜:提升现场服务技能、效率与盈利能力的利器(一)
随着技术的不断进步,现场服务组织正朝着远程支持转变,用以解决技能差距和生产力问题,提高员工培训和操作效率,同时为企业提高利润率,创造竞争优势。 本文将探讨增强现实(AR)、辅助现实…...
ChatGPT 在机器学习中的应用
办公室里一个机器人坐在人类旁边,Artstation 上的流行趋势,美丽的色彩,4k,充满活力,蓝色和黄色, DreamStudio出品 一、介绍 大家都知道ChatGPT。它在解释机器学习和深度学习概念方面也非常高效,…...
【JavaEE】锁策略
文章目录 前言1. 乐观锁和悲观锁2. 重量级锁和轻量级锁3. 自旋锁和挂起等待锁4. 公平锁和非公平锁5. 可重入锁和非可重入锁6. 读写锁Java synchronized 分别对应哪些锁策略1. 乐观锁和悲观锁2. 重量级锁和轻量级锁3. 自旋锁和挂起等待锁4. 公平锁和非公平锁5. 可重入锁和非可重…...
在 SDXL 上用 T2I-Adapter 实现高效可控的文生图
T2I-Adapter 是一种高效的即插即用模型,其能对冻结的预训练大型文生图模型提供额外引导。T2I-Adapter 将 T2I 模型中的内部知识与外部控制信号结合起来。我们可以根据不同的情况训练各种适配器,实现丰富的控制和编辑效果。 同期的 ControlNet 也有类似的…...
Python分支结构和循环结构
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一.分支结构 分支结构是根据判断条件结果而选择不同向前路径的运行方式,分支结构分为:单分支,二分支和多分支。 1࿰…...
Unity调用API函数对系统桌面和窗口截图
Unity3D调用WINAPI函数对系统窗口截图 引入WINAPI函数调用WINAPI函数进行截图使用例子 引入WINAPI函数 using System; using System.Collections; using System.Runtime.InteropServices; using System.Drawing;[DllImport("user32.dll")]private static extern Int…...
【问题思考总结】CPU怎么访问磁盘?CPU只有32位,最多只能访问4GB的空间吗?
问题 在学习操作系统的时候发现了这样一个问题,32位的CPU寻址空间只有4GB,难道只有4GB的空间可以使用吗?以此为始,我开始了一些思考。 思考 Q1:首先,我似乎混淆了一个概念,内存和外存&#x…...
UG NX二次开发(C++)-CAM-根据刀具对程序组进行重新分组
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX中创建一个三维模型3、在UG NX/CAM中创建多个加工程序4、采用UG NX二次开发(NXOpen)实现按照刀具分组程序组4.2 创建UI Styler4.1 实现逻辑4.2 生成的代码如下:4.3 测试效果4.…...
Unity如何实现TreeView
前言 最近有一个需求,需要实现一个TreeView的试图显示,开始我一直觉得这么通用的结构,肯定有现成的UI组件或者插件可以使用,结果,找了好久,都没有找到合适的插件,有两个效果差强人意。 最后在回家的路上突然灵光一闪,想到了一种简单的实现方式,什么插件都不用,仅使用…...
Android widget 小部件使用指南强化版
Android widget 小部件使用指南强化版 一、简单UI的小部件二、含集合的小部件三、可配置的小部件四、可控制的小部件五、Android 12 Widget 更新 小部件是主屏幕定制的一个重要方面。您可以将它们视为应用程序最重要的数据和功能的“概览”视图,这些数据和功能可以直…...
Linux下C语言操作网卡的几个代码实例?特别实用
前面写了一篇关于网络相关的文章:如何获取当前可用网口。 《简简单单教你如何用C语言列举当前所有网口!》 那么如何使用C语言直接操作网口? 比如读写IP地址、读写MAC地址等。 一、原理 主要通过系统用socket()、ioctl()、实现 int sock…...
noip2011选择旅馆
1.审题:第一个人与第二个人入住的旅馆要求是同色的; 两个人去消费的旅馆并没有要求与入住的旅馆是同色的(这点要小心) 2.要求记录以下数据: 1)a[color]表示当前同为颜色color的旅馆数 2)b[co…...
vue造轮子完整指南--npm组件包开发步骤
一、项目包文件的创建和初始化。 1. 新建项目包。 vue create <Project Name> //用于发布npm包的项目文件名 ps:一般选择自定义,然后不需要Vuex和Router,其他选项按自己实际情况选择安装即可。 2.修改原始src文件名、新增组件项目存放文件和修改…...
28 drf-Vue个人向总结-1
文章目录 前后端分离开发展示项目项补充知识开发问题浏览器解决跨域问题 drf 小tips设置资源root目录使用自定义的user表设置资源路径media数据库补充删除表中数据单页面与多页面模式过滤多层自关联后端提交的数据到底是什么jwt token登录设置普通的 token 原理使用流程解析 jw…...
如何做简洁网站/免费推广的网站有哪些
在数据聚合与分组中,主要包括: 根据一个或多个键(函数、数组、或dataframe的列名)拆分pandas对象 计算分组后数据的统计值,包括:计数,平均值,标准差,自定义函数 对datafr…...
测字算命网站开发/外贸seo优化公司
综述 python对文件排序、遍历 方法 首先遍历,然后排序: files.sort(key lambda x:int(x[:-4])) 注意这里处理的是形如: 0.txt 12.txt 这样的文件命名 代码 import os from os.path import isfile, joinpathIn "im1" files […...
如何上传织梦做的网站/网站友情链接代码
现在很多OA系统都是可以免费试用的,想要知道哪个好,可以直接前往产品官网体验试用后再选。感兴趣的话,可以试用下捷效办公。网址:国内最专业的私有化移动办公系统 - 捷效办公捷效办公是一款新型企业移动协同办公系统。捷效紧紧围绕…...
咸阳做网站公司/竞价账户托管哪家好
在调参记录14里,只有2个残差模块,结果遭遇欠拟合了。这次增加一个残差模块,试一试在Cifar10数据集上的效果。自适应参数化ReLU激活函数的基本原理如下:自适应参数化ReLU激活函数Keras程序如下:#!/usr/bin/env python3#…...
建手机网站款软件/网课培训机构排名前十
1 缘起 曾经在看分布式锁的时候,还是处于了解阶段, 回头总结时,发现有很多细节没有探究到, 本文以-看图说话的方式分析不同的分布式锁方案, 分布式锁需要保证: (1)互斥性࿱…...
贵阳学校网站建设/今日小说搜索风云榜
大家好,我是老赵Java 之父 James Gosling 近日发表推特称,开发者应尽快弃用 JDK 8,可以选择 JDK 17 LTS,因为后者在各个方面都带来了巨大的改进。不过醉翁之意不在酒,原来 Java 之父只是为了给东家 AWS 的 OpenJDK 发行…...