一、认识微服务
1、单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
优点:
- 架构简单
- 部署成本低
缺点:
- 耦合度高
2、分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。
优点:
- 降低服务耦合
- 有利于服务升级拓展
缺点:
- 架构复杂,难度大
3、微服务(高内聚、低耦合)
微服务是一种经过良好架构设计的分布式架构设计方案,微服务架构特征:
- 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立、技术独立、数据独立、部署独立
4、微服务技术对比
二、服务拆分及远程调用
服务拆分:
1、微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同业务
2、微服务可以将业务暴露为接口,供其它微服务使用
3、不同微服务都应该有自己独立的数据库
服务调用:
- 基于RestTemplate发起的http请求实现远程调用
步骤:
1、注册RestTemplate
2、服务远程调用RestTemplate
三、Ribbon负载均衡
1、负载均衡流程
2、负载均衡策略
通过定义IRule实现可以修改负载均衡规则,有两种方式:
1、代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:(全局)
2、配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:(只针对指定的微服务)
饥饿加载
Ribbon默认采用的是懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
四、nacos注册中心
1、Nacos服务搭建
①下载安装包
②解压
③在bin目录下运行指令:startup.cmd -m standalone
2、Nacos服务注册或发现
①在cloud-demo父工程中添加spring-cloud-alibaba的管理依赖
②添加nacos的客户端依赖
③配置nacos地址
在user-service&order-service中的aplication.yml文件,添加nacos地址:
④、启动并测试
3、Nacos服务分级存储模型
3.1、概念
①一级是服务,例如:userservice
②二级是集群,例如杭州或上海
③三级是实例,例如杭州机房的某台部署了userservice的服务器
3.2、如何设置实例的集群属性
①修改application.yml文件,添加如下内容:
②在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务:
NacosRule负载均衡策略:
优先选择同集群服务实例列表,本地集群找不到提供者,才会去其它集群寻找,并且会报警告,确定了可用实例列表后,再采用随机负载均衡挑选实例。
4、实例的权重控制
①Nacos控制台可以设置实例的权重值,0 ~ 1之间
②同集群内的多个实例,权重越高被访问的频率越高
③权重设置为0则完全不会被访问
用途:可以根据服务器的性能调整访问的权重、实现服务升级时的灰度发布
5、nacos环境隔离
在nacos上创建一个命名空间,然后修改order-service的application.yml,添加namespace:
①namespace用来做环境隔离
②每个namespace都有唯一id
③不同namespace下的服务不可见
面试题:Nacos和Eureka区别:
五、Nacos配置管理
1、nacos可以实现配置更改热更新
2、将配置交给Nacos管理的步骤
配置获取流程:
①在Nacos中添加配置文件
②在微服务中引入nacos的config依赖
③在微服务中添加bootstrap.yml文件,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个配置文件。(这个文件是引导文件,优先级高于application.yml)
3、配置热更新
- 方式一:通过@Value注解注入,结合@RefreshScope来刷新
在@Value注入的变量所在类上添加注解@RefreshScope
- 方式二:通过@ConfigurationProperties注入,自动刷新
注意事项:不是所有的配置都适合放到配置中心,维护起来会比较麻烦。建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置。
4、多环境配置共享
① [服务名]-[spring.profile.active].yaml,环境配置
② [服务名].yaml,默认配置,多环境共享
优先级:
5、Nacos集群搭建
集群搭建步骤:
① 搭建MySQL集群并初始化数据库表
②下载解压nacos
③ 修改集群配置(节点信息)、数据库配置
④ 分别启动多个nacos节点
⑤ nginx反向代理
六、http客户端Feign
Feign的使用步骤
①引入依赖
②添加@EnableFeignClients注解
③编写FeignClient接口
④使用FeignClient中定义的方法代替RestTemplate
七、统一网关Gateway
为什么需要网关?
网关功能:
- 身份认证和权限校验
- 服务路由、负载均衡
- 请求限流
1、搭建网关的步骤:
①、创建新的moudle,引入SpringCloudGateway的依赖和nacos的服务发现依赖:
②、编写路由配置及nacos地址
2、路由断言工厂(Route Predicate Factory)
作用:读取用户定义的断言条件,对请求做出判断
Spring提供了11种基本的Predicate工厂
3、路由过滤器GatewayFilter
作用:
- 对路由的请求或响应做加工处理,比如添加请求头
- 配置在路由下的过滤器只对当前路由的请求生效,而defaultFilters对所有路由都生效
spring提供了31种不同的路由过滤器工厂
4、全局过滤器
作用:对所有路由都生效的过滤器,并且可以自定义处理逻辑
实现全局过滤器的步骤
① 实现GlobalFilter接口
② 添加@Order注解或实现Ordered接口
③ 编写处理逻辑
例:自定义过滤器
需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
- 参数中是否有 authorization
- authorization参数值是否为 admin
如果满足则放行,否则拦截
5、过滤器执行顺序
- 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序就越靠前
- GlobalFilter通过实现Ordered接口,或者通过@Order注解来指定order值,由我们自己指定
- 路由过滤器和defaultFilter的order由spring指定,默认是按照声明顺序从1递增
- 当过滤器的order值一样时,会按照defaultFilter > 路由过滤器 > GlobalFilter的顺序执行
6、跨域问题处理
跨域:请求的协议、ip地址、端口号中有一个不同都会受到浏览器同源策略的限制。
跨域问题:浏览器禁止请求的发起者与服务器端发生跨域ajax请求,请求被浏览器拦截的问题
网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现: