框架
微服务框架:
微服务的架构特征:
- 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
- 自治:团队独立、技术独立、数据独立,独立部署和交付
- 面向服务:服务提供统一标准的接口,与语言和技术无关
隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
dubbo和springcloud的区别:
1、dubbo是单一一个技术,而springcloud是一套技术解决方案。
2、dubbo实现远程调用是使用的是dubbo协议走的4层协议,而springcloud实现远程调用使用的http的协议走的是7层协议。
3、dubbo的远程调用速度更快。
4、dubbo的注册中心官方推荐使用zookeeper,而springcloud有很多的注册中心比如:EK,nacos
实现远程调用:
通过RestTemplate发送远程请求。
在需要远程调用的启动类书写RestTemplate
@Bean
public RestTemplate restTemplate() { return new RestTemplate(); }
在需要调用的service层注入RestTemplate
Eureka注册中心:记录和管理微服务。
当eureka启动时,所有的客户端都会将自己的服务信息登记在eureka上。
消费者需要提供者提供服务,会去eureka上拉取提供者的信息。
如果有多个服务提供者,消费者用负载均衡来挑取。
提供者每隔30秒会向eureka发起一次心跳,如果不跳了就会剔除信息。
流程:搭建——服务注册——服务发现
在父工程下创建一个eureka-server模块
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
在启动类加@EnableEurekaServer注解开启eureka服务
编写配置文件
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
在需要被管理的微服务模块的pom中导入依赖,yml书写相关信息
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
@LoadBalanced 注解实现负载均衡原理
@Bean
@LoadBalanced
public RestTemplate restTemplate() { return new RestTemplate(); }
修改相关服务uri
访问服务端地址时,因为不是真实的地址,所以会被ribbon拦截,拦截后ribbon通过拉取eureka中注册的服务提供者的信息,然后通过负载均衡去选择到底是哪个服务器。
order-service发起请求,请求被loadbalancerinterceptor负载均衡拦截器拦截,然后交给ribbonloadbalancerclient,ribbonloadbalancerclient通过dynamicserverlistloadbalancer向rureka-server拉取多个服务器的信息,通过irule做负载均衡选择一个服务器再返还给ribbonloadbalancerclient,ribbonloadbalancerclient再替换掉服务器名称,修改为真实的ip地址,最后向服务器发起请求。
负载均衡策略:zoneavoidancerule是默认。
ribbon的饥饿加载:
ribbon:
eager-load:
enabled: true
clients: userservice
默认采用的是懒加载,即第一次访问时才会创建loadbalanceclient,请求时间会很长。
总结:
springCloud的ribbon底层是一个拦截器,对RestTemplate进行修改,转发到指定地址
nacos注册中心:
下载安装后,bin目录下启动dos命令,输入startup.cmd -m standalone执行命令。
在父工程导入nacos管理依赖并指定版本。
<dependencyManagement>里面导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
子工程导入nacos管理依赖,无所谓指定版本。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</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性能优化-连接池配置:
引入依赖
配置连接池
网关功能:
网关搭建步骤:
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的顺序执行。