框架

SpringCloud相关(eureka等) - 图1

SpringCloud相关(eureka等) - 图2

微服务框架:

微服务的架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
  • 自治:团队独立、技术独立、数据独立,独立部署和交付
  • 面向服务:服务提供统一标准的接口,与语言和技术无关
  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

    • 可以认为微服务是一种经过良好架构设计的分布式架构方案

      springcloud与springboot兼容性:

  • SpringCloud相关(eureka等) - 图3

dubbo和springcloud的区别:

1、dubbo是单一一个技术,而springcloud是一套技术解决方案。
2、dubbo实现远程调用是使用的是dubbo协议走的4层协议,而springcloud实现远程调用使用的http的协议走的是7层协议。
3、dubbo的远程调用速度更快。
4、dubbo的注册中心官方推荐使用zookeeper,而springcloud有很多的注册中心比如:EK,nacos
SpringCloud相关(eureka等) - 图4

实现远程调用:
通过RestTemplate发送远程请求。
在需要远程调用的启动类书写RestTemplate
@Bean
public RestTemplate restTemplate() { return new RestTemplate(); }
在需要调用的service层注入RestTemplate
image.png

Eureka注册中心:记录和管理微服务。

当eureka启动时,所有的客户端都会将自己的服务信息登记在eureka上。
消费者需要提供者提供服务,会去eureka上拉取提供者的信息。
如果有多个服务提供者,消费者用负载均衡来挑取。
提供者每隔30秒会向eureka发起一次心跳,如果不跳了就会剔除信息。

流程:搭建——服务注册——服务发现

在父工程下创建一个eureka-server模块

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  4. </dependency>

在启动类加@EnableEurekaServer注解开启eureka服务
编写配置文件

  1. server:
  2. port: 10086
  3. spring:
  4. application:
  5. name: eureka-server
  6. eureka:
  7. client:
  8. service-url:
  9. defaultZone: http://127.0.0.1:10086/eureka

在需要被管理的微服务模块的pom中导入依赖,yml书写相关信息

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  4. </dependency>
  5. 配置文件
  6. spring:
  7. application:
  8. name: userservice
  9. eureka:
  10. client:
  11. service-url:
  12. defaultZone: http://127.0.0.1:10086/eureka

@LoadBalanced 注解实现负载均衡原理

  1. @Bean
  2. @LoadBalanced
  3. public RestTemplate restTemplate() { return new RestTemplate(); }

修改相关服务uri
image.png
访问服务端地址时,因为不是真实的地址,所以会被ribbon拦截,拦截后ribbon通过拉取eureka中注册的服务提供者的信息,然后通过负载均衡去选择到底是哪个服务器。
order-service发起请求,请求被loadbalancerinterceptor负载均衡拦截器拦截,然后交给ribbonloadbalancerclient,ribbonloadbalancerclient通过dynamicserverlistloadbalancer向rureka-server拉取多个服务器的信息,通过irule做负载均衡选择一个服务器再返还给ribbonloadbalancerclient,ribbonloadbalancerclient再替换掉服务器名称,修改为真实的ip地址,最后向服务器发起请求。

负载均衡策略:zoneavoidancerule是默认。

SpringCloud相关(eureka等) - 图7
image.png

ribbon的饥饿加载:

  1. ribbon:
  2. eager-load:
  3. enabled: true
  4. clients: userservice

默认采用的是懒加载,即第一次访问时才会创建loadbalanceclient,请求时间会很长。

总结:

springCloud的ribbon底层是一个拦截器,对RestTemplate进行修改,转发到指定地址
image.png

nacos注册中心:

下载安装后,bin目录下启动dos命令,输入startup.cmd -m standalone执行命令。
在父工程导入nacos管理依赖并指定版本。

  1. <dependencyManagement>里面导入依赖
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  5. <version>2.2.6.RELEASE</version>
  6. <type>pom</type>
  7. <scope>import</scope>
  8. </dependency>

子工程导入nacos管理依赖,无所谓指定版本。

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4. </dependency>

服务分级模型:
服务-> 集群-> 实例

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

配置获取的步骤:
项目启动->启动时优先读取bootstrap.yaml中的信息->读取nacos中的配置文件->读取本地配置文件application.yml->创建spring容器->加载bean
多环境配置共享:
优先级顺序
服务名-环境.yaml>服务名,yaml>本地配置
nacos集群搭建:
搭建mysql集群并初始化数据库表
下载nacos
修改集群配置(节点信息) 、数据库配置
分别启动多个nacos
nginx反向代理
fegin使用步骤:
引入依赖
添加@EnableFeginClients注解
编写FeginClient接口 写上@FeginClient注解 注解中属性为服务名称
在接口中声明:服务名称 ↑ 参照restful-> 请求方式 请求参数 请求路径 返回值类型
使用FeginClient接口中的方法替代resttemplate
自定义fegin配置:
1、yml中配置 default表示全局配置 具体服务名称表示具体给谁配置
2、代码配置
添加一个配置类 返回值类型为日志类型枚举,将他放在启动类的@EnableFeginClients注解上表示全局配置,放在具体的@FeginClient注解上表示为局部配置。
Fegin性能优化:默认情况下fegin发起http请求的时候使用的是URLConnection类,并没有使用连接池导致每次请求都需要创建和关闭连接对象。可以使用连接池优化
Fegin性能优化-连接池配置:
引入依赖
配置连接池

网关功能:
SpringCloud相关(eureka等) - 图10
网关搭建步骤:
1、创建项目,引入nacos依赖和gateway依赖。
2、配置application.yml 包括服务基本信息、nacos地址、路由
路由配置
2.1 唯一标识 id
2.2 路由目标 uri 目标地址或固定地址
2.3 断言 判断路由的规则
2.4 过滤器 对请求或响应做处理
SpringCloud01.md
过滤器的执行顺序:
请求路由后,会将当前路由过滤器和defaultfilter、globalfilter合并到一个过滤器链中,排序后一次执行每个过滤器。路由过滤器和defaultfilter默认order是按照声明顺序从1开始递增。
当过滤器的order值一样时,会按照defaultfilter>路由过滤器>globalfilter的顺序执行。