Spring Cloud融合Nacos实现服务的注册与发现 | Spring Cloud 4

news2024/9/30 3:24:47

一、前言

服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于服务的动态扩缩容。

Spring Cloud Alibaba Nacos Discovery通过自动配置以及其他Spring 编程模型的习惯用法为Spring Boot 应用程序在服务注册与发现方面提供和Nacos的无缝集成。 通过一些简单的注解,可以快速来注册一个服务,并使用Nacos组件来作为大规模分布式系统的服务注册中心。

Spring Cloud Alibaba Nacos Discovery可以帮助您将服务自动注册到Nacos服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,它也将服务实例自身的一些元数据信息,例如:hostport、健康检查URL、主页等注册到 Nacos

二、准备条件

  • 已完成Nacos服务端部署,本章基于上章实现的Nacos集群为基础,详情请见:nacos 单机集群搭建及常用生产环境配置 | Spring Cloud 3

  • 已完成SpringCloud初始项目的手脚架搭建,详情请见:Spring Cloud入门篇 Hello World | Spring Cloud 1

三、项目搭建

3.1 项目最终结构

在这里插入图片描述

  • 模块nacos-discovery-http,用于放置验证服务注册与发现所需对应的服务提供者和服务调用者应用。
  • 模块nacos-discovery-http/nacos-discovery-http-provider为服务提供者应用
  • 模块nacos-discovery-http/nacos-discovery-http-consumer为服务调用者应用

源码地址:https://gitee.com/gm19900510/springboot-cloud-example

根项目springboot-cloud-example/pom.xml完整版如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.gm</groupId>
	<artifactId>springboot-cloud-example</artifactId>
	<name>springboot-cloud-example</name>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	<description>SpringBoot-Cloud进阶实战示例</description>

	<properties>
		<spring-boot.version>2.7.9</spring-boot.version>
		<spring-cloud.version>2021.0.5</spring-cloud.version>
		<spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
	</properties>

	<modules>
		<module>hello-world</module>
		<module>nacos-discovery-http</module>
    </modules>

	<dependencies>
		<!--Lombok-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<!-- spring boot 依赖 -->
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring-boot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<!-- spring cloud 依赖 -->
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<!-- spring cloud alibaba 依赖 -->
			<dependency>
				<groupId>com.alibaba.cloud</groupId>
				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
				<version>${spring-cloud-alibaba.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<finalName>${project.name}</finalName>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-maven-plugin</artifactId>
					<version>${spring-boot.version}</version>
					<configuration>
						<finalName>${project.build.finalName}</finalName>
						<layers>
							<enabled>true</enabled>
						</layers>
					</configuration>
					<executions>
						<execution>
							<goals>
								<goal>repackage</goal>
							</goals>
						</execution>
					</executions>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>

	<profiles>
		<profile>
			<id>dev</id>
			<properties>
				<!-- 环境标识,需要与配置文件的名称相对应 -->
				<profiles.active>dev</profiles.active>
				<nacos.username>nacos</nacos.username>
				<nacos.password>nacos</nacos.password>
			</properties>
			<activation>
				<!-- 默认环境 -->
				<activeByDefault>true</activeByDefault>
			</activation>
		</profile>
	</profiles>
</project>

3.2 新增模块nacos-discovery-http

  • 在根项目下新建目录nacos-discovery-http
  • 在目录nacos-discovery-http下新增文件pom.xml

其中nacos-discovery-http/pom.xm,完整配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<parent>
		<artifactId>springboot-cloud-example</artifactId>
		<groupId>com.gm</groupId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<modelVersion>4.0.0</modelVersion>
	<packaging>pom</packaging>

	<artifactId>nacos-discovery-http</artifactId>
</project>
  • 选择nacos-discovery-http/pom.xm文件,右键点击添加为Maven项目

3.2 新增模块nacos-discovery-http-provider

在模块nacos-discovery-http下进行如下操作:

在这里插入图片描述

nacos-discovery-http/nacos-discovery-http-provider/pom.xml完整配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<parent>
		<groupId>com.gm</groupId>
		<artifactId>nacos-discovery-http</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<modelVersion>4.0.0</modelVersion>

	<artifactId>nacos-discovery-http-provider</artifactId>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-bootstrap</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-loadbalancer</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>

	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
				<excludes>
					<exclude>**/*.xlsx</exclude>
					<exclude>**/*.xls</exclude>
				</excludes>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>false</filtering>
				<includes>
					<include>**/*.xlsx</include>
					<include>**/*.xls</include>
				</includes>
			</resource>
		</resources>
	</build>
</project>

bootstrap.yml存储一些关于 Nacos 基本的配置,完整配置如下:

server:
  port: 4000

spring:
  application:
    name: @artifactId@
  cloud:
    nacos:
      username: @nacos.username@
      password: @nacos.password@
      discovery:
        server-addr: ${NACOS_HOST:nacos1.kc}:${NACOS_PORT:8848},${NACOS_HOST:nacos2kc}:${NACOS_PORT:8848},${NACOS_HOST:nacos3.kc}:${NACOS_PORT:8848}
management:
  endpoints:
    web:
      exposure:
        include: '*'

编写com/gm/nacos_discovery_http_provider/controller/ProviderController.java

package com.gm.nacos_discovery_http_provider.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {

    @Value("${server.port}")
    private int port;

    @RequestMapping(value = "sayHello", method = RequestMethod.GET)
    public String sayHello(@RequestParam String world) {
        return "当前服务端口为:" + port + ",请求参数:" + world;
    }

}

编写com/gm/nacos_discovery_http_provider/NacosHttpProviderApplication.java

package com.gm.nacos_discovery_http_provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;


@SpringBootApplication
@EnableDiscoveryClient
public class NacosHttpProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosHttpProviderApplication.class, args);
    }

}

