原理图

微服务架构

1652775645(1).png

Eureka

1653220689(1).png

Ribbon Load Balance

1653220621(1).png
1653221725(1).png

负载均衡策略

image.png
1653221675(1).png
1653222001.png

Eager-load

1653222494(1).png

Nacos注册中心

Nacos多级存储模型

1653269606(1).png

NacosRule负载均衡策略

1653270618(1).png
1653270576(1).png


环境隔离

1653272694(1).png
1653272756(1).png


服务健康状态监控

1653273077(1).png
与eureka对比:

  • 服务拉取
    • nacos采用pull+主动push(服务健康状态发生变化时),服务列表时效性更好
    • eureka 采用pull
  • 健康监控
    • nacos将实例分为临时实例(default)和非临时实例
      • 临时实例:与eureka一样采用心跳监测
      • 非临时实例:nacos主动询问,即便服务挂了,也不会从服务列表剔除,而是等待服务恢复

Nacos配置中心

  • 背景:在上千台服务器的 服务集群 背景下,如果要修改某个服务的配置,就要相应的重启 该服务对应的实例,这在生产环境下是不可接收的。
  • 解决:需要一个 配置中心 实现统一管理、配置热更新

1653275017(1).png

从nacos读取配置

1653275347(1).png
1653275289(1).png
1653275553(1).png

配置热更新

1653276231(1).png

多环境配置共享

1653279483(1).png

  • [spring.application.name].yaml为共享配置文件,需要热更新的共享配置可以写在这个 针对服务所有实例的全局配置文件

Feign

1653281651(1).png

性能优化

1653284044(1).png
image.png

最佳实践

:::danger 方式一:给(调用者)feign客户端和服务提供者controller提供统一接口 ::: 1653284653(1).png

会造成紧耦合!!!!

