原理图
微服务架构
Eureka
Ribbon Load Balance
负载均衡策略
Eager-load
Nacos注册中心
Nacos多级存储模型
NacosRule负载均衡策略
环境隔离
服务健康状态监控
与eureka对比:
- 服务拉取:
- nacos采用pull+主动push(服务健康状态发生变化时),服务列表时效性更好
- eureka 采用pull
- 健康监控:
- nacos将实例分为临时实例(default)和非临时实例
- 临时实例:与eureka一样采用心跳监测
- 非临时实例:nacos主动询问,即便服务挂了,也不会从服务列表剔除,而是等待服务恢复
- nacos将实例分为临时实例(default)和非临时实例
Nacos配置中心
- 背景:在上千台服务器的 服务集群 背景下,如果要修改某个服务的配置,就要相应的重启 该服务对应的实例,这在生产环境下是不可接收的。
- 解决:需要一个 配置中心 实现统一管理、配置热更新
从nacos读取配置
配置热更新
多环境配置共享
- [spring.application.name].yaml为共享配置文件,需要热更新的共享配置可以写在这个 针对服务所有实例的全局配置文件
Feign
性能优化
最佳实践
:::danger 方式一:给(调用者)feign客户端和服务提供者controller提供统一接口 :::
会造成紧耦合!!!!
:::danger
方式二:抽取(松耦合
:::
问题:把FeignClient抽取之后,其他服务引依赖,但没有加入IOC容器,因此无法注入。 解决:在启动类的@EnableFeignClients注解中指定FeignClient所在的包或者类
网关
网关组件主流用的是 SpringCloudGateway 。
作用
- 服务注册发现,服务路由
:::warning 路由断言 (route predicates): 以spring:
application:
name: gateway
cloud:
nacos:
server-addr: nacos:8848 # nacos地址
gateway:
routes:
- id: user-service # 路由标示,必须唯一
uri: lb://userservice # 路由的目标地址
predicates: # 路由断言,判断请求是否符合规则
- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
default-filters:
- AddRequestHeader=Truth,Itcast is freaking awesome!
gateway.routes.predicates.***
为格式,有多种不同路由规则。gateway.routes.predicates.**Path**
:路径断言gateway.routes.predicates.**After**
:xxx时间后的请求可以被路由。 :::网关服务原理图
网关过滤器链
过滤器链执行顺序
spring:
gateway:
routes:
- id:
uri:
predicates:
- Path=/user/**
filters:
-xxx
-xxx
default-filters:
-AddRequestHeader=Truth,Itcast is freaking awesome! #默认过滤器,对所有请求生效
自定义网关过滤器
CORS跨域配置
Docker
简介
容器的定义:容器是为了解决“在切换运行环境时,如何保证软件能够正常运行”这一问题。
Docker与虚拟机
VM
需要Hypervisor
处理,性能差,体积大(内部有一个操作系统),启动慢(分钟级)Docker
内部有完整的**OS**
函数库,可以跑在任何以linux
为内核的操作系统上**Docker**
是一个系统进程
镜像和容器
- 镜像 本质是一组打包好的文件。
- 镜像 只读
容器 具有独立的 CPU资源,内存资源 甚至文件系统,那么在容器中运行的进程就会认为自己是该计算机上运行的唯一进程
Docker and DockerHub
DockerHub 是一个容器镜像托管平台 ,这样的平台称为 DockerRegistry。
Docker架构
Install
======点击链接查看安装教程=======
基本操作
镜像
[root@VM-xavier-CentOS7 yum.repos.d]# docker pull nginx #这里没有指定tag所以默认是lateset
[root@VM-xavier-CentOS7 yum.repos.d]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 12 days ago 142MB
容器
Volume数据卷
类似
Vue
中的v-model
双向绑定默认创建在
**/var/lib/docker/volumes/ 目录下**
DockerFile自定义镜像
- 镜像的组成
镜像
是将**应用程序**
及其所需要的**系统函数库**
、**环境**
、**配置**
、**依赖**
打包在一起形成的image。
- 顺序:镜像的构建是有顺序的,
**系统函数库**
->**环境(变量)**
->**依赖**
->**应用程序**
->**配置**
->**启动**
- 分层结构:
拷贝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 <项目文件>
```shell
Docker build --help
Docker Compose
基于 Compose
文件快速部署分布式应用(集群),无需手动一个个运行容器
mysql,web….. | 容器名 —name |
---|---|
environment | -e 环境配置 |
image | [image] 镜像名称 |
volumes | -v 挂载 |
build | build 构建镜像,并启动容器 |
对比发现,Docker Compose文件是把Docer run命令中的各种参数转换为
.yaml
的配置文件格式
Docker Registry私服
UI界面私服搭建:
- 用
**registry**
+**ui**
镜像,用**Compose**
文件来部署,其中**ui**
需要依赖**registry**
。 - 假设上面的
**ui**
服务用的是8080端口,那么需要修改Docker配置,信任来自8080的**registry**
- 在
push
的时候,需要用**Docker tag old_tag new_tag**
重命名为**new_tag : repoIP/realTag**
。
Message Queue消息队列
简介
**MQ**
三大优点:
**异步**
吞吐量提高。**解耦**
服务间代码耦合低。**削峰**
提高并发 。
缺点:
- 依赖于Broker可靠性、吞吐能力、安全性
- 业务没有明显的流程线,追踪管理困难
RabbitMQ
**Virtual Host**
:每个**user**
有自己的virtual host
(多用户模式),virtual host
之间逻辑隔离。**Exchange**
:路由消息到队列。**Queue**
:缓存消息,供消费者消费。