1.介绍
什么是微服务?
微服务技术不等于spring cloud
微服务技术是将一个复杂的项目抽成一个一个小的项目(比如超市系统里面可以把用户管理和订单管理分开做成不一样的项目,然后他们之间通过http协议沟通)抽成小项目时之间的沟通和记录、排查、发版等问题需要解决,因此这才是完整的微服务技术


2.认识微服务
2.1微服务演变
单体架构
单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署
优点:
缺点:
分布式架构
分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务
优点:
- 降低服务耦合
- 有利于服务升级扩展
服务治理
分布式架构的问题:
- 服务拆分粒度如何?
- 服务集群地址如何维护?
- 服务之间如何实现远程调用?
- 服务健康状态如何感知?
微服务
微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:
- 单一职责:微服务拆分粒度更小,每个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立、技术独立、数据独立(独立的数据库)、部署独立
- 隔离性强:服务调用做好隔离、容错、降级、避免出现级联问题
微服务结构
微服务结构需要技术框架来落地,经典:springcloud、springcloudalibaba、dubbo
微服务技术对比


2.2 springcloud

2.3 服务拆分及远程调用
服务拆分注意事项




1.微服务调用方式
- •基于RestTemplate发起的http请求实现远程调用
- http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。
提供者和消费者
- 服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
- 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
- 提供者与消费者角色其实是相对的
- 一个服务可以同时是服务提供者和服务消费者
3.Nacos注册中心

根据nacos安装指南进行安装使用即可



nacos服务分级存储模型







根据权重负载均衡
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高

1.实例的权重控制
①Nacos控制台可以设置实例的权重值,0~1之间
②同集群内的多个实例,权重越高被访问的频率越高
③权重设置为0则完全不会被访问
环境隔离-namespace






1.Nacos环境隔离
①每个namespace都有唯一id
②服务设置namespace时要写id而不是名称
③不同namespace下的服务互相不可见
nacos注册中心细节分析

定时拉取服务:列表会每隔30秒更新一次
主动推送:当nacos发现部分提供者不可用时,会主动告诉给消费者


1.Nacos与eureka的共同点
①都支持服务注册和服务拉取
②都支持服务提供者心跳方式做健康检测
2.Nacos与Eureka的区别
①Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
②临时实例心跳不正常会被剔除,非临时实例则不会被剔除
③Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
④Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
4. Nacos配置管理
统一配置管理
- 配置更改热更新


在弹出表单中填写配置信息:

boostrap.yml比application的优先级要高



将配置交给Nacos管理的步骤
①在Nacos中添加配置文件
②在微服务中引入nacos的config依赖
③在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件
配置自动更新(热更新)


Nacos配置更改后,微服务可以实现热更新,方式:
注意事项:
- 不是所有的配置都适合放到配置中心,维护起来比较麻烦
- 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置
多环境配置共享


微服务会从nacos读取的配置文件:
优先级:
以上是同一个nacos环境下可以分成不同服务环境配置设置方法
多服务共享配置
由于spring.application.name.yml这个文件是一定会被加载的,因此多环境共享配置可以写入这个文件



微服务默认读取的配置文件:
不同微服务共享的配置文件:
优先级:
nacos集群搭建

1. 修改application.properties文件,添加数据库配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?
characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=
true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123
2. 复制多个nacos,设置端口为8845、8846、8847并启动nacos
3. 修改nginx的配置文件为
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}
server {
listen 80;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
而后在浏览器访问:http://localhost/nacos即可。
4. 新增配置文件

5.查看上面设置的数据库的表config_info


http客户端feign






自定义配置




feign的性能优化
Feign底层的客户端实现:
- URLConnection:默认实现,不支持连接池,性能较差
- Apache HttpClient :支持连接池
- OKHttp:支持连接池 多人使用
因此优化Feign的性能主要包括:



feign的最佳实践

一般不推荐
1. 紧耦合
2. 父接口参数列表映射不会被继承
抽成一个独立的包


统一网关Gateway



搭建网关服务的步骤

网关也是微服务之一,也是需要注册到nacos的
2.编写路由配置及nacos地址

断言是布尔表达式,表达是否不是


路由断言工厂Route Predicate Factory

- 我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
- 例如Path=/user/**是按照路径匹配,这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理 的
- 像这样的断言工厂在SpringCloudGateway还有十几个

官网上有详细说明

路由过滤器 GatewayFilter
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:





全局过滤器 GlobalFilter
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。
区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。
定义方式是实现GlobalFilter接口。




过滤器执行顺序


跨域问题处理
跨域:域名不一致就是跨域,主要包括:
l域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com
l域名相同,端口不同:localhost:8080和localhost8081
跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
解决方案:CORS
网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现:




