微服务学习笔记
自学视频链接(来自黑马程序员)
https://www.bilibili.com/video/BV1LQ4y127n4?p=1&vd_source=1eae188552dd1929705e7c63a395fb86
认识微服务
单体架构
单体架构:将业务的所有功能集中在一个项目中开发,打包成一个包部署
优点:架构简单、部署成本低
缺点:耦合度高
分布式架构
分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务
优点:降低服务耦合、有利于服务升级拓展
微服务:是一种经过良好架构设计的分布式架构方案,微服务架构特征
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发。
面向服务:微服务对外暴露业务接口
自治:团队独立、技术独立、数据独立、部署独立
隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
总结
单体架构的特点
简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统。
分布式架构特点
松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目。例如:京东,淘宝。
微服务:一种良好的分布式架构方案
优点:拆分粒度更小、服务更独立、耦合度更低
缺点:架构非常复杂,运维、监控、部署难度提高
微服务结构
SpringCloud+Feign:使用SpringCloud技术栈。服务接口采用Restful风格。服务调用采用Feign方式。
SpringCloud
服务拆分注意事项
- 不同微服务,不要重复开发相同业务。
- 微服务数据独立,不要访问其他微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其他微服务使用。
Eureka注册中心
@LoanBalanced //负载均衡
1.搭建EurekaServer
- 引入eureka-server依赖
- 添加@EnableEurekaServer注解
- 在application.yml中配置eureka地址
2.服务注册
- 引入eureka-client依赖
- 在application.yml中配置eureka地址
3.服务发现
- 引入eureka-client依赖
- 在application.yml中配置eureka地址
- 给RestTemplate添加@LoanBalanced注解
- 用服务提供者的服务名称远程调用
Ribbon负载均衡
负载均衡策略:轮询和随机
通过定义IRule实现可以修改负载均衡规则,有两种方式:
1.代码方式;2.配置文件方式。
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enable:true # 开启饥饿加载
client:userservice # 指定对userservice这个服务饥饿加载
Nacos注册中心
1.Nacos服务搭建
- 下载安装包
- 解压
- 在bin目录下运行指令:startup.cmd -m standalone
2.Nacos注册和发现
1.引入nacos.discovery依赖
2.配置nacos地址spring.cloud.nacos.server-addr
Nacos服务分级存储模型
Nacos的分级存储模型
1.服务,例如userService
2.集群,例如上海和杭州
3.实例,例如杭州机房的某台部署啦userService的服务器
如何设置实例的集群属性
1.修改yml文件,添加spring.cloud.nacos.discovery.cluster-name属性即可。
根据权重负载均衡
环境隔离-namespace
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西用来做最外层隔离。
Nacos和Eureka的比较
Nacos和Eureka的共同点
1都支持服务注册和服务拉取
2都支持服务提供者心跳方式做健康监测
区别
1Nacos支持服务端主动监测提供者状态:临时实例采用心跳模式,非临时实例采用主动监测模式
2临时实例心跳不正常会被剔除,非临时实例则不会被剔除
3Nacos支持服务列表变更的消息推送模式,服务列表更新更及时。
4Nacos集群默认采用AP方式,当集群存在非临时实例时,采用CP模式;Eureka采取AP模式
Nacos配置管理
统一配置管理
1.引入Nacos的配置管理客户端依赖。
2.在userService中的resource,目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml
配置自动刷新
@RefreshScope
// 1.通过@Value注解注入,结合@RefreshScope来刷新
@ConfigurationProperties
// 2.通过@ConfigurationProperties注入,自动刷新
多环境配置共享
多种配置的优先级:服务名-profile.yaml > 服务名称.yaml > 本地配置
Nacos集群搭建
Nginx反向代理
http客户端Feign
Feign的介绍
Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
定义和使用Feign客户端
1.添加openfeign的依赖
2.添加@EnableFeignClients注解
3.编写FeignClient接口
4.使用FeignClient中定义的方法代替RestTemplate
自定义Feign的配置
Feign的性能优化
Feign底层的客户端实现:
- URLconnection:默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp:支持连接池
因此优化Feign的性能主要包括:
- 使用连接池代替默认的URLconnection
- 日志级别,最好用basic或none
Feign的最佳实践
- 让Controller和feignClient继承同一接口
- 将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供所有消费者使用。
统一网关Gateway
网关功能:
- 身份认证和权限校验
- 服务路由、负载均衡
- 请求限流
搭建网关服务
1.创建新的module,引入SpringCloudGateway的依赖和nacos服务发现依赖
2.编写路由配置及nacos地址
路由断言工厂
PredicateFactory的作用是什么
读取用户定义的断言条件,对请求做出判断。
路由过滤器
GatewayFilter是网关中提供的一个过滤器,可以对进入网关的请求和微服务返回的响应做处理。
跨域问题处理
跨域:域名不一致就是跨域。
跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被拦截器拦截的问题
解决方案:CORS
spring:
cloud:
gateway:
globalcors: #全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截的问题
corsConfigurations:
'[/**]': # 拦截一切请求
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:8089"
- "http://www.leyou.com"
allowedMethods: # 允许跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" #允许在请求中携带的头信息
allowedCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域的检测有效期
Docker
快速交付应用、运行应用的技术
Docker如何解决依赖的兼容问题?
- 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包,形成可移植镜像
- 将每个应用放到一个隔离容器去运行,避免互相干扰
Docker如何解决不同系统环境的问题
- Docker将用户程序所需要调用的系统函数库一起打包
- Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行
Docker与虚拟机
- docker是一个系统进程;虚拟机是在操作系统中的操作系统
- docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般。
镜像和容器
- 镜像:docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像
- 容器:镜像中的应用程序运行后形成的进程就是容器,只是docker会给容器做隔离,对外不可见
Docker架构
Docker是一个CS架构的程序,由两部分组成:
- 服务端:接受命令或远程请求,操作镜像或容器
- 客户端:发送命令或请求到Docker服务端
DockerHub
一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为DockerRegistry
Docker基本操作
数据卷
容器与数据耦合的问题
- 不便于修改:当我们需要Nginx的html内容时,需要进入容器内部修改,很不方便
- 数据不可复用:在容器内的修改对外是不可见的,所有修改对新创建的容器是不可复用的。
- 升级维护困难:数据在容器内,如果升级必然删除旧容器,所有数据都跟着删除啦
数据卷
数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录。
数据卷的操作
- docker volume create
- docker volume ls
- docker volume inspect
- docker volume rm
- docker volume prune
挂载数据卷
自定义镜像
镜像是一个分层结构,每一层称为一个Layer
- BaseImage层:包含基础的系统函数库、环境变量、文件系统
- Entrypoint层:入口,是镜像中应用启动的命令
Dockerfile
DockerCompose
- DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器
- Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行
version:"3.8"
services:
mysql:
image:mysql:5.7.25
environment:
mysql_root_password:123
volumes:
- /tmp/mysql/data:/var/lib/lib/mysql
- /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf
web:
build:.
ports:
-8090:8090