微服务(二)——注册中心(Eureka、Nacos)

news2025/7/7 18:38:13

目录

  • 1. 概念
  • 2. Eureka
    • 1. 服务搭建
      • 1. 依赖导入
      • 2. 配置文件
      • 3. 启动项目
    • 2. 服务注册
      • 1. 依赖导入
      • 2. 配置文件
      • 3. 启动多个实例
    • 3. 服务发现
      • 1. 依赖导入
      • 2. 配置文件
      • 3. 服务拉取和负载均衡
    • 4. 小结
  • 3. Ribbon
    • 1. 负载均衡流程
    • 2. 负载均衡策略
    • 3. 加载策略
  • 4. Nacos
    • 1. 下载安装
    • 2. 注册中心
      • 1. 引入依赖、修改配置
      • 2. 服务分级存储模型
        • 1. 配置集群
        • 2. 同集群优先的负载均衡
      • 3. 权重配置
      • 4. 环境隔离
        • 1. 创建 namespace
        • 2. 配置命名空间
      • 3. 永久实例
    • 3. 配置管理
      • 1. 统一配置管理
        • 1. nacos添加配置文件
        • 2. 从nacos拉取配置
      • 2. 配置热更新
      • 3. 配置共享

1. 概念

注册中心:

  • 需求:当一个服务提供者 Service 部署了多个实例交给 User 远程调用时:
    • 服务消费者 User 应该调用哪个实例,如何获取其对应地址和端口?
    • User 如何获知实例是否健康?
  • 注册中心作用:
    • 帮助管理服务,并帮助服务调用者选择并调用服务
    • 实时监测服务实例是否健康

Eureka:

  • 构成:
    • eureka-server:服务端,注册中心
      记录服务信息,心跳监控
    • eureka-client:客户端,
      服务提供者(注册到服务端,定期向服务端发送心跳)、服务消费者(从服务端拉取服务列表,基于负载均衡选择服务)
  • 作用:
    • 服务注册: Service实例启动后,会将自己的信息注册到 eureka服务端
    • 服务拉取: User 根据 实例名 获取 Service 地址列表
    • 负载均衡: User 根据负载均衡算法 从 拉去的 Service 地址列表中 选择一个服务实例
    • 心跳检查: Service实例 每隔一段时间(默认30s)就会向 eureka服务端 发起请求,报告自己的状态,当超过一段时间没向 eureka服务端 发送心跳,eureka 就会将此实例从 地址列表中剔除

nacos

  • 概念:
    • 服务注册中心
  • 作用:
    • 心跳检查: 不同于 eureka 只能 Service实例 主动发起心跳,nacos 对于非临时实例可以主动发起心跳检查
      • 临时心跳检查异常的会被剔除出 服务地址列表
      • 非临时心跳检查异常的不会被剔除
    • 定时推送变更: nacos 支持服务列表变更的消息推送模式,服务列表更新更及时

2. Eureka


1. 服务搭建


1. 依赖导入

依赖:

  • springboot 与 springcloud 的版本对应关系
    点击图片跳转

  • 父项目依赖
    我用的是2.6.11版本的springboot,所以要选择2021.0.5版本的springcloud

        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <spring.cloud-version>2021.0.5</spring.cloud-version>
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring.cloud-version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
  • 子项目依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    

2. 配置文件

我们需要将 eureka 注册到spring容器中,所以需要在配置文件中做相关配置。

server:
  port: 8099
spring:
  application:
    name: eureka_server
eureka:
  client:
  	# 配置eureka服务地址
    service-url:
      defaultZone: http://127.0.0.1:8099/eureka

3. 启动项目

为了让项目能启动 eureka,需要在启动类上加一个注解:@EnableEurekaServer

@SpringBootApplication
@EnableEurekaServer
public class ServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class, args);
    }
}

启动项目,访问地址:http://127.0.0.1:8099:

注册的服务名称就是配置文件中的名称的大写。

2. 服务注册

在上一步,已经将 eureka-server (eureka服务中心)搭建完毕,现在就开始注册服务实例了。


1. 依赖导入

注意:

  • 无论是 服务提供者 还是 服务消费者,他们的身份都是 eureka-client

  • 记得添加 spring-boot-starter-web 的依赖,不然会报错:Field optionalArgs in org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration required a bean of type ‘com.netflix.discovery.AbstractDiscoveryClientOptionalArgs’ that could not be found.

        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
        </dependencies>
    

服务发现、服务注册统一都封装在eureka-client依赖

2. 配置文件

需要在配置文件中配置 eureka-server 的地址。

spring:
  application:
    name: service_provider
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8099/eureka

3. 启动多个实例

为了让项目能启动 eureka,需要在启动类上加一个注解:@EnableEurekaClient

@SpringBootApplication
@EnableEurekaClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

我们可以通过 IDEA 自带功能模仿启动多个服务实例。

  • 打开 Service 面板

  • 复制原来的 provider 启动配置

  • 查看 eureka注册中心

3. 服务发现


1. 依赖导入

依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2. 配置文件

配置文件:

spring:
  application:
    name: service_user
server:
  port: 8084

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8099/eureka

3. 服务拉取和负载均衡

服务拉取:

  • 修改 controller 代码,将 url 路径的 ip、端口 修改为 服务名

    @RestController
    @RequestMapping("user")
    public class UserController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("/{id}")
        public Book getBookById(@PathVariable("id") Integer id) {
            // String url = "http://127.0.0.1:8081/provider" + id;
            String url = "http://service_provider/provider";
            if (id != null) {
                url = url + id;
            }
            Book book = restTemplate.getForObject(url, Book.class);
            return book;
        }
    }
    
  • 注册 RestTemplate 的时候加上注解 @LoadBalanced

        @LoadBalanced
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
  • 接口调用:

    @RestController
    @RequestMapping("user")
    public class UserController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("/{id}")
        public Book getBookById(@PathVariable("id") Integer id) {
            // String url = "http://127.0.0.1:8081/provider" + id;
            String url = "http://PROVIDER/pro/";
            if (id != null) {
                url = url + id;
            }
            Book book = restTemplate.getForObject(url, Book.class);
            return book;
        }
    }
    
  • 访问接口:

访问报错:

解决方案: 命名别带下划线。

多测试几下接口,可以发现,user一会儿调用的是 provider:8081 一会儿调用的是 provider:8082。这就是负载均衡算法选择的。

4. 小结

eureka-server 搭建:

  • 引入依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  • 启动类添加 @EnableEurekaServer

  • 配置文件配置 eureka 地址

    server:
      port: 8099
    spring:
      application:
        name: server
    eureka:
      client:
      	# 配置eureka服务地址
        service-url:
          defaultZone: http://127.0.0.1:8099/eureka
    

服务注册:

  • 引入依赖:
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  • 启动类添加 @EnableEurekaClient
  • 配置文件配置 eureka 地址
    server:
      port: 8081
    spring:
      application:
        name: provider
    eureka:
      client:
      	# 配置eureka服务地址
        service-url:
          defaultZone: http://127.0.0.1:8099/eureka
    

服务发现:

  • 引入依赖:
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  • 启动类添加 @EnableEurekaClient
  • 配置文件配置 eureka 地址
    server:
      port: 8089
    spring:
      application:
        name: user
    eureka:
      client:
      	# 配置eureka服务地址
        service-url:
          defaultZone: http://127.0.0.1:8099/eureka
    

3. Ribbon

1. 负载均衡流程

Ribbon负载均衡流程图:

http://PROVIDER/pro/4 并非真实的地址,这个需要Ribbon负载均衡去拦截,然后选择具体的服务地址。而,Ribbon就是通过 LoadBalancerInterceptorintercept 方法来实现拦截请求并解析选择地址。

    public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
        URI originalUri = request.getURI();
        String serviceName = originalUri.getHost();
        Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
        return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));
    }

负载均衡流程:

2. 负载均衡策略

Ribbon的负载均衡策略是由 IRule 接口来定义的。

IRule常见规则:

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
AvailabilityFilteringRule对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule (默认)以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑

自定义负载均衡策略:

  • 方式一: 在user中,@Bean 注入自定义 IRule

    @Bean
    public IRule randomRule(){
        return new RandomRule();
    }
    
  • 方式二: 在user,配置文件修改 IRule

    provider: # 给某个微服务配置负载均衡规则,这里是userservice服务
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
    

注意: 方式一的作用范围是:在访问任何微服务的时候,都是使用 RandomRule 负载均衡策略;方式二的作用范围是:在访问 provider 微服务的时候才是采用 RandomRule 策略,其他的还是使用默认策略。

3. 加载策略

Ribbon默认采用懒加载,即会在第一次访问时才会去创建 LoadBalanceClient ,所以会在第一次请求的时候花上较长的等待时间。

可以通过配置文件更改加载策略为饿加载策略,即初始化时就创建 LoadBalanceClient ,降低第一次访问的耗时。

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

