• SpringCloud全系列知识(1)——初识微服务和注册中心


    SpringCloud(1)— 初识微服务和注册中心

    一 基础框架图

    1.微服务技术栈

    在这里插入图片描述

    2.技术栈分类

    在这里插入图片描述

    二 认识微服务

    1.单体架构

    将业务功能集中在一个项目中,打成一个包部署。
    优点:架构简单,部署成本低。
    ]
    缺点:耦合度

    2.分布式架构

    根据业务功能对系统进行拆分,每个业务作为独立项目开发,称之为一个服务。
    优点:降低耦合度,有利于服务升级拓展

    1.微服务

    经过良好架构设计的分布式架构方案,微服务的特征:
    1.单一职责:微服务拆分粒度更小,每个服务对应一种能力,做到单一职责,避免重复开发
    2.面向服务:微服务对外暴露业务接口
    3.自治:团队独立,技术独立,数据独立,部署独立
    4.隔离性强:服务做好隔离,容错,降级,避免出现级联失败

    总结:为实现 “高内聚,低耦合”
    优点:拆分粒度更小,服务更独立,耦合度更低
    缺点:架构非常复杂,运维,监控,部署等都将变得困难

    2.技术落地

    当前主要为 SpringCloud,Alibaba的Dubbo 和 SpringCloudAlibaba。
    在这里插入图片描述

    三 SpringCloud框架介绍

    1.SpringCloud是目前使用最广泛的微服务框架
    2.SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。
    在这里插入图片描述

    1.拆分注意

    1.不同微服务,不应该重复开发相同业务

    2.数据独立,不调用其他服务的数据库

    3.将自己的作为接口暴露,供其他微服务访问

    核心:单一职责

    2.调用方式-RestTemplate

    Spring提供的远程调用工具类,需要注册到Bean中以后再使用。

    可以实现各个服务之间的相互调用

    3.提供者与消费者

    1.提供者:业务中被其他服务所调用的服务称之为提供者,即提供服务给其他微服务

    2.消费者:业务中调用其他微服务的服务称之为消费者。

    实际业务中,每个微服务的提供者或消费者身份是根据实际情况互相转换的。

    四 Eureka注册中心

    1.核心问题

    服务消费者该如何知道众多服务提供者的地址以及是否可用?

    2.Eureka注册中心的作用

    记录和管理,所有服务的地址及状态

    3.实现原理

    eureka与各个微服务之间通过“心跳”续约,保证下发给消费者的微服务地址都是可用的。
    在这里插入图片描述
    4.官方地址 : GitHub - Netflix/eureka

    1.搭建 Eureka Server

    1.引入 Eureka Server依赖
    <dependency>
       <groupId>org.springframework.cloudgroupId>
       <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    或者在使用Spring initializr 创建项目时直接勾选
    在这里插入图片描述

    2.配置Eureka

    1.在启动类中加入EurekaServer的注解

    @EnableEurekaServer
    
    • 1

    2.在配置文件中配置Eureka相关参数

    # 实现Eureka服务自身的注册
    server:
      port: 10086
    spring:
      application:
        name: eureka-server
    eureka:
      client:
        # Eureka服务的注册地址
        service-url:
          defaultZone: http://localhost:10086/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.浏览器访问 http://localhost:10086
    在这里插入图片描述

    3.注册微服务

    1.引入依赖

     <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    或者在使用Spring initializr 创建项目时直接勾选
    在这里插入图片描述

    由于各个版本不完全一致,建议通过 Spring initializr 直接勾选添加

    2.在各个服务的配置文件中配置eureka的服务地址

    eureka:
      client:
        # Eureka服务的注册地址
        service-url:
          defaultZone: http://localhost:10086/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.在启动类中加入 @EnableEurekaClient 注解

    #部分版本已经做了整合,此步骤非必须,视情况而定
    @EnableEurekaClient
    
    • 1
    • 2

    在这里插入图片描述

    4.一个服务启动多个实例

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

    复制配置文件后,为避免端口号冲突,应使用 -Dserver.port=xxx 修改端口号

    -Dserver.port=[new port]

    启动服务成功后,刚复制的服务将出现在服务列表中。
    在这里插入图片描述

    5.负载均衡

    1.使用 RestTemplate 访问其他微服务时,可以使用 @LoadBalanced 注解快速实现负载均衡

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.调用实现时将不再使用具体的 Host+ port 地址,而是使用服务名称进行访问。

    @GetMapping("/{id}")
    public Order get(@PathVariable Integer id){
        Order order = orderService.getById(id);
        //String url="http://localhost:8082/user/"+order.getUserId();
        // 此处使用服务名称 cloud_user 进行访问
        String url="http://cloud_user/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        order.setUser(user);
        return order;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.踩坑笔记

    配置文件中的服务名称,不要使用下划线(_),否则 RestTemplate 通过服务名称调用时将无法识别。

    2.Ribbon负载均衡

    1.Ribbon负载均衡流程
    在这里插入图片描述

    2.负载均衡策略

    在这里插入图片描述

    1.Ribbon中的负载均衡策略

    在这里插入图片描述

    2.定义负载均衡规则
    1.通过 实现 IRule 定义规则
    // 通过 IRule 配置的负载均衡规则将作用于所有微服务的提供者
    @Bean
    public IRule rule(){
        //实现随机规则
        return new RandomRule();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2.通过配置文件定义规则
    eureka:
      client:
        # Eureka的地址信息
        service-url:
          defaultZone: http://localhost:10086/eureka/
    # 为指定服务配置负载均衡规则
    cloud-user: # 微服务名称
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    3.饥饿加载

    Ribbon默认采用的是懒加载,即第一次访问时才会创建LoadBalanceClient,请求时间较长。

    而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过一下配置开启饥饿加载:

    # 为指定服务配置负载均衡规则
    cloud-user: # 微服务名称
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
    ribbon:
      # 饥饿加载
      eager-load:
        #需要饥饿加载的微服务名
        clients: cloud-user
        #开启
        enabled: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用 RestTemplate 用于负载均衡时 必须使用 @LoadBalanced 注解

    五 Nacos注册中心

    由 Alibaba 开发的微服务注册中心,比Eureka功能更加丰富,完善。

    GitHub网址:home (nacos.io)

    下载地址:Releases · alibaba/nacos (github.com)

    文档地址:Nacos 快速开始

    1.运行Nacos

    1.standalone代表着单机模式运行,非集群模式

    Windows下运行:startup.cmd -m standalone
    Linux/Unix/Mac:sh startup.sh -m standalone

    在这里插入图片描述
    2.浏览器访问 http://localhost:8848/nacos,即可打开nacos的登录界面,第一次打开会比较缓慢。默认端口为8848。
    在这里插入图片描述
    3.默认配置可通过配置文件进行修改,若端口被占用,打开配置文件修改即可。
    在这里插入图片描述
    默认的账号密码均为 nacos

    2.服务发现

    1.引入 SpringCloudAlibaba 的坐标 和 Nacos客户端的坐标

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-alibaba-dependenciesartifactId>
        <version>${spring-cloud-alibaba.version}version>
        <type>pomtype>
        <scope>importscope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    
     <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    或者在使用Spring initializr 创建项目时直接勾选,便可自动引用

    2.在服务器中配置Nacos的相关信息

    server:
      port: 8081
    spring:
      application:
        # 服务名称
        name:  alibaba-order
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/cloud_order?serverTimezone=Asia/Shanghai&characterEncoding=utf8
        username: root
        password: 123456
      cloud:
       # nacos的主要配置信息如下:
        nacos:
          discovery:
            # 注册中心地址
            server-addr: http://localhost:8848
            # 名称空间
            namespace: public
            # 注册中心的账号及密码
            username: nacos
            password: nacos
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    3.配置完成以后便可以在 nacos 注册中心发现名为 alibaba-order 的服务了
    在这里插入图片描述

    3.分级存储模型

    分级存储的意义:

    1.当某一个集群瘫痪时,可以立即启用另一个集群。起到容灾的作用。

    2.尽可能访问距离自己较近的服务,使得访问距离更短,延迟更低,速度更快。
    在这里插入图片描述

    1.Nacos分级存储的配置
    cloud:
      nacos:
        server-addr: http://localhost:8848
        discovery:
          namespace: public
          username: nacos
          password: nacos
          # 通过 cluster-name 属性设置服务所在的集群区域
          cluster-name: xian
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    2.优先本地集群

    优先使用本地集群(同集群)的服务,需要通过设置负载均衡规则实现,本地集群没有可用服务时才回去其他集群调用服务,同时会给出警告信息。

    alibaba-user: # 微服务名称
      ribbon:
        # 使用 NacosRule 作为负载均衡规则,将优先使用同一集群内的服务
        NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
    
    • 1
    • 2
    • 3
    • 4

    或者使用 IRule 实现统一配置

    @Bean
    public IRule rule(){
        return new NacosRule();
    }
    
    • 1
    • 2
    • 3
    • 4

    Nacos的访问特点:

    优先使用本地集群的服务,且访问规则是随机,并非轮询。

    3.权重配置

    通过配置权重,将决定服务所承担的请求量比重,权重越高则被访问的几率和次数越多。

    在实际使用中,配置高的服务器可使用更大的权重值来承担更多的访问量。另外权重为0时,服务器将不会被访问。
    在这里插入图片描述

    权重为0可用于服务的平滑升级,整个过程中用户是无感知的。

    4.环境隔离-NameSpace

    Nacos中的服务存储和数据存储的最外层是名为 namespace 的层,用来做最外层隔离

    通过命名空间,可用于做开发环境和测试环境的隔离。不同命名空间的服务不允许相互访问
    在这里插入图片描述

    通过命名空间,可用于做开发环境和测试环境的隔离。不同命名空间的服务不允许相互访问(不可见)。
    在这里插入图片描述在这里插入图片描述

    命名空间的配置,通过在项目的配置文件中使用命名空间的ID来设置

    cloud:
      nacos:
        server-addr: http://localhost:8848
        discovery:
          # 使用 nacos 的命名空间的ID来设置,而并非名称
          namespace: 77cb474b-03a8-405a-b4f0-cdd5d954af7a
          username: nacos
          password: nacos
          cluster-name: xian
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1.Nacos细节分析

    1.服务消费者定时拉取(pull)服务提供者缓存信息,间隔30秒。Nacos注册中心也会定时向服务消费者推送(push)服务列表。

    2.Nacos中实例分为 临时实例 和 非临时实例。

    3.对于临时实例,服务提供者间隔 指定时间 发送新跳到Nacos注册中心。服务提供者未发送心跳时会被Nacos从服务列表中剔除。

    4.对于非临时实例,不通过心跳来维持与Nacos注册中心的联系,由Nacos主动发送请求去检测服务提供者是否健康。且服务提供者宕机时并不会被Nacos剔除。
    在这里插入图片描述
    5.设置实例为非临时实例,通过配置文件来设置。

    nacos:
      server-addr: http://localhost:8848
      discovery:
        namespace: public
        username: nacos
        password: nacos
        cluster-name: xian
        # 通过 ephemeral 属性,设置该实例为非临时实例
        ephemeral: false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    非临时实例变更为临时实例时,需要调用Nacos开放文档中的注销API,注销成功后再在Nacos上删除才可正常启动

    6.非临时实例宕机时不会被Nacost剔除,而是给出警示色。
    在这里插入图片描述

    2.集群方式

    Nacos默认采用AP方式,当集群中存在非临时实例时,使用CP模式;

    Eureka采用AP方式;

    AP方式注重服务的可用性,CP模式注重服务的一致性和可靠性

  • 相关阅读:
    数仓建模—数据仓库即服务
    2023 “华为杯” 中国研究生数学建模竞赛(C题)深度剖析|数学建模完整代码+建模过程全解全析
    紫光展锐发布全新6G白皮书,展望泛在融合发展蓝图
    OpenCV入门(C++/Python)- 使用OpenCV读取、显示和写入图像(一)
    【初识Jmeter】【接口自动化】
    Optimize File Size for Accessible PDFs
    JS中的执行上下文和执行栈
    123. 买卖股票的最佳时机 III
    用实际例子详细探究OpenCV的轮廓检测函数findContours(),彻底搞清每个参数、每种模式的真正作用与含义
    智能网联汽车云控系统第2部分:车云数据交互规范
  • 原文地址:https://blog.csdn.net/shaopengjie2/article/details/128004016