安平谁做网站好/营销技巧和话术
为什么需要注册中心
思考:网络请求,如果服务提供者发生变动,服务调用者如何感知服务提供者的ip和端口变化?
// 微服务之间通过RestTemplate调用,ip:port写死,如果ip或者port变化呢?
String url = "http://localhost:8020/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);
所以,在服务提供者的 ip 或端口发生变化时,服务调用者能够及时感知到,这也就是注册中心的作用。
服务注册中心的作用就是服务注册与发现
- 服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去。
- 服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。
注册中心选型
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
---|---|---|---|---|---|
一致性协议 | CP+AP | AP | CP | - | CP |
健康检查 | TCP/HTTP/MySql/Client Beat | Client Beat | TCP/HTTP/gRPC/CMD | - | Keep Alive |
负载均衡策略 | 权重/Metadata/Selector | Ribbon | Fabio | RoundRobin | - |
雪崩保护 | 有 | 有 | 无 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud 集成 | 支持 | 支持 | 支持 | 不支持 | 支持 |
Dubbo 集成 | 支持 | 不支持 | 支持 | 不支持 | 支持 |
K8S 集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
Nacos 是什么
官方介绍:https://nacos.io/zh-cn/docs/v2/what-is-nacos.html
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos 优势:
- 易用:简单的数据模型,标准的 restfulAPI,易用的控制台,丰富的使用文档。
- 稳定:99.9% 高可用,脱胎于历经阿里巴巴 10 年生产验证的内部产品,支持具有数百万服务的大规模场景,具备企业级 SLA 的开源产品。
- 实时:数据变更毫秒级推送生效;1w 级,SLA 承诺 1w 实例上下线 1s,99.9% 推送完成;10w 级,SLA 承诺 1w 实例上下线 3s,99.9% 推送完成;100w 级别,SLA 承诺 1w 实例上下线 9s 99.9% 推送完成。
- 规模:十万级服务/配置,百万级连接,具备强大扩展性。
Nacos 注册中心架构
相关核心概念
- 服务(Service)
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service。
- 服务注册中心(Service Registry)
服务注册中心,它是服务及其实例和元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
- 服务元数据(Service Metadata)
服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。
- 服务提供方(Service Provider)
是指提供可复用和可调用服务的应用方。
- 服务消费方(Service Consumer)
是指会发起对某个服务调用的应用方。
核心功能
- 服务注册
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(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
微服务整合 Nacos 注册中心实战
Nacos Server 环境搭建
官方文档:https://nacos.io/zh-cn/docs/v2/guide/admin/deployment.html
1)下载nacos server安装包
选择安装nacos server版本:v2.2.1。
wget https://github.com/alibaba/nacos/releases/download/2.2.1/nacos-server-2.2.1.tar.gz
2)解压,进入conf/application.properties
,配置nacos.core.auth.plugin.nacos.token.secret.key
密钥
# 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,使用默认值有安全风险 (2.2.0.1后无默认值)
nacos.core.auth.plugin.nacos.token.secret.key=aiDLyHlCgaXB08FL5zS3W6YQZssTVNScY
注意:在2.2.0.1版本后,社区发布版本需要自行填充nacos.core.auth.plugin.nacos.token.secret.key
的值,否则无法启动节点。
自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符。否则,启动报错如下:
权限认证:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
3)进入nacos目录,单机模式启动nacos
bin/startup.sh -m standalone
进入 bin/startup.sh 文件,可以将默认的启动模式改为 MODE=“standalone”:
启动日志:
4)访问nacos的管理端
http://192.168.0.83:8848/nacos
默认的用户名密码是:nacos/nacos。
微服务提供者整合 Nacos
使用 Spring Cloud Alibaba Nacos Discovery,可基于 Spring Cloud 的编程模型快速接入 Nacos 服务注册功能。服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上。
以order-service整合nacos为例:
1)引入依赖
order-service模块pom中引入nacos-client依赖
<!-- nacos服务注册与发现 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2)启动类上添加@EnableDiscoveryClient注解,此注解可以省略
@EnableDiscoveryClient
@SpringBootApplication
public class TestNacosApplication {public static void main(String[] args) {SpringApplication.run(TestNacosApplication.class, args);}}
3)yml配置文件中配置nacos注册中心地址
server:port: 8080spring:application:name: order-service # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 192.168.0.83:8848 #注册中心地址,建议用域名替换ip
更多配置:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
4)启动order-service服务,nacos管理端界面查看order-service是否注册成功
如果是云服务器,需要将 9848 端口开启,否则启动会报错。
5)测试,通过Open API查询实例列表
http://192.168.0.83:8848/nacos/v2/ns/instance/list?serviceName=order-service
微服务调用者整合 Nacos
服务调用者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
以user-service整合nacos为例:
1)user-service模块pom中引入nacos-client依赖
<!-- nacos服务注册与发现 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2)启动类上添加@EnableDiscoveryClient注解,此注解可以省略
@SpringBootApplication
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class);}
}
3)yml配置文件中配置nacos注册中心地址
server:port: 8081spring:application:name: user-service # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 192.168.0.83:8848
4)启动user-service服务,nacos管理端界面查看user-service是否注册成功
整合 RestTemplate+Spring Cloud LoadBalancer 实现微服务调用
Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器实现,用来替代Ribbon。对于负载均衡机制,增加了ReactiveLoadBalancer接口,并提供了基于round-robin轮询和Random随机的实现。
官方文档:https://docs.spring.io/spring-cloud-commons/docs/4.0.4/reference/html/#spring-cloud-loadbalancer
loadbalancer常用的配置:
spring:cloud:# 负载均衡配置loadbalancer:ribbon:# 禁用ribbonenabled: falsecache:# 启用本地缓存, 根据实际情况权衡enabled: true# 缓存空间大小capacity: 1000# 缓存的存活时间, 单位sttl: 2# caffeine缓存的配置, 需引入caffeine依赖caffeine:# initialCapacity初始的缓存空间大小,expireAfterWrite最后一次写入后经过固定时间过期spec: initialCapacity=500,expireAfterWrite=5shealth-check:# 重新运行运行状况检查计划程序的时间间隔。interval: 25s# 运行状况检查计划程序的初始延迟值initial-delay: 30retry: # 需要引入Spring Retry依赖# 该参数用来开启重试机制,默认是关闭enabled: true# 切换实例的重试次数max-retries-on-next-service-instance: 2# 对当前实例重试的次数max-retries-on-same-service-instance: 0# 对所有的操作请求都进行重试retry-on-all-operations: true# Http响应码进行重试retryable-status-codes: 500,404,502
user-service调用order-service获取用户订单信息为例:
1)引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
2)使用RestTemplate进行服务调用
给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 loadbalancer 的集成
@Configuration
public class RestConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}
3)user-service中编写调用逻辑,调用order-service服务
@RequestMapping(value = "/findOrderByUserId/{id}")
public R findOrderByUserId(@PathVariable("id") Integer id) {// 利用@LoadBalanced,restTemplate需要添加@LoadBalanced注解// 注意此处域名填调用方注册的微服务名String url = "http://order-service/order/findOrderByUserId/"+id;R result = restTemplate.getForObject(url,R.class);return result;
}
测试:[http://localhost:8080/user/findOrderByUserId/1](http://localhost:8040/user/findOrderByUserId/1)
,返回数据:
Nacos 注册中心常用配置
服务分级存储模型
注册中心的核心数据是服务的名字和它对应的网络地址,当服务注册了多个实例时,我们需要对不健康的实例进行过滤或者针对实例的⼀些特征进行流量的分配,那么就需要在实例上存储⼀些例如健康状态、权重等属性。随着服务规模的扩大,渐渐的又需要在整个服务级别设定⼀些权限规则、以及对所有实例都生效的⼀些开关,于是在服务级别又会设立⼀些属性。再往后,我们又发现单个服务的实例又会有划分为多个子集的需求,例如⼀个服务是多机房部署的,那么可能需要对每个机房的实例做不同的配置,这样又需要在服务和实例之间再设定⼀个数据级别。
Nacos 在经过内部多年生产经验后提炼出的数据模型,则是⼀种服务-集群-实例
的三层模型。这样基本可以满足服务在所有场景下的数据存储和管理。
官网图片如下:
集群配置
在原有配置加入以下配置:
spring:application:name: order-service # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 192.168.0.83:8848cluster-name: SH
案例:跨集群调用优先本地集群的场景实现
利用cluster-name可以实现跨集群调用时,优先选择本地集群的实例,本地集群不可访问时,再去访问其他集群。
下面是Ribbon的NacosRule实现的负载均衡算法,就是利用了cluster-name实现了优先调用本地集群实例。
LoadBalancer默认情况下使用的ReactiveLoadBalancer实现是RoundRobinLoadBalancer。要切换到不同的实现,无论是针对所选服务还是所有服务,都可以使用自定义LoadBalancer配置机制。
// 注意:不要用@Configuration修饰
public class CustomLoadBalancerConfiguration {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory, NacosDiscoveryProperties nacosDiscoveryProperties){String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name,nacosDiscoveryProperties);}
}
在启动类上添加@LoadBalancerClient注解:
@SpringBootApplication
@LoadBalancerClient(value = "order-service", configuration = CustomLoadBalancerConfiguration.class)
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}}
服务逻辑隔离
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是DEFAULT_GROUP。
Namespace 隔离设计
命名空间(Namespace)用于进行租户(用户)粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
修改yml配置:
spring:application:name: user-service # 微服务名称cloud:nacos:discovery:server-addr: 192.168.0.83:8848 # 配置nacos注册中心地址namespace: bc50d386-8870-4a26-8803-0187486c57be # dev开发环境
启动user-service,进入nacos控制台可以看到user-service注册成功,所属namespace是dev:
测试:[http://localhost:8081/user/findOrderByUserId/1](http://localhost:8040/user/findOrderByUserId/1)
,报错:
原因:order-service和user-service使用了不同的namespace,导致服务隔离,user-service无法发现可用的order-service服务。
group 服务分组
不同的服务可以归类到同一分组,group也可以起到服务隔离的作用。yml中可以通过spring.cloud.nacos.discovery.group
参数配置。group更多应用场景是配置分组。
临时实例和持久化实例
在定义上区分临时实例和持久化实例的关键是健康检查的方式。临时实例使用客户端上报模式,而持久化实例使用服务端反向探测模式。临时实例需要能够自动摘除不健康实例,而且无需持久化存储实例。持久化实例使用服务端探测的健康检查方式,因为客户端不会上报心跳,所以不能自动摘除下线的实例。
在大中型的公司里,这两种类型的服务往往都有。⼀些基础的组件例如数据库、缓存等,这些往往不能上报心跳,这种类型的服务在注册时,就需要作为持久化实例注册。而上层的业务服务,例如微服务,服务的 Provider 端支持添加汇报心跳的逻辑,此时就可以使用动态服务的注册方式。
Nacos 1.x 中持久化及非持久化的属性是作为实例的⼀个元数据进行存储和识别。Nacos 2.x 中继续沿用了持久化及非持久化的设定,但是有了⼀些调整。在 Nacos2.0 中将是否持久化的数据抽象至服务级别,且不再允许⼀个服务同时存在持久化实例和非持久化实例,实例的持久化属性继承自服务的持久化属性。
# 持久化实例,ephemeral表示“短暂的”
spring.cloud.nacos.discovery.ephemeral: false
nacos 开启权限认证
官网说明:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
nacos server端conf/application.properties
添加如下配置:
# 开启认证
nacos.core.auth.enabled=true
# 配置自定义身份识别的key(不可为空)和value(不可为空)
# 这两个属性是auth的白名单,用于标识来自其他服务器的请求。具体实现见com.alibaba.nacos.core.auth.AuthFilter
nacos.core.auth.server.identity.key=authKey
nacos.core.auth.server.identity.value=nacosSecurty
微服务端application.yml
中添加如下配置:
spring:application:name: order-service # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 192.168.0.83:8848username: nacospassword: nacos
如果没有配置username 和 password,微服务端启动会抛出如下错误:
Nacos集群搭建
官网文档: https://nacos.io/zh-cn/docs/v2/guide/admin/cluster-mode-quick-start.html
集群部署架构图
因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面。
http://ip1:port/openAPI
,直连ip模式,机器挂了则需要修改ip才可以使用。http://SLB:port/openAPI
,挂载SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),直连SLB即可,下面挂server真实ip,可读性不好。http://nacos.com:port/openAPI
,域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式。
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
8848 | 0 | 主端口,客户端、控制台及OpenAPI所使用的HTTP端口 |
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
7848 | -1000 | Jraft请求服务端端口,用于处理服务端间的Raft相关请求 |
使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。9849和7848端口为服务端之间的通信端口,请勿暴露到外部网络环境和客户端测。
三节点集群搭建
1)环境准备
- 安装好 JDK,需要 1.8 及其以上版本
- 建议:2核 CPU / 4G 内存 及其以上
- 建议:生产环境 3 个节点 及其以上
准备三台centos7服务器
192.168.65.174
192.168.65.192
192.168.65.204
- 准备好nacos安装包
2)配置集群配置文件
在nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf
,请每行配置成ip:port
。
mv conf/cluster.conf.example conf/cluster.conf
vim conf/cluster.conf# ip:port
192.168.65.174:8848
192.168.65.192:8848
192.168.65.204:8848
注意:不要使用localhost或127.0.0.1,针对多网卡环境,nacos可以指定网卡或ip:
# 多网卡选择
# ip-address参数可以直接设置nacos的ip
# 该参数设置后,将会使用这个IP去cluster.conf里进行匹配,请确保这个IP的值在cluster.conf里是存在的
nacos.inetutils.ip-address=10.11.105.155# 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]=30.5.124.
nacos.inetutils.preferred-networks[0]=30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d))),30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d)))
3)开启默认鉴权插件
修改conf目录下的application.properties
文件:
nacos.core.auth.enabled=true
nacos.core.auth.system.type=nacos
nacos.core.auth.plugin.nacos.token.secret.key=${自定义,保证所有节点一致}
nacos.core.auth.server.identity.key=${自定义,保证所有节点一致}
nacos.core.auth.server.identity.value=${自定义,保证所有节点一致}
4)配置数据源
使用外置mysql数据源,生产使用建议至少主备模式。
4.1)初始化 MySQL 数据库
sql脚本:https://github.com/alibaba/nacos/blob/2.2.1/distribution/conf/mysql-schema.sql
4.2)修改application.properties
配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.65.174:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
5)分别启动三个nacos节点
以192.168.65.204
为例,进入nacos目录,启动nacos:
bin/startup.sh
6)访问nacos管理界面
登录[http://192.168.65.204:8848/nacos](http://192.168.65.204:8848/nacos)
,用户名和密码都是nacos。
微服务yml中配置:
spring:application:name: user-service # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 192.168.65.174:8848,192.168.65.192:8848,192.168.65.204:8848username: nacospassword: nacos
Nginx配置负载均衡
使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。9849和7848端口为服务端之间的通信端口,请勿暴露到外部网络环境和客户端测。
1)准备nginx环境
1.1)如果安装了nginx,先检查nginx是否有stream模块,输出中包含:--with-stream
nginx -V
1.2)安装nginx
# 安装依赖包
yum -y install gcc gcc-c++ autoconf automake
yum -y install zlib zlib-devel openssl openssl-devel pcre-devel# 下载nginx
wget https://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0# 编译nginx,如果使用 nginx 的 stream 功能,在编译时一定要加上 “--with-stream”
./configure --with-stream
make && make install
#安装后nginx默认路径/usr/local/nginx
2)配置http模块
在nginx的http下面配置http协议相关的地址和端口:
http {# nacos服务器http相关地址和端口upstream nacos-server {server 192.168.65.174:8848;server 192.168.65.192:8848;server 192.168.65.204:8848;}server {listen 8848;location / {proxy_pass http://nacos-server/;}}
}
3)配置grpc
需要nginx有stream模块支持。
# nacos服务器grpc相关地址和端口,需要nginx已经有stream模块
# stream块用于做TCP转发
stream {upstream nacos-server-grpc {server 192.168.65.174:9848;server 192.168.65.192:9848;server 192.168.65.204:9848;}server {listen 9848;proxy_pass nacos-server-grpc;}
}
- 启动nginx,然后就可以正常使用了。
sbin/nginx -c conf/nginx.conf
微服务yml中配置:
spring:application:name: mall-user # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: nacos.service.com:8848 # nacos.service.com 需建立和nginx ip的域名映射username: nacospassword: nacos
相关文章:

Alibaba Nacos注册中心实战
为什么需要注册中心 思考:网络请求,如果服务提供者发生变动,服务调用者如何感知服务提供者的ip和端口变化? // 微服务之间通过RestTemplate调用,ip:port写死,如果ip或者port变化呢? String ur…...

京东数据采集与挖掘(京东大数据):2023年10月京东冰箱品牌销售排行榜
鲸参谋监测的京东平台10月份冰箱市场销售数据已出炉! 10月份,冰箱市场的销售额有小幅上涨。鲸参谋数据显示,在京东平台上,今年10月冰箱市场的销量为94万,销售额将近23亿,同比增长超过1%。从价格上看&#x…...

某事业单位转型二类后绩效项目成功案例纪实
——事业单位从公益一类转向二类之后,如何通过绩效考核提高人员积极性 【客户行业】事业单位 【问题类型】绩效管理 【客户背景】 某国家级博物馆是由当地ZF与自然资源局共建共管的事业单位,是一家综合性较强的博物馆,入选过全国热搜博物…...

MySQL 和 SQL Server之间的数据迁移方法
目录 MySQL导入SQL Server 使用 SQL Server Management Studio (SSMS) 导入导出向导: 使用 SQL Server Integration Services (SSIS): SQL Server 导入 MySQL 使用 SQL Server Management Studio (SSMS) 导出数据: 使用 MySQL Workbench…...

单元测试实战(五)普通类的测试
为鼓励单元测试,特分门别类示例各种组件的测试代码并进行解说,供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战(一)Controller 的测试 单元测试实战(二)Service 的测试 单元测试实战&am…...

js 迭代器iterator 和 生成器Generator 10
✌ 文章目录 一、迭代器 iterator二、使用步骤1.引入库2.读入数据 总结 一、迭代器 iterator 迭代器是帮助我们对某个数据结构进行遍历的对象 迭代器:是一个对象,帮助我们对某个数据结构进行遍历 迭代器要符合迭代器协议,必须要有一个特定的n…...

100套Axure RP大数据可视化大屏模板及通用组件库
106套Axure RP大数据可视化大屏模板包括了多种实用美观的可视化组件库及行业模板库,行业模板涵盖:金融、教育、医疗、政府、交通、制造等多个行业提供设计参考。 随着大数据的发展,可视化大屏在各行各业得到越来越广泛的应用。可视化大屏不再…...

【OpenGauss源码学习 —— 执行算子(Append算子)】
执行算子(Append算子) Append 算子ExecInitAppend 函数exec_append_initialize_next 函数ExecAppend 函数ExecEndAppend 函数ExecReScanAppend 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和…...

Java(一)(引用类型的参数在传递,方法重载,面向对象编程基础)
基本类型和引用类型的参数在传递的时候有什么不同? 基本类型的值传递:参数传输存储的数据值 引用类型的值传递:参数传输存储的地址值 传递数组名字的时候,传递的是数组的地址,change方法可以通过地址直接访问我们在堆内存中开辟的数组,然后改变数组,数组中的元素发生变化 方…...

