1. 概念
1.1 了解什么是微服务
1.1.1 微服务概念
微服务(Microservices)是一种架构风格,一个大型复杂的项目,可以由多个微服务组成。 项目中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注完成自己的业务
1.1.2 架构特点
- 每个服务都有单一的业务职责
- 每个服务都要相对”独立”
- 每个服务都要对外暴露Rest风格服务接口API
- 每个服务都可以是一个独立的开发团队
- 每个服务都可以是不同的技术栈
- 每个服务都访问各自的数据库
-
1.1.3 服务间的调用方式
RPC : 并发能力强, 代表框架 : dubbo
- HTTP : 更轻量, 更灵活, 代表框架 : HttpClient、UrlConnection、OkClient , Spring提供了整合: RestTemplate
1.2 SpringCloud的概念和基础架构
1.2.1 SpringCloud概述
微服务架构一站式解决方案
版本
- 以伦敦地铁站命名规则
- springboot 2.3.x
- Hoxton
1.2.2 核心架构
- 服务注册中心 :eureka、nacos
- 负载均衡: ribbon
- 熔断器: hystrix、sentinel
- 服务调用: feign
- API网关: gateway
-
2. 核心组件
2.1 eureka注册中心(发现,注册,状态监控)
2.1.1 基础架构
eureka-server
- eureka-client
提供者 消费者
2.1.2 微服务如何得知提供者地址?
- 提供者启动,必须立即注册自己的信息到eureka
- eureka会保存服务名称及实例ip和端口的映射关系
- 消费者去eureka根据服务名称拉取服务实例列表
2.1.3 消费者如何在多个服务中选择一个?
利用组件做负载均衡,挑选一个,Ribbon组件
2.1.4 如何感知服务故障?
- 提供者会与eureka维持一个心跳,默认30秒一次
- 超时未心跳,就认为服务宕机,就会被剔除
2.1.5 搭建Eurekaserver
1)引入eureka-server依赖
2)加注解,@EnableEurekaServer
3)编写配置,eureka地址、服务名称2.1.6 服务注册
1)引入eureka-client依赖
2)编写配置,eureka地址、服务名称2.1.7 服务发现
1)引入eureka-client依赖
2)编写配置,eureka地址、服务名称
3)给RestTemplate加@LoadBalanced注解
4)http请求时,用服务名称代替ip和端口2.2 ribbon
2.2.1 负载均衡的原理
1)请求被LoadBalancerInterceptor拦截
2)获取uri中的host,也就是服务名称
3)交给RibbonLoadBalanceClient的对象,根据服务名称获取服务列表,保存到DynamicServerListLoadBalancer
4)交给IRule,利用负载均衡规则选择一各实例
5)利用真实实例的ip和端口替换url的服务名称,发起请求2.2.2 IRule
默认的实现是ZoneAvoidanceRule,是轮询机制
2.2.3 负载均衡策略
- ZoneAvoidanceRule(默认)
- 轮询RoundRobinRule
- 随机RandomRule
- 重试机制RetryRule
- AvailabilityFilteringRule
- WeightedResponseTimeRule
-
2.2.4 饥饿加载
默认是懒加载,第一次请求时才去拉取服务列表
- 配置ribbon.egar-load.enable=true开启饥饿加载
- ribbon.egar-load.clients=userservice,指定服务名称
2.3 nacos注册中心
2.3.1 使用
搭建nacos
- 下载
- 解压
- 运行 startup.cmd -m standalone
服务注册
- 引入nacos-discovery依赖
- 编写配置,nacaos地址,服务名称
服务发现
- 引入nacos-discovery依赖
- 编写配置,nacos地址、服务名称
- 给RestTemplate加@LoadBalanced注解
- http请求时,用服务名称代替ip和端口
2.3.2 服务分级管理模型
- 服务service
- 集群cluster
- 实例, 一个服务启动多个
- NacosRule 路由时就近原则
- 优先从本集群负载均衡
- 本集群没有,再去访问其它集群
- 本集群内部采用随机负载均衡
2.3.3 权重
值的范围是0~1,权重越大,被访问的频率越高作用: 针对不同性能的服务器,分配不同的权重 把权重置为0,服务就不会被访问,无缝升级切换
2.3.4 namespace
作用:环境隔离,不同开发环境或者多租户隔离
2.3.5 nacos和eureka的区别和联系
- 联系
- 注册发现的整体流程一样,都实现SpringCloudCommon的接口
- 都基于心跳机制监测提供者的整体
- 都可以采用服务拉取来获取实例列表
- 区别
- nacos针对永久实例是采用主动访问机制,临时实例才是心跳机制
- nacos消费者可以定时拉取服务;nacos还会在服务变更时主动推送服务列表
- nacos可以是CP,也可以是AP,默认是AP
- eureka是AP模式,可用性优先
nacos配置管理
统一配置管理
在nacos添加配置
- dataID
- 配置文件名称:服务名-环境.后缀名
- group
- 分组,默认
- 类型
- yaml
- properties
- 内容
- 不是服务的所有配置,而是自定义的,经常变动的配置
配置热更新
微服务整合nacos配置
1)引入nacos-config依赖
2)配置bootstrap.yaml
nacos地址
dataID
- spring.application.name
- spring.profiles.active
- file.extenssion
- 基于@Value
- 利用@Value注入属性
- 在@Value注解所在类添加@RefreshScope注解
- 基于@ConfigurationProperties
- 准备mysql,准备数据库表
- 部署多台nacos实例,配置访问mysql
- nginx反向代理
Feign远程调用
Feign基本用法
1)引入openFeign依赖
2)在启动类加@EnableFeignClients注解
3)编写客户端接口
自定义日志配置
Logger.Level的四种级别
- NONE
- BASIC
- HEADERS
- FULL
基于bean
全局
把配置声明到@EnableFeignClients上
局部
把配置声明到@FeignClient上
性能优化
日志,最好basic、none
使用ApacheHttpClient代替默认的URLConnection
1)引依赖
2)加配置继承
让提供者的Controller和Feign的客户端都继承统一接口,统一API规范
缺点:
紧耦合
SpringMVC的注解无法继承,定义Controller时还要定义抽取
将Feign客户端、实体类、默认配置都抽取到一个项目模块中
其它服务依赖该模块即可Gateway网关
网关的作用
- gateway依赖
- nacos-discovery依赖
2)配置
- 基本配置
- nacos地址
- 服务名
路由规则
- id路由的唯一标示
- uri路由的目的地:lb://userserivce
- predicates断言,路由的匹配条件,符合了才做路由
filters可选的
路由过滤器 GatewayFilterFactory
局部路由生效的
在某个路由下配置,filters
所有路由生效的
default-filters全局过滤器 GlobalFilter
作用于GatewayFilter一样
GlobalFilter可以自定义业务逻辑
如何自定义GlobalFilter
1)实现GlobalFilter接口
2)实现Ordered接口或者加@Order注解
3)编写过滤逻辑
WebHandlerExchange
封装了Request、Response
GatewayFilterChain
过滤器链,放行并委托给下一个过滤器
如何拦截
response.setStatsuCode()
response.setComplete()
过滤器执行顺序
order值越小,执行优先级越高
order值一样,default-filters > 路由filters > GlobalFilter
网关限流
限流作用
限流实现
基于算法:令牌桶算法
- 具体实现: Redis + Gateway限流过滤器