4. Nacos

1. 下载安装

Nacos下载地址: https://github.com/alibaba/nacos/releases

下载好之后,解压就行了。

默认端口: 8848 ,可通过 conf/application.propertiesserver.port 修改端口。

单击启动: bin/

  • 方式一:双击 startup.cmd

  • 方式二:

    startup.cmd -m standalone
    

登录:默认账号、密码都是 nacos

2. 注册中心

1. 引入依赖、修改配置

父工程添加 SpringCloudAlibaba 的管理依赖。

<!--spring-cloud-alibaba-->
<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>

子工程中注释掉 eureka 依赖,引入 nacos 依赖。

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

配置文件配置nacos地址:

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

启动 userprovider

注意: eureka 注册名会变成大写,nacos 不会,所以改成 nacos 之后,需要把访问地址改成小写。

请求测试:

2. 服务分级存储模型

一个服务可以拥有多个实例,如:provider 的 8081 和 8082,如果这些实例分布于全国不同的机房,如:provider:8081 在成都机房、provider:8082 在重庆机房,Nacos就将同一机房内的实例 划分为一个集群

即,一个服务可以拥有多个集群,一个集群中可以拥有多个实例。

微服务相互之间访问时,访问本地的速度更快,所以应该尽可能访问相同集群的实例,只有当本集群内存不够时,才去访问其他集群。

1. 配置集群

配置服务集群:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      discovery:
        cluster-name: CD

VM Options:

-Dserver.port=8082 -Dspring.cloud.nacos.discovery.cluster-name=CQ

2. 同集群优先的负载均衡

默认的 ZoneAvoidanceRule 负载均衡策略并不能实现据同集群优先来实现负载均衡,因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。

修改负载均衡策略:

  • 方式一:

    @Bean
    public IRule nacosRule(){
        return new NacosRule();
    }
    
  • 方式二:

    provider: # 访问的服务名
      ribbon:
        NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡规则
    

3. 权重配置

服务器的性能之间存在差异,为了让性能能好的服务器承担更多的用户请求,Nacos提供了权重配置来控制访问率:权重越大、访问率越高。

注意: 权重为0的服务永远不会被访问。

4. 环境隔离

Nacos提供了namespace来实现环境隔离功能。

  • nacos中可以有多个namespace
  • namespace下可以有group、service等
  • 不同namespace之间相互隔离(不同namespace的服务互相不可见)

1. 创建 namespace

Nacos默认的namespace是:public

Nacos创建命名空间流程:

2. 配置命名空间

spring:
  cloud:
    nacos:
      discovery:
        namespace: e11eb3bc-8eed-4cdd-93f0-7a6c01b85eb4 # 命名空间,填ID

注意: 因为此时 dev 命名空间中只有 user,导致无法访问到 public 中的 provider ,发起访问请求会报错。

3. 永久实例

Nacos的服务实例分为两种类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型

  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例

临时实例是实例向注册中心发起心跳,永久实例是注册中心主动向实例询问心跳。

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为永久实例

3. 配置管理

Nacos不仅可以担任微服务的注册中心,还可以担任配置管理。

1. 统一配置管理

可以使用统一配置管理来处理因为部署的微服务数量过多,配置繁杂等问题。

Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

注意: 只把那些需要热更新的配置文件交给Nacos

1. nacos添加配置文件

Data ID: 配置文件id:服务名称-profile.后缀名

2. 从nacos拉取配置

spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:

  • 引入nacos-config依赖:

    <!--nacos配置管理依赖-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    
  • 添加bootstrap.yml

    spring:
      application:
        name: user # 服务名称
      profiles:
        active: dev #开发环境,这里是dev
      cloud:
        nacos:
          server-addr: localhost:8848 # Nacos地址
          config:
            file-extension: yaml # 文件后缀名
    

    这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
    ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。

  • 读取nacos配置

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

启动报错: org.springframework.beans.factory.BeanCreationException: Error creating bean with name xxx

解决方案:

  • 检查 namespace,配置文件与服务要在同一个 namespace 中
  • 名称是否拼错
  • 升级 nacos 版本
  • @Value 切换为 @NacosValue

2. 配置热更新

配置热更新: 修改nacos中的配置后,微服务中无需重启即可让配置生效。

