什么是分布式架构?
根据业务功能对系统进行拆分,每个功能模块作为独立项目开发,成为一个服务。
优点:
降低服务耦合,服务更独立;
有利于服务升级和拓展。
缺点:
架构非常复杂,运维、监控、部署难度提高
什么是微服务?
服务间的调用方式有哪些?
restTemplate,:
Spring提供了整合: RestTemplate
RPC:
并发能力强
- 代表框架: dubbo
HTTP:
- 更轻量,更灵活
- 代表框架: HttpClient、UrlConnection、OkClient
什么是SpringCloud?
SpringCloud是目前国内使用最广泛的微服务框架,
SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。SpringCloud中的核心组件?
服务注册中心:Eureka, Nacos, Consul
负载均衡:Ribbon
服务远程调用:OpenFeign,Dubbo
统一配置管理:SpringCloudConfig, Nacos
统一网关路由:SpringCloudGateway,Zuul
服务链路监控:Zipkin, Sleuth
流控,降级,保护:Hystix, SentinelSpringBoot、SpringCloud、微服务三者间关系?
微服务是一种良好的分布式架构方案(一种架构风格),一个大项目拆解成若干个小项目,每个小项目之间相互独立,又可以相互调用。小项目基于spring开发。
SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系。(Hoxton.SR10,对应 SpringBoot 版本是2.3.x版本。
SpringCloud是微服务的一站式解决方案。
SpringBoot是为了更快捷搭建Spring项目工程和微服务工程。什么是注册中心?
注册中心是服务实现服务化管理的核心组件,主要用来存储和维护服务地址信息。
注册中心的作用?
注册中心3个作用:
服务注册;
服务发现;
服务状态监控。如何使用Eureka注册中心
1.搭建EurekaServer(搭建注册中心)
1)创建项目,并引入依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
2)启动类上添加注解
@EnableEurekaServer
3)修改application.yml配置文件。(添加如下配置)
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
2.将若干个微服务注册到Eureka注册中心
1)引入依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
2)修改application.yml配置文件。(添加如下配置)
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka负载均衡
如果服务中搭建了集群,那么可以使用负载均衡组件,通过轮询,随机,权重等规则去调用服务。
(搭载集群的时候,才使用负载均衡。)
负载均衡
1)在RestTemplate类上添加注解@LoadBalanced
2)http://userservice/user/userId什么是Ribbon?作用?
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法。
作用:Ribbon主要是客户端侧的负载均衡,A服务请求B服务,B服务有多个服务实例时,需要根据一定策略的分配这些请求,保证服务不同时压到一个服务实例上负载均衡Ribbon原理:
基本流程如下:
- 拦截我们的RestTemplate请求http://userservice/user/1
- RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
- DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
- eureka返回列表,localhost:8081、localhost:8082
- IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求
Ribbon支持的负载均衡策略:
默认的实现就是ZoneAvoidanceRule,是一种轮询方案<br /> 支持其它的负载均衡规则:随机,简单轮询,按照权重。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26568475/1654880376751-a416c1b3-5471-410f-a110-4b74c1e23b21.png#clientId=u26203600-07d7-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=345&id=ufe801577&margin=%5Bobject%20Object%5D&name=image.png&originHeight=690&originWidth=1432&originalType=binary&ratio=1&rotation=0&showTitle=false&size=162483&status=done&style=none&taskId=uad09016c-b9dc-46fc-ad89-5db5cb3c2db&title=&width=716)<br />**自定义负载均衡两种策略:**<br />代码方式:<br />@Bean<br />public IRule randomRule(){<br /> return new RandomRule();<br />}<br />配置文件方式:<br />userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务<br /> ribbon:<br /> NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 <br />** **配置方式无法做到全局配置,因为配置的时候要指定调用的服务名。代码方式不需要。
饥饿加载:
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true
clients: userservice如何使用Nacos注册中心
安装nacos。运行命令为:startup.cmd -m standalone (用户名nacos,密码nacos端口8848)
服务注册到Nacos:
.1)引入依赖
在cloud-demo父工程的pom文件中的中引入SpringCloudAlibaba的依赖:
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.6.RELEASE
pom
import
然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
注意:不要忘了注释掉eureka的依赖。
2)在user-service和order-service的application.yml中添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848
注意:不要忘了注释掉eureka的地址
namespace只在Nacos中使用。Nacos与Eureka的区别
Nacos的服务实例分为两种l类型:
临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
- 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
- Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
- Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
分布式架构三种指标:
CAP:
C:一致性
A:可用性
C:分区容错性
Eureka:AP模式
Nacos:AP模式(可切换为CP模式)
默认是AP,但是可切换到CP,切换到非临时实例时,nacos主动询问,即为AP模式。
插件:
JBLSpring… 自动创建springboot启动类
谷歌安装插件: GiteeTree
idea中安装忽略文件插件:.ignore(忽略文件)