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

news2024/9/24 3:23:50

微服务注册中心

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

在这里插入图片描述

微服务注册中心

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

  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、服务本地同时出现相同属性时,优先级有高低之分:

在这里插入图片描述

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

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

相关文章

PyTorch神经网络-激励函数

在PyTorch 神经网络当中&#xff0c;使用激励函数处理非线性的问题&#xff0c;普通的神经网络出来的数据一般是线性的关系&#xff0c;但是遇到比较复杂的数据的话&#xff0c;需要激励函数处理一些比较难以处理的问题&#xff0c;非线性结果就是其中的情况之一。 FAQ:为什么要…

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

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

【算法】滑动窗口题单——2.不定长滑动窗口(求最长/最大)

文章目录 3. 无重复字符的最长子串1493. 删掉一个元素以后全为 1 的最长子数组904. 水果成篮1695. 删除子数组的最大得分2841. 几乎唯一子数组的最大和2024. 考试的最大困扰度1004. 最大连续1的个数 III1438. 绝对差不超过限制的最长连续子数组2401. 最长优雅子数组解法1——维…

nodejs微信小程序-实验室上机管理系统的设计与实现-安卓-python-PHP-计算机毕业设计

用户&#xff1a;管理员、教师、学生 基础功能&#xff1a;管理课表、管理机房情况、预约机房预约&#xff1b;权限不同&#xff0c;预约类型不同&#xff0c;教师可选课堂预约和个人&#xff1b;课堂预约。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 …

容斥 C. Strange Function改编题

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

(动手学习深度学习)第13章 计算机视觉---微调

文章目录 微调总结 微调代码实现 微调 总结 微调通过使用在大数据上的恶道的预训练好的模型来初始化模型权重来完成提升精度。预训练模型质量很重要微调通常速度更快、精确度更高 微调代码实现 导入相关库 %matplotlib inline import os import torch import torchvision f…

java文件压缩加密,使用流的方式

使用net.lingala.zip4j来进行文件加密压缩。 添加依赖net.lingala.zip4j包依赖&#xff0c;这里使用的是最新的包2.11.5版本。 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>${zip4j.versi…

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

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

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

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

boomYouth

上一周实在是过得太颓废了&#xff0c;我感觉还是要把自己的规划做好一下&#xff1a; 周计划 这周截至周四&#xff0c;我可以用vue简单的画完登陆注册的界面并且弄一点预处理&#xff1a; 周一 的话可以把这些都学一下&#xff1a; 父传子&#xff0c;子传父&#xff1a…

配置iTerm2打开自动执行命令

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

python django 小程序图书借阅源码

开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…

某60区块链安全之不安全的随机数实战一

区块链安全 文章目录 区块链安全不安全的随机数实战一实验目的实验环境实验工具实验原理实验内容攻击过程分析合约源代码漏洞EXP利用 不安全的随机数实战一 实验目的 学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用 实验环境 Ubuntu18.04操作机 实验工…

环境配置|GitHub——解决Github无法显示图片以及README无法显示图片

一、问题背景 最近在整理之前写过的实验、项目&#xff0c;打算把这些东西写成blog&#xff0c;并把工程文件整理上传到Github上。但在上传README文件的时候&#xff0c;发现github无法显示README中的图片&#xff0c;如下图所示&#xff1a; 在README中该图片路径为&#xff1…

Unity Meta Quest 一体机开发(七):配置玩家 Hand Grab 功能

文章目录 &#x1f4d5;教程说明&#x1f4d5;玩家物体配置 Hand Grab Interactor⭐添加 Hand Grab Interactor 物体⭐激活 Hand Grab Visual 和 Hand Grab Glow⭐更新 Best Hover Interactor Group &#x1f4d5;配置可抓取物体&#xff08;无抓取手势&#xff09;⭐刚体和碰撞…

【算法】树形DP③ 监控二叉树 ⭐(二叉树染色二叉树灯饰)!

文章目录 前期知识 & 相关链接例题968. 监控二叉树解法1——标记状态贪心解法2——动态规划 相关练习题目P2458 [SDOI2006] 保安站岗⭐&#xff08;有多个儿子节点&#xff09;&#x1f6b9;LCP 34. 二叉树染色⭐&#xff08;每个节点 单独dp[k 1]数组&#xff09;LCP 64.…

时间序列预测实战(十七)利用Prophet实现电力负荷长期预测(附代码+数据集+详细讲解)

一、本文介绍 Prophet是一个由Facebook开发的开源工具&#xff0c;用于时间序列预测。这个工具特别适合于具有强季节性影响和多个历史数据季节的业务时间序列数据。Prophet的主要思想是将数据分解为如下三个部分&#xff1a;趋势、季节性、节假日和特殊事件。这个模型非常适合…

GIT无效的源路径/URL

ssh-add /Users/haijunyan/.ssh/id_rsa ssh-add -K /Users/haijunyan/.ssh/id_rsa

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

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

【Android Jetpack】Hilt的理解与浅析

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