在服务启动类中新增注解:@EnableDiscoveryClient,表示启动服务发现。

spring-cloud-starter-alibaba-nacos-discovery 在实现的时候提供了一个EndPoint

EndPoint的访问地址为 http://ip:port//actuator/nacosdiscovery。 EndPoint 的信息主要提供了两类:

  • subscribe: 显示了当前有哪些服务订阅者
  • NacosDiscoveryProperties: 显示了当前服务实例关于 Nacos 的基础配置

启动nacos-discovery-http-provider实例访问EndPoint 的信息如下所示:

{
    "subscribe": [
        {
            "name": "nacos-discovery-http-provider",
            "groupName": "DEFAULT_GROUP",
            "clusters": "DEFAULT",
            "cacheMillis": 1000,
            "hosts": [
                {
                    "ip": "192.168.1.82",
                    "port": 4000,
                    "weight": 1.0,
                    "healthy": true,
                    "enabled": true,
                    "ephemeral": true,
                    "clusterName": "DEFAULT",
                    "serviceName": "DEFAULT_GROUP@@nacos-discovery-http-provider",
                    "metadata": {
                        "preserved.register.source": "SPRING_CLOUD"
                    },
                    "ipDeleteTimeout": 30000,
                    "instanceHeartBeatInterval": 5000,
                    "instanceHeartBeatTimeOut": 15000
                },
                {
                    "ip": "192.168.1.82",
                    "port": 4001,
                    "weight": 1.0,
                    "healthy": true,
                    "enabled": true,
                    "ephemeral": true,
                    "clusterName": "DEFAULT",
                    "serviceName": "DEFAULT_GROUP@@nacos-discovery-http-provider",
                    "metadata": {
                        "preserved.register.source": "SPRING_CLOUD"
                    },
                    "ipDeleteTimeout": 30000,
                    "instanceHeartBeatInterval": 5000,
                    "instanceHeartBeatTimeOut": 15000
                }
            ],
            "lastRefTime": 0,
            "checksum": "",
            "allIPs": false,
            "reachProtectionThreshold": false,
            "valid": true
        }
    ],
    "NacosDiscoveryProperties": {
        "serverAddr": "nacos.kc:8848",
        "username": "nacos",
        "password": "nacos",
        "endpoint": "",
        "namespace": "",
        "watchDelay": 30000,
        "logName": "",
        "service": "nacos-discovery-http-provider",
        "weight": 1.0,
        "clusterName": "DEFAULT",
        "group": "DEFAULT_GROUP",
        "namingLoadCacheAtStart": "false",
        "metadata": {
            "preserved.register.source": "SPRING_CLOUD"
        },
        "registerEnabled": true,
        "ip": "192.168.1.82",
        "networkInterface": "",
        "ipType": "IPv4",
        "port": 4000,
        "secure": false,
        "accessKey": "",
        "secretKey": "",
        "heartBeatInterval": null,
        "heartBeatTimeout": null,
        "ipDeleteTimeout": null,
        "instanceEnabled": true,
        "ephemeral": true,
        "failureToleranceEnabled": false,
        "failFast": true,
        "nacosProperties": {
            "password": "nacos",
            "endpoint": "",
            "secretKey": "",
            "serverAddr": "nacos.kc:8848",
            "accessKey": "",
            "clusterName": "DEFAULT",
            "namespace": "",
            "com.alibaba.nacos.naming.log.filename": "",
            "namingLoadCacheAtStart": "false",
            "username": "nacos"
        }
    }
}