Vue第1天:特性概览
文章目录 Vue.js 简介 Vue的特性 如何使用Vue 安装Vue 通过CDN引入 使用npm 创建Vue实例 结语 Vue.js 简介 Vue.js(通常简称为Vue)是一款流行的JavaScript框架,专注于构建用户界面。它的设计灵感来自于现代的JavaScript框架…...

C++语法基础知识面经汇总
背景:汇总了网上C常考的基础知识,方便复习 1,static关键字 static可以用于成员变量,或者成员函数。存储空间在静态存储区(编译器会将其初始化为0,对应的存储空间直到程序执行结束才会释放)&…...

AM@幂级数性质@幂级数和函数求解
文章目录 幂级数性质四则运算性质分析性质求解和函数例例 幂级数性质 和多项式有相似的性质本文介绍用幂级数的性质求解幂级数和函数的两个例子 四则运算性质 若幂级数 ∑ n 0 ∞ a n x n \sum_{n0}^{\infin}a_{n}x^{n} ∑n0∞anxn(1)的收敛半径为 R 1 R_1 R1,和函数为…...

PHP低版本安全问题
目录 1、PHP弱类型问题 1.1 MD5、 SHA1 弱比较问题 1.2 数组 0 1)函数无法处理数组,返回0 2)strcmp 2、特殊字符串导致的问题 2.1 "ffifdyop" 与 md5(string,raw) 2.2 ereg函数漏洞:00 截断 3、正则匹配问…...

