微服务组件-注册中心

微服务组件-注册中心

使用restTemplate实现远程服务调用存在以下的问题:
1、消费者不知道如何获取服务提供者具体信息。
2、在远程调用的过程中,直接采用填写url的硬编码方式,如果服务消费者发生变化,得到的结果就会出错。
3、如果有多个服务提供者,消费者选择变得困难。
4、消费者无法感知到服务是否存活。

基于上述的问题我们可以使用注册中心实现。流行的注册中心有Eureka、Nacos。

Eureka

简介

Eureka是Netflix开发的一个服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS(Amazon Web Services )域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud将其集成在自己的子项目Spring Cloud Netflix中,以实现Spring Cloud的服务发现功能。

Eureka 包含两大组件:

服务端发现组件(Eureka Server):服务端发现组件也被称之为服务注册中心,主要提供了服务的注册功能
客户端发现组件(Eureka Client):客户端发现组件主要用于处理服务的注册与发现。

Eureka的服务发现机制

image.png

Eureka的作用

1、服务提供者启动时向eureka注册自己的信息,eureka保存这些信息,消费者根据服务名称向eureka拉取提供者信息。
2、服务消费者利用负载均衡算法,从服务列表中挑选一个
3、服务提供者每个一段时间会向eureka-server发送心跳请求,报告健康状态,eureka会更新记录服务列表信息,心跳不正常会被剔除,消费者就可以拉取到最新消息。

image.png

Eureka快速入门

场景

搭建一个注册中心并且让他可以提供注册的服务。

场景.png

实现步骤
①新建空项目

新建空项目.png

②新建springBoot模块用于搭建eureka-server

eureka-server.png
新建项目.png

③修改依赖

使用Boot版本为3.0.0。
版本选择.png

④配置文件配置
server:port: 8761 #eureka的默认端口 
spring:application:name: eureka-server   #应用名称 不要使用特殊字符

在入口文件中使用注解开启Eureka功能。

@SpringBootApplication
@EnableEurekaServer //开启eureka注册中心的功能
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}
测试

开启测试.png
开启测试01.png
集群信息.png

⑥搭建客户端a

客户端a.png
客户端a1.png
注意:如果不选web,启动就会停掉。

⑦修改版本号

修改版本号.png

⑧修改配置文件
server:port: 8080 #客户端的端口没有要求,可以使用默认端口
spring:application:name: eureka-client-a #应用名称
#将client-a注册到server,将自己的一些信息发送到server
eureka:client:service-url: #指定注册的地址defaultZone: http://localhost:8761/eureka
⑨使用注解开启客户端功能
@EnableEureka
@SpringBootApplication
public class EurekaClientAApplication {public static void main(String[] args) {SpringApplication.run(EurekaClientAApplication.class, args);}}

客户端01.png

如果@EnableEureka报错不能解决的情况下,可以使用@EnableDiscoveryClient,@EnableEurekaClient只适用于使用Eureka作为注册中心的场景,@EnableDiscoveryClient可以适用于其他注册中心的场景比如nacos等。

⑩使用同样的方式创建客户端b

配置文件

server:port: 8081
eureka:client:service-url:defaultZone: http://localhost:8761/eureka
spring:application:name: eureka-client-b
⑪在浏览器查看

浏览器输入localhost:8761

测试.png
注意

若需要在客户端A下再创建两台,因为只有端口不相同,不需要重新新建模块,只需要通过复制的方式。

复制.png
复制01.png
然后直接运行即可。
复制02.png
复制03.png

eureka配置文件

eureka的配置分为三类:server、 client 、实例

eureka-server端配置文件

功能.png

eureka-server端的配置涉及server、实例

server:port: 8761 
spring:application:name: eureka-server 
eureka:server:eviction-interval-timer-in-ms: 10000 #服务端每隔多少毫秒做定期删除的操作renewal-percent-threshold: 0.85 #续约百分比, 如果超过85%的应用没有续约(心跳请求) 那么eureka会保护服务,不会剔除任何一个服务enable-self-preservation: true #server 的自我保护机制,避免因为网络造成误剔除,生产环境建议打开instance: #实例配置instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}#主机名称:应用名称:端口号hostname: localhost #主机名称或服务ipprefer-ip-address: true #表示以ip的方式显示具体的服务信息lease-expiration-duration-in-seconds: 5 #服务实例的续约的时间间隔
eureka-client端配置文件

eureka-client端配置涉及client、实例

server:port: 8080
spring:application:name: eureka-client-a
eureka:client:service-url:defaultZone: http://localhost:8761/eurekaregister-with-eureka: true #可以控制不往eureka-server注册fetch-registry: true #应用是否去拉取服务列表到本地registry-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题,时间越短脏读越少,性能消耗大 默认30秒instance:hostname: localhost #应用的主机名称,最好写主机ipinstance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}prefer-ip-address: true #显示iplease-renewal-interval-in-seconds: 10 #实例续约时间

Eureka集群

集群.png

创建三个eureka-server服务。

cluster-server01.png

修改配置文件

cluster01

server:port: 8761
spring:application:name: eureka-server
eureka:client:service-url: #不写的情况下,默认往8761注册defaultZone: http://localhost:8762/eureka, http://localhost:8763/eurekainstance: #实例的配置instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}prefer-ip-address: truehostname: localhostlease-renewal-interval-in-seconds: 5

cluster02

server:port: 8762
spring:application:name: eureka-server
eureka:client:service-url: defaultZone: http://localhost:8761/eureka, http://localhost:8763/eurekainstance: instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}prefer-ip-address: truehostname: localhostlease-renewal-interval-in-seconds: 5

cluster03

server:port: 8763
spring:application:name: eureka-server
eureka:client:service-url: defaultZone: http://localhost:8761/eureka, http://localhost:8762/eurekainstance: instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}prefer-ip-address: truehostname: localhostlease-renewal-interval-in-seconds: 5
添加注解
@EnableEurekaServer
测试

server集群.png
server集群01.png
server集群02.png
注意:

发现并没有集群信息,只是同一个服务server启动了多台没有数据交互不算真正意义上的集群。原因是:http://localhost:8672/eureka, http://localhost:8763/eureka这样写,eureka认为只有一个机器就是localhost,所以需要修改hosts文件

修改hosts.png
hosts01.png
如果发现没有生效,在命令提示符使用如下命令刷新。

ipconfig /flushdns

修改配置文件.

server:port: 8761
spring:application:name: eureka-server
eureka:client:service-url:defaultZone: http://peer2:8672/eureka, http://peer3:8763/eurekainstance:hostname: peer1instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}lease-renewal-interval-in-seconds: 5prefer-ip-address: true

同理修改另外两个配置文件。
server集群03.png

在cluster01下创建一个客户端测试集群

配置文件

server:port: 8080
spring:application:name: eureka-client
eureka:client:service-url:defaultZone: http://peer1:8761/eurekaregister-with-eureka: trueregistry-fetch-interval-seconds: 10fetch-registry: trueinstance:instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}hostname: localhostprefer-ip-address: truelease-renewal-interval-in-seconds: 10

cluster-client.png
cluster-client01.png
cluster-client02.png

总结

在以上的方案中,创建三个服务端使用的是新建三个模块,这样显然比较繁琐且冗余。

优化方案

修改配置文件,然后达到只需要修改端口,然后通过复制创建另外的服务端。

修改配置文件
server:port: 8761
spring:application:name: eureka-server
eureka:client:service-url:defaultZone: http://peer1:8761/eureka, http://peer2:8762/eureka, http://peer3:8763/eurekainstance:lease-renewal-interval-in-seconds: 5prefer-ip-address: trueinstance-id: ${spring.application.name}:${server.port}

复制集群.png
复制集群01.png
记得添加@EnableEurekaServer注解。

客户端配置文件
server:port: 8080
spring:application:name: eureka-client
eureka:client:service-url:defaultZone: http://peer1:8761/eureka, http://peer2:8762/eureka, http://peer3:8763/eureka #都发送,有一台down也没有关系register-with-eureka: trueregistry-fetch-interval-seconds: 10fetch-registry: trueinstance:ip-address: ${eureka.instance.hostname}:${spring.application.name}:${server.port}hostname: localhostprefer-ip-address: truelease-renewal-interval-in-seconds: 10

