微服务简介

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 微服务简介

@[TOC]

1 什么是微服务

微服务是分布式架构的一种,是在设计分布式架构设计过程中,不断踩坑,然后,形成的一种经过良好架构设计的分布式架构方案。分布式架构就是把服务做拆分,在拆分的过程中会产生很多问题,而springcloud仅仅是解决了服务拆分时的治理问题。
微服务包含的技术栈

  • 微服务治理:注册发现、远程调用、负载均衡、配置管理、网关路由、熔断降级、分布式事务、Seata等。
  • 缓存技术:redis持久化、缓存数据同步、Nginx本地缓存等。
  • 搜索技术:DSL语句、ES集群、竞价排名、集群脑裂、地理坐标等。
  • 异步通信技术:MQ消息模型、消息堆积问题、镜像集群、延迟队列等。
  • DevOps技术:Docker使用、DockerCompose、SkyWalkingJenkins等。

    1.1 单体架构

  • 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点:架构简单、部署简单。缺点:耦合度高。

    1.2 分布式架构

  • 分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。优点:降低服务耦合度、有利于服务升级拓展。缺点:服务拆分粒度如何、服务集群地址如何维护、服务之间如何实现远程调用、服务健康状态如何感知等问题。
    特征:
  • 单一职责,每个服务对应唯一的业务能力,避免重复开发
  • 面向服务:微服务对外暴露业务接口,服务间可以相互调用
  • 自治:团队独立、技术独立、数据独立、部署独立
  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联失败

    1.3 服务拆分注意事项

  • 不同微服务,不要重复开发相同业务
  • 微服务数据库独立,不要访问其它微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

    1.4 微服务远程调用

    使用RestTemplate,Bean的注入只能写到配置类中,@SpringBootApplication本身也是配置类。RestTemplate是Spring-web中的类,前提有Spring。也可以手写get、post请求,用java的URL类。
    @Bean
    public RestTemplate restTemplate(){
         
         
      return new RestTemplate();
    }
    
    //第一个参数请求地址,第二个参数返回值类型的class
    restTemplate.getForObject();
    //第一个参数请求地址,第二个参数requestBody,第三个参数返回值类型的class
    restTemplate.postForObject();
    
  • 服务提供者:一次业务中,被其他微服务调用的业务。
  • 服务消费者:一次业务中,调用其他微服务的服务。
  • 服务消费者和提供者是相对的,既可以是消费者,也可以是服务者。

    2 注册中心Eureka

  • 解决的问题:当服务的提供者有很多时的情况,服务多实例,服务集群的情况。就不能写死请求地址了。如果有过个服务提供者,消费者该如何选择?消费者如何得知服务提供者的健康状态?
  • Eureka-server注册中心负责记录和管理微服务。微服务在启动时,会将自己的信息注册给Eureka-service,例如ip、端口等,并且有心跳监控(每隔30s更新一次)。服务的消费者向Eureka拉取服务信息。
  • 负载均衡注解@LoadBalancedSpringCloud-common中的注解,轮循负载均衡、随机负载均衡
      @Bean
      @LoadBalanced //负载均衡
      public RestTemplate getRestTemplate(){
         
         
          return new RestTemplate();
      }
    

    3 Ribbon负载均衡

  • 规则接口是IRule,默认实现ZoneAvoidanceRule,根据zone(地区,上海或北京)选择服务列表,然后轮循。
  • 轮循机制:轮流调用
  • 随机机制:随机调用
  • 懒加载:默认懒加载,第一次访问时才会去创建LoadBalanceClient,请求时间很长。
  • 饥饿加载:会在项目启动时创建,降低第一次访问的耗时。开启姐加载指定微服务名称。

    4 Nacos注册中心

  • 相对于Eureka更强大,不仅有Service registration and discovery(服务的注册和发现)功能,还有Distributed Configuration分布式配置等功能。

    4.1 Nacos的使用

  • 第一步 父级工程中引入依赖

      <!-- SpringCloud 微服务 -->
      <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-dependencies</artifactId>
           <version>${spring-cloud.version}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
    
       <!-- SpringCloud Alibaba 微服务 nacos的管理依赖 -->
       <dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-alibaba-dependencies</artifactId>
           <version>${spring-cloud-alibaba.version}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
    
  • 第二步 添加nacos的客户端依赖
    <!-- SpringCloud Alibaba Nacos -->
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          </dependency>
    
  • 第三部 修改yml配置文件
# Spring
spring: 
  application:
    # 应用名称
    name: test-demo
  profiles:
    # 环境配置
    active: dev
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: localhost:8848 #nacos服务地址

