SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

微服务注册中心

注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。

在这里插入图片描述

微服务注册中心

服务注册中心(简称注册中心)是微服务框架的一个重要组件,在微服务架构里主要起到了协调者的一个作用,注册中心一般包括如下几个功能:

  1. 注册发现:
    • 服务注册/反注册:保证服务提供者和服务调用者的信息
    • 服务订阅/取消订阅:服务调用者订阅服务提供者的信息,最好有实时推送的功能
    • 服务路由(可选):具有筛选整合服务提供者的能力
  2. 服务配置:
    • 配置订阅:服务提供者和服务调用者订阅微服务相关的配置
    • 配置下发:主动将配置托送给服务提供者和服务调用者
  3. 服务监控检测:
    • 检测服务提供者的健康情况

常见的注册中心

  • Zookeeper

    zookeeper它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步、集群管理、分布式应用配置项的管理等。简单来说zookeeper=文件系统+监听通知机制

  • Eureka

    Eureka是Java语言上,基于Restful Api开发的服务注册与发现组件,SpringCloud Netflix 中的重要组件

  • Consul

    Consul是由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件,采用Raft算法保证服务的一致性,并且支持健康检查

  • Nacos

    Nacos是一个更易于构建云原生应用的动态服务发现,配置管理和服务平台,简单来说Nacos就是注册中心+配置中心的组合,提供简单易用的特征集,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。Nacos还是Spring Cloud Alibaba 组件之一,负责服务注册与发现

组件名语言CAP一致性算法服务健康检查对外暴露接口
EurekaJavaAP可配支持HTTP
ConsulGoCPRaft支持HTTP/DNS
ZookeeperJavaCPPaxos支持客户端
NacosJavaAPRaft支持HTTP

Eureka闭源影响:

在Eureka的GitHub上,宣布Eureka 2.x闭源。意味着如果开发者继续使用作为2.x分支上现有的工作时,自负风险

Nacos简介

Nacos致力于帮助您发现,配置和管理微服务。Nacos提供了一组简单易用的特征集,帮助您快速实现动态服务发现,服务配置,服务元数据及流量管理。Nacos的作用就是一个注册中心,用来管理注册上来的各个微服务

  • Nacos下载地址

    https://github.com/alibaba/nacos/releases,下载zip格式的安装包,解压安装

  • Nacos的启动

    命令启动:

    # 切换目录
    cd nacos/bin
    # 命令启动
    startup.cmd -m standalone
    

    双击启动startup.cmd 运行

    Nacos启动浏览器访问http://localhost:8848/nacos即可访问服务,默认的账号密码是nacos/nacos

项目中搭建Nacos

基于原来的项目搭建Nacos

  • 将shop_product商品微服务注册到Nacos

实现步骤:

  1. pom文件中添加Nacos依赖

    <!--nacos客户端-->
    <!--服务注册-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  2. 在启动类上添加@EnableDiscoveryClient注解

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ShopOrderApplication {
        public static void main(String[] args) {       SpringApplication.run(ShopOrderApplication.class, args);
        }
    }
    
  3. 在application.yaml中添加Nacos服务的地址

    server:
      port: 8081
    spring:
      application:
        name: service-product   # 注册到服务中心中的名字
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
        username: root
        password: 123456
      # 配置nacos
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
            #server-addr: nacos服务地址:端口号
    
  4. 启动服务,观察Nacos的控制面板中是否有注册上来的商品微服务

    在这里插入图片描述

    刷新nacos,能看到注册的微服务即注册成功

  • 将shop_order订单微服务注册到Nacos

实现步骤:

  1. 在pom文件添加nacos的依赖

    <!--nacos客户端-->
    <!--服务注册-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  2. 在启动类上添加@EnableDiscoveryClient注解

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ShopOrderApplication {
        public static void main(String[] args) {       SpringApplication.run(ShopOrderApplication.class, args);
        }
    }
    
  3. 在application.yaml中添加nacos服务的地址

    server:
      port: 8091
    spring:
    	application:
        name: service-order   # 注册到服务中心中的名字
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
        username: root
        password: 123456
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    
  4. 启动服务,观察nacos的控制面板中是否有注册上来的订单微服务,同shop_product

服务调用Ribbon入门