复制集群03.png
复制集群04.png

Nacos

简介

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是阿里巴巴的产品,也是SpringCloud中的一个组件,相比Eureka(https://github.com/Netflix/eureka))功能更加丰富。

nacos.png

安装Nacos

不同操作系统下的安装会有差异,以下是Windows安装Naocs

①下载Nacos

下载安装包
nacos下载.png

②解压安装包到任意非中文目录

非中文.png

③使用命令提示符启动

在bin目录下使用如下的windos命令

startup.cmd -m standalone #standalone表示单机启动模式

启动nacos.png

④在浏览器中查看

复制cmd命令窗口中的地址在浏览器中访问

浏览器打开.png

登录密码和账号默认都是nacos

安装成功.png

Nacos服务注册和发现

项目为下面的示例,如果项目中有使用到Eureka需要先注释。

使用实例
image.png

实现步骤
①在父工程中加入Nacos依赖
<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>
②添加nacos的客户端依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
③修改服务端的配置文件

修改user-service 的application.yaml文件

spring:cloud:nacos:server-addr: localhost:8848 # nacos服务地址

相同的方式修改order-service,配置文件内容

spring:cloud:nacos:server-addr: localhost:8848 
④启动测试

启动uer-service和order-service在web端查看

启动测试.png
nacos测试.png

Nacos注册中心

nacos服务分级存储模型

服务分级模型是一种将服务层次化组织的架构设计,通常用于大型分布式系统或微服务架构中。这种模型的目标是通过将服务划分为不同的层级,实现更灵活、可维护和可扩展的系统架构。
服务分级模型包括以下几个层级:

特性特性描述
全局级别在这个层级,通常存储全局配置和共享信息。全局级别的服务对整个系统可见,负责处理全局性的任务和配置,例如全局配置管理、认证、授权等。
集群级别集群级别的服务组织在物理或逻辑上相邻的节点上,负责处理集群内的任务和协调。这一层级的服务通常处理一组相关联的节点,提供集群级别的服务如负载均衡、故障转移、数据同步等。
服务级别在服务级别,服务被组织成逻辑单元,每个服务负责实现特定的业务功能。服务级别的服务通常是整个系统的核心,提供具体的业务逻辑,例如用户管理、订单处理等。
实例级别实例级别是最底层的层级,代表着服务的具体实例。在微服务架构中,服务可能会有多个实例运行在不同的节点上,实现负载均衡和高可用性。

通过将服务划分为这些层级,服务分级模型使得系统的不同部分能够独立演化、扩展和维护。这种分级结构使得系统更具弹性,能够更好地适应不同的需求和变化。

服务分级存储.png

服务跨集群调用问题

服务调用尽可能选择本地集群的服务,跨集群调用延迟较高,只有在本地集群不能访问的时候,再去访问其他集群。

跨集群.png

服务集群属性
实现步骤

①通过复制模块的方式再复制两个userservice, 端口号为8080、8085,name分别为04、05

复制user.png

②、修改配置文件application.yml

    spring:cloud:nacos:server-addr: localhost:8848 # nacos服务地址discovery:cluster-name: HZ #nacos集群名称, HZ代表杭州

③、启动user-service和user-service04

image.png
选中相应的服务点击三角运行即可。

④、修改user-service的配置文件

spring:cloud:nacos:server-addr: localhost:8848 # nacos服务地址discovery:cluster-name: SH #nacos集群名称, SH代表上海

⑤、启动user-service05

⑥、查看

查看01.png
点击详情可以查看详细信息。
查看02.png
order-service实现优先用本地集群(发现端口冲突,修改为8084)

①、设置order-service,添加如下配置

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ

②、在order-service中设置负载均衡的IRule为NacosRule

这个规则会优先选寻找与自己同集群的服务,然后在集群中随机选择执行。

userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  #负载均衡规则

③、重启order-service

order-service.png

根据权重负载均衡

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求在Nacos控制台可以设置实例的权重值。
权重01.png权重02.png
Nacos控制台可以设置实例的权重值,0~1之间,同集群内的多个实例,权重越高被访问的频率越高,权重设置为0则完全不会被访问。

环境隔离(namespace)

Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。
image.png

创建命名空间

新建

新建.png新建01.png

修改order-service的application.yaml

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: be5453d5-dfa7-4316-a341-c8987cac180c #命名空间ID

查看

命名空间.png

Nacos注册中心原理

原理.png

临时实例和非临时实例

服务注册到Nacos时,可以选择注册为临时实例或非临时实例,配置如下:

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: be5453d5-dfa7-4316-a341-c8987cac180c #命名空间IDephemeral: true #true为临时实例(默认) false为非临时
Nacos和Eureka之间的异同
相同点
  • 都支持服务注册和服务拉取
  • 都支持服务提供者心跳方式做健康检测
不同点
  • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
  • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
  • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

Nacos配置管理

统一配置管理

配置更改热更新

更改热更新.png

实现步骤

①、在Nacos中添加配置信息

添加配置.png

②、填写配置信息

添加配置01.png
配置文件的ID由三部分组成,[服务名称]-[profile].[后缀名],分组默认,格式可以是yaml和properties,点击发布即可创建成功。

配置获取
实现步骤

流程.png

①、引入Nacos的配置管理客户端依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

②、在客户端(user-service)的resource目录中添加一个bootstrap.yml文件

boot.png

spring:application:name: userservice profiles:active: dev #环境cloud:nacos:server-addr: localhost:8848config:file-extension: yaml #文件后缀名

删除application.yaml中重复的内容。如服务名称,nacos地址。

③、测试是否读取到

在UserController中添加代码。

@Value("${pattern.dateformate}")
private String dateformate;
@GetMapping("now")
public String now(){String testRead = LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformate));return testRead;
};