针对后续服务调用的负载均衡验证,变更服务端口号,再次启动nacos-discovery-http-provider实例。
在这里插入图片描述
在这里插入图片描述
至此服务提供者配置完成,启动两个服务实例,端口分别为4000和4001。查看Nacos服务端服务列表

在这里插入图片描述
在这里插入图片描述

3.3 新增模块nacos-discovery-http-consumer

在模块nacos-discovery-http下进行如下操作:

在这里插入图片描述

nacos-discovery-http/nacos-discovery-http-consumer/pom.xml完整配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<parent>
		<groupId>com.gm</groupId>
		<artifactId>nacos-discovery-http</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<modelVersion>4.0.0</modelVersion>
	<packaging>jar</packaging>

	<artifactId>nacos-discovery-http-consumer</artifactId>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-bootstrap</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-loadbalancer</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>io.fabric8</groupId>
				<artifactId>docker-maven-plugin</artifactId>
			</plugin>
		</plugins>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
				<excludes>
					<exclude>**/*.xlsx</exclude>
					<exclude>**/*.xls</exclude>
				</excludes>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>false</filtering>
				<includes>
					<include>**/*.xlsx</include>
					<include>**/*.xls</include>
				</includes>
			</resource>
		</resources>
	</build>


</project>

bootstrap.yml存储一些关于 Nacos 基本的配置,完整配置如下:

server:
  port: 3000

spring:
  application:
    name: @artifactId@
  cloud:
    nacos:
      username: @nacos.username@
      password: @nacos.password@
      discovery:
        server-addr: ${NACOS_HOST:nacos1.kc}:${NACOS_PORT:8848},${NACOS_HOST:nacos2kc}:${NACOS_PORT:8848},${NACOS_HOST:nacos3.kc}:${NACOS_PORT:8848}

编写openfeign接口类com/gm/nacos_discovery_http_consumer/service/ProviderServiceFeign.java调用服务提供者

package com.gm.nacos_discovery_http_consumer.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(value = "nacos-discovery-http-provider")
public interface ProviderServiceFeign {

    @RequestMapping(value = "sayHello", method = RequestMethod.GET)
    String sayHello(@RequestParam("world") String world);

}

编写com/gm/nacos_discovery_http_consumer/controller/ConsumerController.java调用openfeign接口

package com.gm.nacos_discovery_http_consumer.controller;

import com.gm.nacos_discovery_http_consumer.service.ProviderServiceFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerController {

    @Autowired
    ProviderServiceFeign providerServiceFeign;

    @RequestMapping(value = "sayHello", method = RequestMethod.GET)
    public String sayHello() {
        return providerServiceFeign.sayHello("hello world");
    }

}

编写com/gm/nacos_discovery_http_provider/NacosHttpProviderApplication.java

package com.gm.nacos_discovery_http_consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients("com.gm.nacos_discovery_http_consumer.service")
public class NacosHttpConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosHttpConsumerApplication.class, args);
    }
}

在服务启动类中新增注解:@EnableFeignClients,用于开启FeginClient功能,会扫描@FeignClient生成feginClient代理对象,在生成代理对象的过程中会判断FeignClient注解是否有url属性如果没有url属性则生成具有loadBalance功能的代理对象。

至此服务调用者配置完成,启动服务实例。

四、测试

浏览器访问:http://127.0.0.1:3000/sayHello

在这里插入图片描述
重复请求

在这里插入图片描述

发现服务调用者调用服务提供者的负载均衡生效

五、Nacos Starter更多参数说明

更多关于 spring-cloud-starter-alibaba-nacos-discoverystarter 配置项如下所示:

配置项Key默认值说明
服务端地址spring.cloud.nacos.discovery.server-addrNacos Server 启动监听的ip地址和端口
服务名spring.cloud.nacos.discovery.service${spring.application.name}给当前的服务命名
服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP设置服务所处的分组
权重spring.cloud.nacos.discovery.weight1取值范围 1 到 100,数值越大,权重越大
网卡名spring.cloud.nacos.discovery.network-interface当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
注册的IP地址spring.cloud.nacos.discovery.ip优先级最高
注册的端口spring.cloud.nacos.discovery.port-1默认情况下不用配置,会自动探测
命名空间spring.cloud.nacos.discovery.namespace常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
AccessKeyspring.cloud.nacos.discovery.access-key当要上阿里云时,阿里云上面的一个云账号名
SecretKeyspring.cloud.nacos.discovery.secret-key当要上阿里云时,阿里云上面的一个云账号密码
Metadataspring.cloud.nacos.discovery.metadata
日志文件名spring.cloud.nacos.discovery.log-name
集群spring.cloud.nacos.discovery.cluster-nameDEFAULT配置成Nacos集群名称
接入点spring.cloud.nacos.discovery.enpointUTF-8
是否集成Ribbonribbon.nacos.enabledtrue一般都设置成true即可
是否开启Nacos Watchspring.cloud.nacos.discovery.watch.enabledtrue可以设置成false来关闭 watch
注册的IP地址类型spring.cloud.nacos.discovery.ip-typeIPv4可以配置IPv4和IPv6两种类型

六、下章预告

下章进行nacos融合springcloud,实现配置的动态变更。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

独立产品灵感周刊 DecoHack #049 - 开发者如何学习UI设计

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。&#x1f4bb; 产品推荐 1. method.ac 这个…

一文读懂账号体系产品设计

一、账号体系的概念及价值账号体系是用户在各平台上的通行证。平台给与用户可持续的服务&#xff0c;用户在平台上获取价值&#xff0c;中间的媒介&#xff0c;便是账号体系。阿境将其理解为维系用户与平台之间的枢纽。注&#xff1a;本文中&#xff0c;账号账户&#xff0c;二…

《Python机器学习》基础代码2

&#x1f442; 逝年 - 夏小虎 - 单曲 - 网易云音乐 目录 &#x1f44a;Matplotlib综合应用&#xff1a;空气质量监测数据的图形化展示 &#x1f33c;1&#xff0c;AQI时序变化特点 &#x1f33c;2&#xff0c;AQI分布特征 相关性分析 &#x1f33c;3&#xff0c;优化图形…

Python实现GWO智能灰狼优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景灰狼优化算法(GWO)&#xff0c;由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优…

Linux和Windows环境下配置Redis开机自启动

Linux和Windows环境下配置Redis开机自启动前言Linux服务器上设置开机自启动前置条件配置开机自启动启动的配置文件添加脚本的设置Windows设置开机自启其他简单命令前言 rt&#xff0c;没怎么接触过服务器还要摊上这么档子事&#xff0c;面试的时候也没说要跟服务器打交道啊。。…

【前端】JS异步加载

文章目录为什么要异步加载如何实现异步加载参考为什么要异步加载 两个原因其实是一个意思。 原因1&#xff1a; JS是单线程的语言&#xff0c;它会同步的执行代码&#xff0c;从上往下执行 但是&#xff0c;一旦网络不好&#xff0c;或要加载的js文件过大的话&#xff0c;会…

记一次真实liunx挖矿病毒处理

在一个周末的晚上&#xff0c;收到了群里一个学弟的消息&#xff1a;话不多说开始应急&#xff1a;发现新增用户包括计划任务&#xff0c;包括使用率为百分百的cpu&#xff0c;可以确定是被入侵且植入了挖矿病毒。后门用户&#xff1a;计划任务&#xff1a;top查看进程信息&…

2.27 junit5常用语法

一.了解junitjunit是一个开源的java单元测试框架,java方向使用最广泛的单元测试框架.所需要的依赖<dependencies><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium&l…

敏捷测试需要遵循的原则

摘要&#xff1a;与传统的阶段性测试不同的是&#xff0c;敏捷测试能够将测试集成到整个软件开发过程中&#xff0c;尽早、及时地发现缺陷&#xff0c;帮助交付有价值的高质量产品。 传统测试与敏捷测试的比较大的区别在于&#xff1a; 在瀑布方法中&#xff0c;测试只能在开发…