经过以上的学习,已经实现了服务的注册和服务发现。当启动某个服务的时候,可以通过HTTP的形式将信息注册到注册中心,并且可以通过SpringCloud提供的工具获取注册中心的服务列表。但是服务之间的调用还存在很多的问题,如何更加方便的调用微服务,多个微服务的提供者如何选择,如何负载均衡等

Ribbon的概述

是Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中,Nacos一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Nacos中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。
在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务

Ribbon的主要作用

  1. 服务调用

    基于Ribbon实现服务调用,是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助RestTemplate最终进行调用

  2. 负载均衡

    当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址

基于Ribbon实现服务调用

需求:基于Ribbon实现订单调用商品的服务

实现步骤:

  1. 坐标依赖

    在springcloud提供的服务发现的jar中已经包含了Ribbon的依赖。所以在这不需要子啊导入任何额外的坐标

  2. 工程改造

    服务消费者(服务的调用者)

    在注入RestTemplate的方法上添加注解==@LoadBalanced==注解

    @Configuration
    public class RestTemplateConfig {
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }
    

    通过服务名称消费使用

    @RestController
    @RequestMapping("/order")
    public class OrderController {
        @Autowired(required = false)
        private IOrderService orderService;
    
        @Autowired(required = false)
        private RestTemplate restTemplate;
    
        // 模拟下订单业务
        @RequestMapping("/save/{pid}")
        public Order order (@PathVariable("pid") int pid) {
            // 调用商品的微服务
            String url = "service-product";
            Product product = restTemplate.getForObject("http://"+ url +"/product/" + pid, Product.class);
    
            // 创建订单
            Order order = new Order();
            order.setUid(1);
            order.setUsername("测试用户");
            order.setPid(pid);
            order.setPname(product.getPname());
            order.setPprice(product.getPprice());
            order.setNumber(1);
            orderService.save(order);
            return order;
        }
    }
    

    注意:restTemplate.getForObject(“http://商品服务名称/product/1”+pid,Product.class)

    这里的商品服务名称是:注册商品服务时的名称,即shop_product的yaml配置文件中的application.name

    路径是根据shop_product中通过id查询商品的路径编写

服务调用Ribbon高级

负载均衡概述

在搭建网对时,如果单节点的 web服务性能和可靠性都法达到要求;或者是在使用外网服务时,经常担心被人攻破,一不小就会有打开外网端口的情况,通常这时加人负载有就能有效
决服务问题。
负载均衡是一种基础的网络服务,其原理是通过运行在前面的负载均衡服务,按照指定的负载均衡算法,将流量分雷到后端服务集群上,从而为系统提供并行扩展的能力。
负载均衡的应用场景包括流量包、转发规则以及后端服务,由于该服务有内外网隔离,健康检查功能,能够有效提供系统的安全性和可用性。

在这里插入图片描述

负载均衡分类

  1. 客户端负载均衡

    先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配

  2. 服务端负载均衡

    客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡,即在客户端就进行负载均衡算法分配

基于Ribbon实现负载均衡

需求:实现订单和商品之间的客户端负载均衡

实现步骤:

  1. 先搭建多服务实例(即水平拓展)

    订单服务需要调商品服务,所以需要再启动一个shop-product微服务,设置端口号为8082

    在这里插入图片描述

  2. 启动两个shop_product和shop_order

    发送多次请求,可以在调用的product服务中打印内容,查看控制台打印内容,Ribbon默认的负载均衡策略是轮询的方式

负载均衡的策略

Ribbion内置了多种负载均衡策略,内部负责负载均衡的顶级接口为com.netflix.loadbalancer.IRule

在这里插入图片描述

  • com.netflix.loadbalancer.RoundRobinRule:以轮询的方式进行负载均衡
  • com.netflix.loadbalancer.RandomRule:随机策略
  • com.netflix.loadbalancer.RetryRule:重试策略
  • com.netflix.loadbalancer.WeightedResponseTimeRule:权重策略。会计算每个服务的权重,越高的被调用的可能性越大
  • com.netflix.loadbalancer.BestAvailableRule:最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实力返回
  • com.netflix.loadbalancer.AvailabilityFilteringRule:可用过滤策略。过滤掉故障和请求次数超过阈值的服务实例,再从剩下的实例中轮询调用
  • ZoneAvoidanceRule:以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房,一个机架等,而后再对Zone内的多个服务做轮询

自定义指定负载均衡策略

方式一,全局设置

定义一个新的IRule:

@Bean
public IRule randomRule(){
    return new RandomRule();  // 随机策略
}

方式二,局部设置

在yaml配置文件中配置:

在shop_order(客户端配置文件中)的yaml文件中配置被调用的服务,需要调用的服务器名称和策略

server:
  port: 8091
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 123456
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
# 配置随机策略
# 需要调用的服务器名称
service-product:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    # 随机策略完全路径

Nacos配置管理

Nacos除了可做注册中心,同样可以做配置管理来使用

统一配置管理

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错我们需要一种统一配置管理方案,可以集中管理所有实例的配置。

在这里插入图片描述

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

在业界中常见的服务配置中心如下:

  • **Apollo:**由携程开源的分布式配置中心。特点很多:配置更新之后可以实时生效,支持灰度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且
    料也写的很详细
  • **Disconf:**由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效的
  • **SpringCloud Config:**Spring Cloud中带的配置中心组件。它和Spring是无缝集成,使用起来非常方便,并且它的配置存储支持Git,不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新
  • **Nacos:**SpringCloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也继承了服务配置的功能,我们可以直接使用它作为服务配置中心

在nacos中添加配置文件

在这里插入图片描述

nacos配置中心新建配置起名规范:

服务名称-环境简称.文件后缀:shop_order-dev.yaml

从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yaml配置合并,才能完成项目启动

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

在这里插入图片描述

配置实现步骤

  1. 引入nacos-config依赖

    <!--统一配置-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    
  2. 添加bootstrap.yaml

    不能使用原来的application.yaml作为配置问价你,新建一个bootstrap.yaml作为配置文件

    server:
      port: 8091
    spring:
      application:
        name: service-order
      cloud:
        nacos:
          config:
            server-addr: 127.0.0.1:8848  #nacos 中心地址
            file-extension: yaml # 配置文件格式
      profiles:
        active: dev  #环境表示,开发环境
    

    配置文件优先级(由高到低):

    bootstrap.properties–>bootstrap.yaml–>application.properties–>application.yaml

  3. 在nacos中添加配置:service-order-dev

    在这里插入图片描述

  4. 测试:

    模拟下单业务,正常下单即成功

配置热更新

最终目的是修改nacos中的配置后,微服务中无需重启即可让配置文件生效,也就是配置热更新。实现热更新两种方式:

在配置中心添加配置(随便起的键值对为了看效果)

config:
	env: test 
  • 方式一

    只需要在需要动态读取配置的类上添加==@RefreshScope==注解就可以

    @RestController
    @RequestMapping("/order")
    @RefreshScope // 动态读取配置
    public class OrderController {
       @Value("${config.env}")
      private String appName;
      
      @GetMapping("/nacos-config-test")
      public String nacosConfigTest(){
        return appName;
      }
    }
    
  • 方式二

    硬编码方式

    @Value(("${config.env}"))
    private String env;
    @Autowired
    private ConfigurableApplicationContext applicationContext;
    
    @GetMapping("nacos-config-test2")
    public String nacosConfigTest2(){
      return applicationContext.getEnvironment().getProperty("config.env");
    }
    

当在配置中心中修改了config.env键值对,服务不需要重新启动,即可拿到修改后的值

配置共享

配置共享即抽取相同的配置

同服务内配置共享

实现步骤:

在这里插入图片描述

  1. 新建一个以service-order命名的配置文件,然后将其所有环境的公共配置放在里面

    在这里插入图片描述

  2. 新建一个名为service-order-test.yaml配置存放测试环境的配置

  3. 新建一个名为service-order-dev.yaml配置存放开发环境的配置

  4. 在两个环境文件中配置独有信息

在这里插入图片描述

  1. 添加测试方法

    修改bootstrap.yaml中的环境看字符串打印的内容

    profiles:
        active: dev  #环境表示,开发环境
        #active:test
    
    @Value(("${config.env}"))
    private String env;
    
    @GetMapping("/nacos-config-test3")
    public String nacosConfigTest3(){
        return env;
    }
    

不同微服务共享配置

不同服务之间实现配置共享的原理类似于文件引入,就是定义一个公共配置,然后在当前配置中引入

  1. 在nacos中定义一个DataID为all-service.yaml(随便起)的配置,用于所有微服务共享

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
        username: root
        password: 123456
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    
  2. 修改bootstrap.yaml

    server:
      port: 8091
    spring:
      application:
        name: service-order
      cloud:
        nacos:
          config:
            server-addr: 127.0.0.1:8848  #nacos 中心地址
            file-extension: yaml # 配置文件格式
            shared-dataids: all-service.yaml  #配置要引入的配置
            refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置
      profiles:
        active: dev  #环境表示,开发环境
    
  3. 启动商品微服务测试

配置共享的优先级

当nacos、服务本地同时出现相同属性时,优先级有高低之分:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LV.12 D18 中断处理 学习笔记

一、ARM的异常处理机制及工程代码结构 1.1异常概念 处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生 这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件 异常事件处理完成之后再返回到被异常打断的点继续执行程序。 1.2异常处理机制 不同的处…

2023/11/19总结

项目进度&#xff1a; 地址管理&#xff1a; 显示菜品 购物车相关功能 然后最近在看 支付宝沙盒支付的相关功能&#xff0c;打算把支付给做了 。界面做的不是很好看 &#xff0c;但是后续会改成 手机端的。

丹麦能源袭击预示着更关键的基础设施成为目标

5 月&#xff0c;22 个丹麦能源部门组织在与俄罗斯 Sandworm APT 部分相关的攻击中受到损害。 丹麦关键基础设施安全非营利组织 SektorCERT 的一份新报告描述了不同的攻击者群体利用合勤防火墙设备中的多个关键漏洞&#xff08;包括两个零日漏洞&#xff09;侵入工业机械&…

【Android Jetpack】DataStore的介绍

DataStore Jetpack DataStore是一种数据存储解决方案&#xff0c;允许您使用协议缓冲区存储键值对或类型化对象。DataStore使用Kotlin协程和Flow以异步、一致的事务方式存储数据。 注意&#xff1a;如果您需要支持大型或复杂数据集、部分更新或参照完整性&#xff0c;请考虑使…

配置iTerm2打开自动执行命令

打开iTerm2&#xff0c;commado&#xff0c;打开profies->edit profies&#xff0c;点击号&#xff0c;创建一个新的profile 在新的profile中填写 name&#xff1a;随意 command&#xff1a;Login Shell Send text at start&#xff1a;执行脚本的命令&#xff0c;不想写路…

C# Winform围棋棋盘

C# Winform简单的围棋棋盘vs2008winform小游戏C#vs2010winform棋盘C#窗体小游戏 这是一个简单的围棋棋盘小游戏&#xff0c;使用C# Winform编写棋盘界面&#xff0c;玩家可以在空白的交叉点上下棋子 项目获取&#xff1a; 项目获取&#xff1a;typora: typora/img (gitee.co…

【Android Jetpack】Hilt的理解与浅析

文章目录 依赖注入DaggerHiltKoin添加依赖项Hilt常用注解的含义HiltAndroidAppAndroidEntryPointInjectModuleInstallInProvidesEntryPoint Hilt组件生命周期和作用域如何使用 Hilt 进行依赖注入 本文只是进行了简单入门&#xff0c;博客仅当做笔记用。 依赖注入 依赖注入是一…

SQL基础理论篇(七):多表关联的连接算法

文章目录 简介Nested LoopsMerge JoinHash Join总结参考文献 简介 多表之间基础的关联算法一共有三种&#xff1a; Hash JoinNested LoopsMerge Join 还有很多基于这三种基础算法的变体&#xff0c;以Nested Loops为例&#xff0c;就有用于in和exist的半连接&#xff08;Nes…

基于Python+OpenCV+Tensorflow图像迁移的艺术图片生成系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统![请添加图片描述](https://img-blog.csdnimg.cn/dbda87069fc14c24b71c1eb4224dff05.png)四. 总结 一项目简介 基于PythonOpenCVTensorfl…

ARouter出现 there‘s no route matched in group问题排查

在使用ARouter时候会出现找不到映射路径的问题&#xff0c;这里给兄弟们总结下踩过的坑 所有用到的模块都要有填写依赖 android {defaultConfig {......javaCompileOptions {annotationProcessorOptions {arguments [AROUTER_MODULE_NAME: project.getName()]}}} } ... depe…

PS学习笔记——移动工具

文章目录 介绍文档内移动文档间移动 介绍 移动工具&#xff1a;用于移动图层中的对象&#xff0c;并且同一图层中的所有对象都将一起移动 选中移动工具后&#xff0c;选项栏中会出现“显示变换控件”&#xff0c;勾选后即可看见图层中的对象周围出现边框&#xff0c;可以进行缩…

Dockerfile自定义镜像以及案例分析

文章目录 一、Dockerfile自定义镜像1.1 镜像结构1.2 Dockerfile语法 二、构建Java项目三、基于java8构建java四、小结 一、Dockerfile自定义镜像 常见的镜像在DockerHub就能找到&#xff0c;但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像&#xff0c;就必须先了…

单张图像3D重建:原理与PyTorch实现

近年来&#xff0c;深度学习&#xff08;DL&#xff09;在解决图像分类、目标检测、语义分割等 2D 图像任务方面表现出了出色的能力。DL 也不例外&#xff0c;在将其应用于 3D 图形问题方面也取得了巨大进展。 在这篇文章中&#xff0c;我们将探讨最近将深度学习扩展到单图像 3…

“新KG”视点 | 知识图谱与大语言模型协同模式探究

OpenKG 大模型专辑 导读 知识图谱和大型语言模型都是用来表示和处理知识的手段。大模型补足了理解语言的能力&#xff0c;知识图谱则丰富了表示知识的方式&#xff0c;两者的深度结合必将为人工智能提供更为全面、可靠、可控的知识处理方法。在这一背景下&#xff0c;OpenKG组织…

容斥 C. Strange Function改编题

补题&#xff1a; 题目详情 - 9.段坤爱取模%%% - SUSTOJ 本题或许是参考 Problem - C - Codeforces 根据题意&#xff0c;f(i)就是不能被整除的最小的一个质因子。 打表发现&#xff0c;当15个质因子相乘后&#xff0c;长度就大于18。 因此可以知道小于等于1e16内的正整数x…

LeetCode【92】翻转链表II

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/DarkAndGrey/article/details/122146216 public ListNode reverseBetween(ListNode head, int left, int right) {if(head null || right left){return head;// 头节点为null&#xff0c;链表为空&#xff0c;反…

我又开始贩卖焦虑了,机器视觉兄弟们,打工这生意盘不活了?让人逃离北上广深,是毒鸡汤吗?

我想大多数人和我想的一样&#xff0c;不要质疑自己的出身&#xff0c;也不必用一生去改变出身而获得融入感&#xff0c;思想富足这是我们留给自己一生最珍贵的礼物。也许一线城市容不下肉身&#xff0c;二三线城市容不下灵魂。那我回到生我养我的十八线小县城&#xff0c;这不…

Linux虚拟机中网络连接的三种方式

Linux 虚拟机中网络连接的三种方式 先假设一个场景&#xff0c;在教室中有三个人&#xff1a;张三、李四和王五&#xff08;这三个人每人有一台主机&#xff09;&#xff0c;他们三个同处于一个网段中&#xff08;192.169.0.XX&#xff09;&#xff0c;也就是说他们三个之间可…

Vue3+Vite实现工程化,事件绑定以及修饰符

我们可以使用v-on来监听DOM事件&#xff0c;并在事件触发时执行对应的Vue的Javascript代码。 用法&#xff1a;v-on:click "handler" 或简写为 click "handler"vue中的事件名原生事件名去掉 on 前缀 如:onClick --> clickhandler的值可以是方法事件…

EDA实验-----4*4矩阵键盘与数码管显示测试(Quartus ‖)

目录 一、实验目的 二、实验仪器设备 三、实验原理 四、实验要求 五、实验步骤 六、实验报告 七、实验过程 1.矩阵键盘按键原理 2.数码管原理 3.分频器代码 4.电路图连接 5.文件烧录 一、实验目的 了解数码管的工作原理&#xff1b;掌握4*4矩阵键盘和数码管显示的编…