@Value注解的成员变量通常为基本数据类型及其包装类,以及String类型,用于直接给该变量赋值。
常用于从*.properties或*.yml配置文件中取值并注入。

④、运行

测试读取.png

配置自动刷新

Nacos中的配置文件变更后,微服务无需重启就可以感知。

方式一:

在@Value注入的变量所在类上添加注解@RefreshScop

package cn.itcast.user.web;import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {@Autowiredprivate UserService userService;@Value("${pattern.dateformate}")private String dateformate;@GetMapping("now")public String now(){String testRead = LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformate));return testRead;};/*** 路径: /user/110** @param id 用户id* @return 用户*/@GetMapping("/{id}")public User queryById(@PathVariable("id") Long id) {return userService.queryById(id);}
}

重启程序

重启.png

在不重启服务的情况下修改nacos配置

修该yaml.png

刷新页面

刷新测试.png

方式二:

使用@ConfigurationProperties注解

package cn.itcast.user.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;/*** @author XRY* @date 2023年08月14日14:25*/
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {private String dateformate;
}

在UserController中

@Autowired
private PatternProperties properties;
@GetMapping("now")
public String now(){String testRead = LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformate()));return testRead;
};

@Autowire作用在自定义的成员变量上,自动装配,使用的是byType策略,即根据变量类型从ioc容器中查找,使用该注解需要在对应的类上挂以下注解中的一个(以将对象注入ioc容器):
@Componet:通用,无语义
@Controller:写在控制层(controller)类上
@Service:写在业务层(service)实现类上
@Repository:写在数据访问层(dao)实现类上

取消原来的方式测试。
第二种方式.png
第二种方式01.png

多环境配置共享

