什么是微服务?

微服务是一种良好的架构风格,大项目拆分成小项目,每个小项目负责某个单独的业务,他们可以用独立的技术.独立的数据库独立的的进行运行部署,也可以进行相互间的调用.

优点是拆分粒度小, 服务更独立,耦合度更低.

缺点是架构复杂,运维监控部署难度大.

服务间的调用方式有哪些?

服务远程调用有两种方式,一种OpenFeign,是Netfix公司的,基于http请求调用客户端,特点是比较灵活 .另一种是Dubbo,是阿里巴巴的,基于RPC协议,调用与被调用之间建立的连接是长连,不会断,下次再调用二者间会有建立连接的过程,连接不断就不需要再次连接,特点是并发能力特别强,缺点是不够灵活二者间需要用相同的技术,数据量不适合传太大.

什么是SpringCloud?

SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud。

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

SpringCloud中的核心组件?

Eureka:注册中心,服务注册和发现监视

Ribbon:负载均衡,实现服务与服务之间的负载均衡

Hystrix:熔断器

Zuul:网关

Spring Cloud Config:配置中心

SpringBoot、SpringCloud、微服务三者间关系?

微服务是一种良好的架构风格,大项目拆分成小项目,每个小项目负责某个单独的业务,他们可以用独立的技术.独立的数据库独立的的进行运行部署,也可以进行相互间的调用.

微服务与springCloud之间的关系:SpringCloud是微服务的一站式解决方案.

SpringCloud与SpringBoot之间的关系:SpringCloud在整合这些技术时基于SpringBoot,它依赖于SpringBoot的环境.

微服务与SpringBoot之间的关系:微服务拆分的小项目由SpringBoot快速构建

什么是注册中心?

注册中心主要涉及到三大角色 :注册中心、服务提供者 、服务消费者

三者关系流程描述如下:

1、各微服务启动时,将自己的实例信息(ip、端口、服务名等)注册到注册中心,注册中心存储这些数据

2、服务消费者从注册中心获取到服务提供者的实例信息,通过ip + 端口 方式远程调用服务提供者的接口

3、各个微服务通过心跳来上报注册中心,注册中心以某个时间段有没有接收到上报信息,来决定是否下线某服务实例

4、 微服务发生变动时如 增加实例或 ip变动,重新注册信息到注册中心。这样,服务消费者就无需改动,直接从注册中心获取最新信息即可

注册中心的作用?

作用就三句话:服务注册,服务发现,服务的状态监控

服务注册:服务将自己的信息(ip,端口号等)注册到注册中心,消费者服务会根据名称拉取对应的服务

服务发现:消费者服务会根据名称拉取对应的服务

状态监控:服务中心发现某个服务宕机就会将他从服务了列表中剔除

如何使用Eureka注册中心

  • user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端)。这个叫服务注册
  • eureka-server保存服务名称到服务实例地址列表的映射关系
  • order-service根据服务名称,拉取实例地址列表。这个叫服务发现或服务拉取
  • order-service从实例列表中利用负载均衡算法选中一个实例地址
  • 向该实例地址发起远程调用
  • user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
  • 当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除
  • order-service拉取服务时,就能将故障实例排除了

如何使用Nacos注册中心

1)引入依赖

在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖:

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  4. <version>2.2.6.RELEASE</version>
  5. <type>pom</type>
  6. <scope>import</scope>
  7. </dependency>

然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

使用时注释掉eureka的依赖。

2)配置nacos地址

在user-service和order-service的application.yml中添加nacos地址:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

什么是Ribbon? 作用?

实现服务与服务之间 负载均衡调用

Ribbon的工作原理?

LoadBalancerInterceptor中有intercept拦截方法,拦截了所有用户的请求,执行restTemplate所有的请求都会到这,拿到服务名称的方法,通过RibbonLoadBanlanceerClient获取url的服务id  userservice,在根据这个服务名称,找到对应的服务列表,再根据一个IRule的规则算出地址,再向指定的地址发起调用

Ribbon支持的负载均衡策略?

内置负载均衡规则类 规则描述
RoundRobinRule 简单轮询服务列表来选择服务器。
AvailabilityFilteringRule 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule 忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule 随机选择一个可用的服务器。
RetryRule 重试机制的选择逻辑

Ribbon如何配置修改负载均衡策略?

  1. 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
@Bean
public IRule randomRule(){
    return new RandomRule();
}

配置灵活,但是修改时需要重新打包发布

  1. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

直观方便,无需重新打包但是无法做全局配置

Ribbon如何设置饥饿加载?

使用ribbon时采用的是懒加载方式,第一次调用服务时才会把负载均衡的对象创建出来

在配置文件正加入:

ribbon:
eager-load:
enabled: 设置开启饥饿加载
clients: userservice

项目一启动就创建

143在线文档:

https://doc.weixin.qq.com/sheet/e3_AMkAPAZYAD8HmJTDcHWRjS10K2ZpA?scode=AFcALAeyABAh9m4Sp1AMkAPAZYAD8&tab=BB08J2

144在线文档

https://docs.qq.com/sheet/DR052TExhRWdJdWZE?version=4.0.6.6516&platform=win&tab=BB08J2