结构体——C语言初阶
一.结构体的声明: (1)结构的基础知识: 结构体是一种构造数据类型把不同类型的数据组合成一个整体结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量需要注意的是,结构体是一种…...

基于django电影推荐系统
基于django电影推荐系统 摘要 该Django电影推荐系统是一个简单而基础的框架,旨在展示系统的基本组件。系统包括两个主要模型,即Movie和Rating,用于存储电影信息和用户评分。视图层包括展示电影列表和电影详情的功能,使用模板进行页…...

【问题处理】WPS提示不能启动此对象的源应用程序如何处理?
哈喽,大家好,我是雷工! 最近在用WPS打开word文件中,插入的Excel附件时,无法打开,提示:“不能启动此对象的源应用程序”。 经过上网查找处理办法,尝试解决,现将解决过程记…...

UE 程序化网格 计算横截面
首先在构造函数内加上程序化网格,然后复制网格体到程序化网格组件上,将Static Mesh(类型StaticMeshActor)的静态网格体组件给到程序化网格体上 然后把StaticMesh(类型为StaticMeshActor)Instance暴漏出去 …...

【Spring】IoC容器的一些总结与补充
文章目录 1. 创建容器的两种方式相对路径导入绝对路径导入 2. 获取Bean的三种方式getBean后强转类型getBean内写明类别根据类别获取bean 3. 容器层次结构4. BeanFactory5. bean的总结6. 注入的总结 1. 创建容器的两种方式 相对路径导入 ApplicationContext ctx new ClassPat…...