微服务启动时会从nacos读取多个配置文件

  • [spring.application.name]-[spring.profiles.active].yaml, 如:userservice-dev.yaml

  • [apring.application.name].yaml 如:userservice.yaml

    无论profile怎么变化,[apring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件。

测试

①、创建共享配置userservice.yaml

共享userservice.png
共享userservice01.png

②、修改配置类

package cn.itcast.user.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;/*** @author XRY* @date 2023年08月14日14:25*/
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {private String dateformate;private String envSharedValue;
}

③、创建一个controller用于测试

@Autowired
private PatternProperties properties;
@GetMapping("/prop")
public PatternProperties properties(){return properties;
};

④、重启测试

测试共享.png
修改环境再次测试 bootstrap.yaml

spring:application:name: userserviceprofiles:active: test #环境cloud:nacos:server-addr: localhost:8848config:file-extension: yaml #文件后缀名

测试共享01.png
当多个配置文件中有相同的属性时,他们的优先级为:
优先级.png

Ribbon

Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具。
简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon 会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用 Ribbon 实现自定义的负载均衡算法。

Ribbon负载均衡

负载均衡流程

负载流程.png
添加了@LoadBalanced注解的restTemplate地址会被LoadBalancerInterceptor类拦截解析

负载均衡策略

Ribbon的负载均衡规则是一个叫做Rule的接口来定义的,每一个子接口都是一种规则

均衡策略.png

调整负载均衡

默认负载均衡策略是轮询,通过定义IRule实现可以修改负载均衡规则,有两种方式:

方式一:

使用代码方式定义一个新的IRule,并将它注入到容器中,他将会作用于全局。

@Bean
public IRule randomRule(){return new RandomRule();
}
方式二:

配置文件方式,在order-service的application.yml文件中,添加新的配置。针对某个微服务而言(局部)。

userservice:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则 
饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalandeClient,请求时间会很长。而饥饿加载会在项目启动时创建,降低第一次访问的耗时,通过配置开启饥饿加载。

ribbon:eager-load:enabled: true #开启饥饿加载clients: userservice#指定饥饿加载的服务名称

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

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

相关文章

vue+element作用域插槽

作用域插槽的样式由父组件决定&#xff0c;内容却由子组件控制。 在el-table使用作用域插槽 <el-table><el-table-column slot-scope" { row, column, $index }"></el-table-column> </el-table>在el-tree使用作用域插槽 <el-tree>…

基于SpringBoot+Vue的二手车交易系统的设计与实现(源码+文档+包运行)

一.系统概述 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统二手车交易信息管理难度大&#xff0c;容错率低&…

初识ansible核心模块

目录 1、ansible模块 1.1 ansible常用模块 1.2 ansible-doc -l 列出当前anisble服务所支持的所有模块信息&#xff0c;按q退出 1.3 ansible-doc 模块名称 随机查看一个模块信息 2、运行临时命令 2.1 ansible命令常用的语法格式 3、常用模块详解与配置实例 3.1命令与…

​宁德时代:用一块电池玩转两个万亿赛道

2022 到 2023 连续两年&#xff0c;被称为国内储能行业的大储&#xff08;发电侧、电网侧&#xff09;元年和中储&#xff08;工商业&#xff09;元年&#xff0c;整个储能行业可谓是异常火爆&#xff0c;众多资本或企业纷纷涌入该赛道。 对于行业从业者来说&#xff0c;所从事…

力扣HOT100 - 206. 反转链表

解题思路&#xff1a; 迭代&#xff08;双指针&#xff09; class Solution {public ListNode reverseList(ListNode head) {ListNode cur head, pre null;while(cur ! null) {ListNode tmp cur.next; // 暂存后继节点 cur.nextcur.next pre; // 修改 next 引用指…

MOSFET效应管

【学习笔记】 金属氧化物半导体场效应晶体管&#xff08;Metal Oxide Semiconductor Field Effect Transistor&#xff0c;简称MOSFET&#xff09; MOSFET是三个端子器件&#xff0c;具有栅极、漏极和源极&#xff0c;栅极端子与漏极和源极之间的主导电流通道电气隔离&#xf…

连锁服装店用哪个进销存软件好

连锁服装店的进销存管理对于业务的高效运作至关重要&#xff0c;而选择合适的进销存软件能够极大地提升管理效率和经营水平。本文将介绍四款优秀的进销存软件&#xff0c;并重点关注商淘云连锁服装进销存管理系统&#xff0c;探讨其特点和优势。 1. 商淘云连锁服装进销存管理系…

喜报|炼石入选2024中国网络安全全景图 密码与数据安全六领

2024年4月12日&#xff0c;国内专业安全媒体安全牛发布《中国网络安全行业全景图&#xff08;第十一版&#xff09;》。第十一版全景图划分了16个一级安全分类和108个二级安全分类&#xff0c;汇集了510家安全厂商申报&#xff0c;实际收录为454家。全景图综合考量了产品的实用…

一文读懂uniapp中的tabBar底部导航

目录 1. 基本知识2. Demo 1. 基本知识 UniApp 中的 tabBar 是用来在应用程序底部显示可切换的选项卡的组件&#xff0c;通常用于实现底部导航栏 允许用户通过点击不同的选项卡来切换应用程序的不同页面或功能模块 其代码如下&#xff1a; "tabBar":{"color&q…

深入解析Rivest Cipher 4:理论与实践

title: 深入解析Rivest Cipher 4&#xff1a;理论与实践 date: 2024/4/17 20:30:58 updated: 2024/4/17 20:30:58 tags: 密码学RC4算法流密码密钥调度安全分析优缺点应用实践 第一章&#xff1a;引言 密码学简介&#xff1a; 密码学是研究如何保护通信和信息安全的学科。它涉…

# 从浅入深 学习 SpringCloud 微服务架构(一)基础知识

从浅入深 学习 SpringCloud 微服务架构&#xff08;一&#xff09;基础知识 1、系统架构演变&#xff1a; 1&#xff09;单体应用架构。如电商项目。 用户管理、商品管理、订单管理&#xff0c;在一个模块里。 优点&#xff1a;开发简单&#xff0c;快速&#xff0c;适用于…

React中redux、react-redux、@reduxjs/toolkit状态管理库的使用方式

效果 下载依赖 npm install redux react-redux reduxjs/toolkit --save在src目录下创建文件 创建index.ts文件 import { configureStore } from reduxjs/toolkit import userSlice from ./userReducerconst store configureStore({reducer: {user: userSlice.reducer} }) //…

代码随想录算法训练营第四十三天| LeetCode 1049.最后一块石头的重量II、494. 目标和、474.一和零

一、LeetCode 1049.最后一块石头的重量II 文章讲解/视频讲解&#xff1a;https://programmercarl.com/1049.%E6%9C%80%E5%90%8E%E4%B8%80%E5%9D%97%E7%9F%B3%E5%A4%B4%E7%9A%84%E9%87%8D%E9%87%8FII.html#%E6%80%9D%E8%B7%AF 状态&#xff1a;已解决 1.思路 其实这个题跟上个题…

ssm056基于Java语言校园快递代取系统的设计与实现+jsp

校园快递代取系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园快递代取系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

4核8G配置服务器多少钱?2024年阿里云服务器700元1年价格便宜

4核8G配置服务器多少钱&#xff1f;2024年阿里云服务器700元1年价格便宜。阿里云4核8G服务器租用优惠价格700元1年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采…

Linux下的权限:论老流氓root的存在

文章目录 用户身份切换提权 权限管理文件访问者文件访问权限文件类型目录权限默认权限粘滞位 用户 Linux下有两中用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户 超级用户&#xff1a;可以在Linux系统下做任何事情&#xff0c;不受到限制普通用户&#xff…

Java PDF文件流传输过程中速度很慢,如何解决?

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

VulnHub系列 DC-4靶机 渗透详细过程 | 红队打靶

VulnHub系列 DC-4靶机详细渗透测试过程 目录 VulnHub系列 DC-4靶机详细渗透测试过程一、将靶机导入到虚拟机当中二、渗透流程主机发现端口扫描Web渗透暴力破解命令执行反弹shellSSH暴力破解提权 一、将靶机导入到虚拟机当中 靶机地址&#xff1a; https://download.vulnhub.c…

Matlab|基于改进遗传算法的配电网故障定位

目录 1 主要内容 2 部分代码 3 部分程序结果 4 下载链接 1 主要内容 该程序复现文章《基于改进遗传算法的配电网故障定位》&#xff0c;将改进的遗传算法应用于配电网故障定位中, 并引入分级处理思想, 利用配电网呈辐射状的特点, 首先把整个配电网划分为主干支路和若干独立…

中国12.5米DEM地形瓦片数据免费领取!

之前向大家公开了中国34个省12.5米DEM地形瓦片数据的免费领取链接&#xff0c;大家对12.5米DEM数据的使用需求很强烈&#xff0c;领取也很积极&#xff0c;也有不少读者反馈能否提供全国范围的12.5米DEM地形瓦片数据&#xff0c;因为分省级地形瓦片数据想要合并成全国数据&…