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
  • 配置中心: nacos

    2. 核心组件

    2.1 eureka注册中心(发现,注册,状态监控)

    2.1.1 基础架构

  • eureka-server

  • eureka-client

    提供者 消费者

2.1.2 微服务如何得知提供者地址?

  1. 提供者启动,必须立即注册自己的信息到eureka
  2. eureka会保存服务名称及实例ip和端口的映射关系
  3. 消费者去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
  • BestAvailableRule

    2.2.4 饥饿加载

  • 默认是懒加载,第一次请求时才去拉取服务列表

  • 配置ribbon.egar-load.enable=true开启饥饿加载
  • ribbon.egar-load.clients=userservice,指定服务名称

    2.3 nacos注册中心

    2.3.1 使用

    搭建nacos

    1. 下载
    2. 解压
    3. 运行 startup.cmd -m standalone

服务注册

  1. 引入nacos-discovery依赖
  2. 编写配置,nacaos地址,服务名称

服务发现

  1. 引入nacos-discovery依赖
  2. 编写配置,nacos地址、服务名称
  3. 给RestTemplate加@LoadBalanced注解
  4. http请求时,用服务名称代替ip和端口

2.3.2 服务分级管理模型

  • 服务service
  • 集群cluster
  • 实例, 一个服务启动多个
  • NacosRule 路由时就近原则
  1. 优先从本集群负载均衡
  2. 本集群没有,再去访问其它集群
  3. 本集群内部采用随机负载均衡

    2.3.3 权重

    值的范围是0~1,权重越大,被访问的频率越高

    作用: 针对不同性能的服务器,分配不同的权重 把权重置为0,服务就不会被访问,无缝升级切换

2.3.4 namespace

作用:环境隔离,不同开发环境或者多租户隔离

2.3.5 nacos和eureka的区别和联系

  1. 联系
  • 注册发现的整体流程一样,都实现SpringCloudCommon的接口
  • 都基于心跳机制监测提供者的整体
  • 都可以采用服务拉取来获取实例列表
  1. 区别
  • nacos针对永久实例是采用主动访问机制,临时实例才是心跳机制
  • nacos消费者可以定时拉取服务;nacos还会在服务变更时主动推送服务列表
  • nacos可以是CP,也可以是AP,默认是AP
  • eureka是AP模式,可用性优先

nacos配置管理

统一配置管理

在nacos添加配置

  1. dataID
    • 配置文件名称:服务名-环境.后缀名
  2. group
    • 分组,默认
  3. 类型
    • yaml
    • properties
  4. 内容
    • 不是服务的所有配置,而是自定义的,经常变动的配置

配置热更新
微服务整合nacos配置
1)引入nacos-config依赖
2)配置bootstrap.yaml
nacos地址
dataID

  • spring.application.name
  • spring.profiles.active
  • file.extenssion
  • 基于@Value
    • 利用@Value注入属性
    • 在@Value注解所在类添加@RefreshScope注解
  • 基于@ConfigurationProperties
    • 默认就是热更新

      配置共享

      nacos默认读取两个文件
      服务名-环境.后缀名
      服务名.后缀名
      多环境共享的

      优先级

      环境独享的配置 > 多环境共享的 > 服务本地的

      nacos集群

  1. 准备mysql,准备数据库表
  2. 部署多台nacos实例,配置访问mysql
  3. 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网关

    网关的作用

  1. 请求路由、负载均衡
  2. 身份认证、权限校验
  3. 请求限流

    快速入门,基本用法

    1)创建项目,引入依赖
  • 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限流过滤器