400G光模块知识大全

400G光模块是目前高速传输领域中的一种先进产品&#xff0c;被广泛应用于高性能数据中心、通信网络、大规模计算、云计算等领域。本文将从400G光模块的定义、技术、产品型号、应用场景以及未来发展方向进行详细介绍。一、什么是400G光模块&#xff1f;400G光模块是指传输速率达…

PCI子系统

很多网络接口卡都是外围组件互联&#xff08;Peripheral Compaonent Interconnect&#xff09;设备&#xff0c;必须与Linux PCI子系统协同工作&#xff0c;并非所有的网络接口都是PCI设备&#xff0c;很多嵌入式设备的网络接口连接的就不是PCI总线&#xff0c;这些设备的初始化…

学习 Python 之 Pygame 开发魂斗罗(六)

学习 Python 之 Pygame 开发魂斗罗&#xff08;六&#xff09;继续编写魂斗罗1. 创建碰撞类2. 给地图添加碰撞体3. 让人物可以掉下去4. 实现人物向下跳跃5. 完整的代码继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗&#xff08;五&#xff09;中&#xff0c;我…

单例模式之饿汉、懒汉模式

目录 1.单例模式 1.1 饿汉模式 1.2 懒汉模式 1.单例模式 单例模式能保证类在程序中只存在唯一一份实例.这一点在很多场景中都需要,比如JDBC中的DataSource实例就只需要一个. 单例模式具体的是实现方法主要有两种:饿汉模式和懒汉模式. 1.1 饿汉模式 饿汉摸模式是指,在类加…

多模态推荐系统综述

推荐系统(RS)已经成为在线服务不可或缺的工具。它们集成了各种深度学习技术&#xff0c;可以根据标识符和属性信息对用户偏好进行建模。随着短视频、新闻等多媒体服务的出现&#xff0c;在推荐的同时了解这些内容变得至关重要。此外&#xff0c;多模态特征也有助于缓解RS中的数…

我的 System Verilog 学习记录(6)

引言 本文简单介绍 SystemVerilog 语言的 线程。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08;1&#xff09; 我的 System Verilog 学习记录&#xff08;2&#xff09; 我的 System Verilog 学习记录&#xff08;3&#xff09; 我的 System Verilog 学…

Redis之数据类型详解分析

文章目录1 Redis1.1 概述1.2 查看内部编码1.3 String字符串1.3.1 简介1.3.2 应用常景1.3.3 String内部编码1.4 Hash散列1.4.1 简介1.4.2 应用常景1.4.3 Hash内部编码1.4.4 rehash和渐进式rehash操作1.4.4.1 过程1.4.4.2 rehash触发条件1.4.5 跟JDK的HashMap的区别1.5 List列表1…

kibana搭建(windowslinux)

1.说明 搭建kibana方便查询es库&#xff0c;本文分别对windows和linux版本进行安装&#xff0c;因为es集群版本是7.4.1&#xff0c;所以配套的kibana也是选择相同版本 2.下载 https://artifacts.elastic.co/downloads/kibana/kibana-7.4.1-windows-x86_64.zip https://artifact…

newbing的注册使用

newbing是一款全新的智能搜索引擎&#xff0c;它可以帮助你快速、准确地找到你想要的信息&#xff0c;还可以与你进行友好、有趣的对话。newbing不仅拥有强大的搜索功能&#xff0c;还具备创造性和逻辑性&#xff0c;可以为你生成诗歌、故事、代码、歌词等各种内容。newbing还可…

FastDDS-1.开始

开始 这一节定义了DDS和RTPS的概念&#xff0c;也提供了一个逐步讲解的教程&#xff0c;这个教程中讲解了如何开发一个简单的FastDDS发布订阅应用程序。 1.1 什么是DDS DDS是一个以数据为中心的通信一些&#xff0c;主要用在分布式软件的通信领域。它定义了应用程序的通信API…

一文搞懂Python时间序列

Python时间序列1. datetime模块1.1 datetime对象1.2 字符串和datatime的相互转换2. 时间序列基础3. 重采样及频率转换4. 时间序列可视化5. 窗口函数5.1 移动窗口函数5.2 指数加权函数5.3 二元移动窗口函数时间序列&#xff08;Time Series&#xff09;是一种重要的结构化数据形…