4.2 Nacos服务分级储存模型

  • 一级:是服务,例如:提供用户功能的user-service
  • 二级:是集群,以机房划分集群,例如:杭州集群、上海集群
  • 三级:是实例,例如:端口为8080的user-service微服务
    服务跨集群调用问题:尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其它集群

    4.3Nacos服务集群属性配置

  • 修改yml配置文件
    # Spring
    spring:
    cloud:
      nacos:
        discovery:
          cluster-name: SH #配置集群名 机房位置:上海地区
    

    4.4 Nacos根据集群负载均衡

    当本地集群有问题时,访问其它地区访问。
    test-demo:
    ribbon:
      NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #默认随机访问本地区集群
    

    4.5 Nacos根据权重负载均衡

  • 实际部署中会出现这样的场景:服务器设备性能有差异,部分实例所在及其性能较好,另外一些老的机器性能较差,我们希望性能好的机器承担更多的业务量,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
    在这里插入图片描述
  • 权重值在0-1之间,只能是小数,权重设置为0时,则不会被访问!在服务升级时可以做到平滑升级!

    4.6 Nacos环境隔离-namespace

  • Nacos中服务储存和数据储存的外层都是一个名为namespace的东西,用来做最外层隔离,依次是:namespace>group>Service/Data>cluster>instance
  • 每个namespace都有唯一id,不同namespace下的服务不可见,不能访问
  • 第一步 新建命名空间
    在这里插入图片描述
  • 第二步 yml配置文件
    # Spring
    spring:
    cloud:
      nacos:
        discovery:
          namespace: 12345678-1234-1234-5634681 #填写命名空间的id
    

    4.7 Nacos设置临时实例和非临时实例

  • 临时实例:和Eureka一样采用心跳监测,隔一段时间向nacos注册中心发送一次信息,告诉nacos还在不在。
  • 非临时实例:由nacos注册中心主动询问服务提供者,是否还健康。
  • 通过yml文件配置
    spring:
    cloud:
      nacos:
        discovery:
          ephemeral: true # 默认为临时实例,系统上线后,可以设置为非临时实例
    
  • 服务消费者端:Eureka通过定时拉取服务pull,然后缓存服务列表,nacos则主动推送变更消息,来修改服务列表。

    5 Nacos配置管理

  • 读取nacos的配置管理结合本地的配置结合使用。
  • 当nacos配置管理服务发生改变后,会主动通知微服务,配置修改了,并实现热部署,不用重启,自动生效。

    5.1 实现配置管理

    在这里插入图片描述

    5.2微服务读取Nacos配置

  • 第一步 引入依赖
    <!-- SpringCloud Alibaba Nacos Config -->
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
          </dependency>
    
  • 第二步 新建bootstrap.yml文件,bootstrap.yml引导文件优先级高于application.yml
    # Spring
    spring:
    application:
      # 应用名称
      name: test-demo
    profiles:
      # 环境配置
      active: dev
    cloud:
      nacos:
        config:
          # 配置中心地址
          server-addr: 127.0.0.1:8848
          # 配置文件格式
          file-extension: yml
    

    5.3 配置热更新

  • 方式一:在@Value注解所在的类添加注解@RefreshScope

  • 方式二:在@ConfigurationProperties(prefix = "sd")自动实现刷新,不需要@RefreshScope

    5.4 配置共享

  • 微服务启动时会从nacos读取多个配置文件,其中test.yaml文件一定会加载,因此可以将共享配置写入这个文件。
    在这里插入图片描述
  • 多种配置的优先级:nacos中的配置(服务名-rpofile.yml>服务名称.yml)>本地配置

    6 Nacos集群搭建

  • 一、配置每个nacos集群ip
    #it is ip
    #example
    192.168.16.101:8080
    192.168.16.102:8081
    192.168.16.103:8082
    
  • 二、配置数据库信息和端口号
    server.port=8848
    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user=root
    db.password=yuan159951.
    
  • 三、启动startup.cmd默认集群启动,startup.cmd -m standalone单机版。
  • 四、Nginx反向代理
upstream nacos-cluster{
   
   
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}
server {
   
   
        # 前台接口
        listen       80;
        server_name  localhost;

        location /nacos {
   
   
            proxy_pass http://nacos-cluster;
        }
}
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
存储 人工智能 Serverless
微服务和 Serverless 架构-函数计算 FC 简介及应用场景
微服务和 Serverless 架构-函数计算 FC 简介及应用场景
微服务和 Serverless 架构-函数计算 FC 简介及应用场景
|
11月前
|
监控 负载均衡 测试技术
服务网格简介:探索现代微服务架构中的服务网格概念和价值
服务网格简介:探索现代微服务架构中的服务网格概念和价值
267 0
|
3月前
|
存储 搜索推荐 Java
微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门
微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门
56 2
|
3月前
|
存储 消息中间件 数据库
分布式系统详解--架构简介(微服务)
分布式系统详解--架构简介(微服务)
60 0
|
10月前
|
存储 安全 API
微服务技术系列教程(40)- SpringCloud -OAuth2简介&原理
微服务技术系列教程(40)- SpringCloud -OAuth2简介&原理
48 0
|
10月前
|
安全 Java 数据安全/隐私保护
微服务技术系列教程(37)- SpringBoot -SpringSecurity简介
微服务技术系列教程(37)- SpringBoot -SpringSecurity简介
63 0
|
10月前
|
消息中间件 JSON Java
微服务技术系列教程(33) - SpringCloud-消息驱动简介&原理
微服务技术系列教程(33) - SpringCloud-消息驱动简介&原理
50 0
|
10月前
|
Dubbo Java 应用服务中间件
微服务技术系列教程(16) - SpringCloud -简介
微服务技术系列教程(16) - SpringCloud -简介
65 0
|
4月前
|
Java API 数据库
微服务简介
微服务简介
46 6
|
Dubbo Java 应用服务中间件
SpringCloud微服务简介
SpringCloud微服务简介
117 1