实现方式:

  • 方式一: 在@Value注入的变量所在类上添加注解 @RefreshScope
  • 方式二:
    • 使用 @ConfigurationProperties 注解代替@Value注解
    • 在 user 服务中,添加一个类,读取patterrn.dateformat属性:
      @Component
      @Data
      @ConfigurationProperties(prefix = "pattern")
      public class PatternProperties {
          private String dateformat;
      }
      
    • 在UserController中使用这个类代替@Value:
      @Autowired
      private PatternProperties patternProperties;
      
      @GetMapping("now")
      public String now() {
          return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat));
      }
      

3. 配置共享

其实微服务启动时,会去nacos读取多个配置文件,因为nacos管理的配置文件不包含环境信息,可以被多个环境共享。

只需要取名的时候,不加上 profile 就能被共享,如下:

配置共享时的优先级:

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

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

相关文章

css:隐藏input file标签并触发点击上传文件事件

目录方式一&#xff1a;将input标签覆盖到按钮的最上层方式二&#xff1a;通过label标签触发点击事件方式三&#xff1a;js触发文件上传的点击事件总结通用的按钮样式 /* button样式来自element-ui */ .button {color: #fff;background-color: #409eff;display: inline-block;…

【MQTT】mqtt + go + M5Stack + SSR 远程灯控程序

1. mqtt服务搭建 参考上一篇文章【MQTT】mqtt 服务器部署--go 生产和消费demo_平静不绝望的博客-CSDN博客 2. M5stack 烧录和编程 详细文档&#xff1a;m5-docs mac 需要安装USB驱动 和 m5burner 如下图 3. flow ui 编程 SSR 4. go web远程代码 s.Router.HandleFunc(&…

UE中的FString操作

此篇是指单纯记录&#xff0c;方便之后查阅。 目录 创建 转型到FString FString转型到其他类型 字符串中是否包含指定串 查找给定串在其中是什么位置 字符串比较 读文件 裁剪字符串 编码解决的是文字问题 稍微细致一些的可以看&#xff1a; UE4随笔&#xff1a;FStri…

TI 2640 Quick start

&#xff08;1&#xff09;下载ccs 并且安装 &#xff08;2&#xff09;下载对应版本的SDK&#xff0c;并且安装 SDK对应版本下载可以通过搜索的方式&#xff1a;simplelink_cc2640r2_sdk_5_30_00_03 &#xff08;3&#xff09;导入对应的工程文件 此篇文档可以作为参考&#x…

喜讯丨计讯物联荣获厦门软件园党群服务中心篮球赛亚军

蓄势待发迎“篮”上&#xff0c;齐心协力谱新篇。12月17日&#xff0c;厦门软件园党群服务中心篮球赛完美落幕。计讯物联一路过关斩将&#xff0c;荣获厦门软件园党群服务中心篮球赛亚军。 决胜雅马哈&#xff0c;强势晋级半决赛 随着一声哨响&#xff0c;比赛正式拉开帷幕&…

2个月备考通过系统架构设计师考试,把经验分享给孤军奋战的你

一、前言 本来于2022-08-29报考系统架构设计师&#xff0c;报考完成以后才开始了正式的学习&#xff0c;也就是9月初才开始系统学习&#xff0c;2022-11-05开始考试&#xff0c;中间准备了两个月的时间。 当时公司业务受疫情影响严重&#xff0c;领导叫我考一个证书吧&#xf…

Android制作简易的音乐播放器和视频播放器

文章目录制作简易的音乐播放器和视频播放器播放多媒体文件播放音频MediaPlayer的工作流程项目示例播放视频项目示例制作简易的音乐播放器和视频播放器 播放多媒体文件 Android在播放音频和视频方面做了非常不错的支持,它提供了一套非常完整的API,使得开发者可以轻松编写出一个…

JavaEE入门知识

1.为什么要学习框架&#xff1f; 1. 学习框架相当于从“⼩作坊”到“⼯⼚”的升级&#xff0c;⼩作坊什么都要⾃⼰做&#xff0c;⼯⼚是组件式装配&#xff0c;特点就是⾼效。 2. 框架更加易⽤、简单且⾼效。 2.创建一个Servlet项目&#xff08;我使用的是IDEA专业版&#…

USB TO SPI(上海同旺电子)调试器调试MCP6S92

所需设备&#xff1a; 1、USB TO SPI(上海同旺电子)&#xff1b; 2、MCP6S92 单端轨到轨输入/ 输出低增益PGA; 特性 • 复用输入&#xff1a;1 或2 个通道 • 8 种增益选择&#xff1a; - 1、2、4、5、8、10、16 或32 V/V • 串行外设接口&#xff08;SPI&#xff09; • 轨…

生成模型(三):基于流的生成模型(Flow-based model)