:::danger 方式二:抽取(松耦合 ::: 1653288631(1).png
1653289401(1).png

问题:把FeignClient抽取之后,其他服务引依赖,但没有加入IOC容器,因此无法注入。 解决:在启动类的@EnableFeignClients注解中指定FeignClient所在的包或者类


网关

网关组件主流用的是 SpringCloudGateway

作用

  1. **身份验证****权限校验**
  2. **服务路由****负载均衡**
  3. **请求限流**

    网关服务的搭建

  4. 网关本身也是服务引入nacos依赖(注册&配置) 和 SpringCloudGateway依赖

1653470119(1).png

  1. 服务注册发现,服务路由
    1. spring:
    2. application:
    3. name: gateway
    4. cloud:
    5. nacos:
    6. server-addr: nacos:8848 # nacos地址
    7. gateway:
    8. routes:
    9. - id: user-service # 路由标示,必须唯一
    10. uri: lb://userservice # 路由的目标地址
    11. predicates: # 路由断言,判断请求是否符合规则
    12. - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
    13. - id: order-service
    14. uri: lb://orderservice
    15. predicates:
    16. - Path=/order/**
    17. default-filters:
    18. - AddRequestHeader=Truth,Itcast is freaking awesome!
    :::warning 路由断言 (route predicates): 以gateway.routes.predicates.***为格式,有多种不同路由规则。
    gateway.routes.predicates.**Path** :路径断言
    gateway.routes.predicates.**After**:xxx时间后的请求可以被路由。 :::

    网关服务原理图

    1653474280(1).png

    网关过滤器链1653476129(1).png

    过滤器链执行顺序

    1653479905.png
    1. spring:
    2. gateway:
    3. routes:
    4. - id:
    5. uri:
    6. predicates:
    7. - Path=/user/**
    8. filters:
    9. -xxx
    10. -xxx
    11. default-filters:
    12. -AddRequestHeader=Truth,Itcast is freaking awesome! #默认过滤器,对所有请求生效

    自定义网关过滤器

    1653479372(1).png

CORS跨域配置

Web协议(二)
1653480799(1).png


Docker

简介

image.png

容器的定义:容器是为了解决“在切换运行环境时,如何保证软件能够正常运行”这一问题。

1653485455(1).png
1653485631(1).png

Docker与虚拟机

1653486388(1).png

  • VM需要Hypervisor处理,性能差,体积大(内部有一个操作系统),启动慢(分钟级)
  • Docker内部有完整的 **OS**函数库,可以跑在任何以 linux 为内核的操作系统上
  • **Docker** 是一个系统进程

镜像和容器

image.png

  • 镜像 本质是一组打包好的文件。
  • 镜像 只读
  • 容器 具有独立的 CPU资源,内存资源 甚至文件系统,那么在容器中运行的进程就会认为自己是该计算机上运行的唯一进程

    Docker and DockerHub
  • DockerHub 是一个容器镜像托管平台 ,这样的平台称为 DockerRegistry。

    Docker架构

    image.png

    Install

    ======点击链接查看安装教程=======


基本操作

镜像

image.png
image.png

  1. [root@VM-xavier-CentOS7 yum.repos.d]# docker pull nginx #这里没有指定tag所以默认是lateset
  2. [root@VM-xavier-CentOS7 yum.repos.d]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. nginx latest 0e901e68141f 12 days ago 142MB

容器

1654762386140.png
image.png

Volume数据卷

image.png

类似 Vue中的 v-model双向绑定

默认创建在 **/var/lib/docker/volumes/ 目录下**

image.png

DockerFile自定义镜像

  • 镜像的组成

镜像是将**应用程序**及其所需要的**系统函数库****环境****配置****依赖**打包在一起形成的image。

  • 顺序:镜像的构建是有顺序的,**系统函数库**->**环境(变量)**->**依赖**->**应用程序**->**配置** -> **启动**
  • 分层结构:
    • image.png
    • image.png ```dockerfile

      指定基础镜像 ,实际上可以选择更方便的镜像(更完善的基础镜像)

      FROM ubuntu:16.04

      配置环境变量,JDK安装目录

      ENV JAVA_DIR = /usr/local

拷贝JDK和Java项目的包

COPY ./jdk8.tar.gz $JAVA_DIR/ COPY <本地文件路径> <容器文件路径>

解压 JDK

RUN cd …. && tar -zxvf …

配置J环境变量

ENV JAVA_HOME=$JAVA_DIR/java8 ENV PATH=$PATH:$JAVA_HOME/bin

暴露端口,可选。

EXPOSE 8080

入口 启动容器

ENTRYPOINT java -jar <项目文件>

  1. ```shell
  2. Docker build --help

Docker Compose

基于 Compose文件快速部署分布式应用(集群),无需手动一个个运行容器
image.png

mysql,web….. 容器名 —name
environment -e 环境配置
image [image] 镜像名称
volumes -v 挂载
build build 构建镜像,并启动容器

对比发现,Docker Compose文件是把Docer run命令中的各种参数转换为.yaml的配置文件格式


Docker Registry私服

UI界面私服搭建:

  1. **registry**+**ui**镜像,用 **Compose**文件来部署,其中 **ui** 需要依赖 **registry**
  2. 假设上面的 **ui** 服务用的是8080端口,那么需要修改Docker配置,信任来自8080的 **registry**
  3. push的时候,需要用 **Docker tag old_tag new_tag** 重命名为 **new_tag : repoIP/realTag**

Message Queue消息队列

简介

**MQ** 三大优点:

  1. **异步** 吞吐量提高。
  2. **解耦** 服务间代码耦合低。
  3. **削峰** 提高并发 。

image.png

缺点:

  1. 依赖于Broker可靠性、吞吐能力、安全性
  2. 业务没有明显的流程线,追踪管理困难

RabbitMQ

image.png

  • **Virtual Host** :每个**user** 有自己的 virtual host(多用户模式),virtual host之间逻辑隔离。
  • **Exchange**:路由消息到队列。
  • **Queue**:缓存消息,供消费者消费。