Java GUI实现五子棋游戏
五子棋是一种双人对弈的棋类游戏,通常在棋盘上进行。棋盘为 1515 的方格,黑白双方各执棋子,轮流在棋盘的格点上落子,先在横、竖、斜线上形成五个相连的同色棋子者获胜。五子棋规则简单,易学难精,兼具攻防和…...

Python 集成 Nacos 配置中心
Python 集成 Nacos 配置中心 下载 Nacos 官方 pyhton 库 pip install nacos-sdk-python # 指定国内阿里云镜像源 pip3 install nacos-sdk-python -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com配置 Nacos 相关信息 Global:nacos:port: 8848…...

Debian 11 更新 Node.js 版本
发布于 2023-07-14 在 https://chenhaotian.top/debian/d-upd-nodejs/ 步骤 从 NodeSource 服务下载需要的 Node.js 安装脚本。注意更换版本号。当前的 LTS 版本是 18.x curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -现在可以直接从 apt 安装࿰…...

python 对图像进行聚类分析
import cv2 import numpy as np from sklearn.cluster import KMeans import time# 中文路径读取 def cv_imread(filePath, cv2_falgcv2.COLOR_BGR2RGB): cv_img cv2.imdecode(np.fromfile(filePath, dtypenp.uint8), cv2_falg) return cv_img# 自定义装饰器计算时间 def…...

程序员导航站
探路者 hello.alluniverse.vip 开发者导航 - Pro Developer网站导航 探路者是一款极简导航工具,致力于收录的每个站点都有其独特的作用。同时支持自定义导航,让用户快速实现个性化的导航站点。 特性概述 免费ChatGPT 装机必备 开发工具 Git精选项目 …...

BIO、NIO、AIO三者的区别及其应用场景(结合生活例子,简单易懂)
再解释三者之前我们需要先了解几个概念: 阻塞、非阻塞:是相较于线程来说的,如果是阻塞则线程无法往下执行,不阻塞,则线程可以继续往下 执行。同步、异步:是相较于IO来说的,同步需要等待IO操作完…...

深度学习YOLO图像视频足球和人体检测 - python opencv 计算机竞赛
文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习YOLO图像视频足球和人体检测 该项目较为新颖,适合作为竞赛课题方向,学长非…...

系列七、JVM的内存结构【堆(Heap)】
一、概述 一个JVM实例只存在一个堆内存,堆内存的大小是可以手动调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三个部分,即…...

什么是Selenium?如何使用Selenium进行自动化测试?
什么是 Selenium? Selenium 是一种开源工具,用于在 Web 浏览器上执行自动化测试(使用任何 Web 浏览器进行 Web 应用程序测试)。 等等,先别激动,让我再次重申一下,Selenium 仅可以测试Web应用…...

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I)
目录 A、求全是字母的最小十六进制数 B、Excel表格组合 C、求满足条件的日期 D、 取数字 - 二分 (1)暴力 (2)二分 E、最大连通块 - bfs F、哪一天? G、信号覆盖 - bfs (1)bfs…...

【数据结构】手撕双向链表
目录 前言 1. 双向链表 带头双向循环链表的结构 2. 链表的实现 2.1 初始化 2.2 尾插 2.3 尾删 2.4 头插 2.5 头删 2.6 在pos位置之前插入 2.7 删除pos位置 3.双向链表完整源码 List.h List.c 前言 在上一期中我们介绍了单链表,也做了一些练习题&…...

性能测试 —— Jmeter接口处理不低于200次/秒-场景
需求:期望某个接口系统的处理能力不低于200次/秒,如何设计? ①这个场景是看服务器对某个接口的TPS值是否能大于等于200,就可以了; ②系统处理能力:说的就是我们性能测试中的TPS; ③只要设计一…...