本文大纲如下&#xff1a; 到目前为止&#xff0c;已经介绍了[[生成模型-GAN]]和[[生成模型-VAE]]。它们都没有明确地学习真实数据的概率密度函数p(\mathbf{x})&#xff08;其中\mathbf{x}\in \mathcal{D}&#xff09;, 因为很难。以带有潜变量的生成模型为例&#xff0c;p(\ma…

Web前端105天day61-HTML5_CORE

HTML5CORE01 目录 前言 一、拖拽上传文件 1.1.文件上传 二、跨域 三、跨域解决方案 四、查看网站接口 五、文件上传服务 总结 前言 HTML5CORE01学习开始 HTML5 : 目前主流的 HTML 版本, 其中增加了很多新特性例如: 音视频, 网页存储技术 - webStorage一、拖拽上传文件…

TensorRT学习笔记 1 - 概述

TensorRT系列笔记是作者半年来学习和使用TensorRT(后称trt)积累笔记 整理和心得。包含trt的基本概念&#xff0c;相关资料&#xff0c;实践笔记&#xff0c;踩坑记录等等。 本篇博客希望可以初步说清楚 trt是什么&#xff1b;模型部署为什么使用trt&#xff0c;以及使用trt的…

渗透攻击MS08-067

学校课程关于Metasploit有基础的几个小实验&#xff0c;把它整理分享在这里。 实训目的&#xff1a; 熟悉Metasploit终端的使用方法&#xff0c;了解MS08-067漏洞&#xff0c;掌握对MS08-067漏洞攻击的方法。 场景描述&#xff1a; 在虚拟机环境下配置 “WinXP1”和“Kali …

华为机试_HJ63 DNA序列【中等】

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 解题过程 提交代码 学习代码 代码一 收藏点 描述 一个 DNA 序列由 A/C/G/T 四个字母的排列组合组成。 G 和 C 的比例&#xff08;定义为 GC-Ratio &#xff09;是序列中 G 和 C 两个字母的总的出现次数除以总的字…

公开竞价与封闭式竞价有什么不同?

电子竞价是电子采购的一种形式。电子采购是指通过信息和网络系统在线进行的招标采购过程。 电子竞价是指一种基于网络的系统&#xff0c;允许潜在供应商在网上实时竞争商品/服务的价格。电子竞价的使用方式类似于e-bay平台&#xff0c;出价最高者获胜。在建筑业&#xff0c;这…

前端_Vue_7.表单输入绑定

文章目录一、 表单输入绑定1.0. 表单&表单元素1.0.1. 表单1.0.2. 表单元素1.1. 基本用法1.1.1. 文本1.1.2. 多行文本1.1.3. 复选框1.1.4. 单选按钮1.1.5. 选择器1.2. 值绑定1.2.1. 复选框1.2.2. 单选按钮1.2.3. 选择器选项1.3. 修饰符1.3.1. .lazy1.3.2. .number1.3.3. .tr…

三角函数公式

三角函数的定义 锐角三角函数任意角三角函数正弦sin⁡Aac\sin A\dfrac acsinAca​sin⁡θyr\sin \theta\dfrac yrsinθry​余弦cos⁡Abc\cos A\dfrac bccosAcb​cos⁡θxr\cos \theta\dfrac xrcosθrx​正切tan⁡Aab\tan A\dfrac abtanAba​tan⁡θyx\tan \theta\dfrac yxtanθ…

mysql中常用命令完整大全 适用于mysql8.0

关于安装部分就去看其他人的一些文章即可网上太多&#xff0c;这篇文章主要就是记录本人的一些关于mysql操作上的笔记。 mysql中常用命令1.登录数据库2.查看当前数据库3.创建数据库4.删除数据库5.创建表user基于以下条件6.使用主键约束7.指定非空8.唯一约束9.默认约束10.设置表…

物联网时代下的5G融合定位,可以实现哪些功能?

5G具有高带宽、高频谱&#xff08;毫米波&#xff09;、多天线阵列等特性&#xff0c;通过提升无线定位算法的能力、室内数字系统建设、完善5G定位服务流程以及与其它定位技术和平台的结合&#xff0c;可提高5G定位精度。室内高精度定位服务为5G定位扩展到更多应用场景和领域构…

C++:类和对象:运算符重载

前言&#xff1a; 运算符重载概念&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型。 1&#xff1a;加号运算符重载 对于内置的数据类型&#xff0c; 编译器知道如何运算&#xff0c;可以很直观的得到结果 int a 10; …