微服务远程调用:

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

 Ribbon: 负载均衡, 实现服务调用的负载均衡

 Hystrix: 熔断器

 Feign: 远程调用

 Gateway: 网关

 Spring Cloud Config: 配置中心

Eureka注册中心:

简介:

提供服务注册和发现, 是注册中心. 有两个组件: Eureka 服务端和 Eureka 客户端

image-20220702192231260

image-20220702201025581

Eureka-Server:就是注册中心(一个集群),对外暴露地址,用于记录服务与心跳监控

EurelaClient:客户端

(Provider)提供者: 启动后向EureKa注册自己的信息(地址,服务名称等),

每个30秒向EurekaServer发送心跳

(consumer)消费者:服务的调用方,会定期去Eureka拉取服务列表,然后使用负载均衡算法进行调用

心跳(续约):提供者定期通过http方式向EureKa刷新自己的状态

服务下线、失效剔除和自我保护

 服务的注册和发现都是可控制的,可以关闭也可以开启。默认都是开启

 注册后需要心跳,心跳周期默认 30 秒一次,超过 90 秒没发心跳认为宕机

 服务拉取默认 30 秒拉取一次.

 Eureka 每个 60 秒会剔除标记为宕机的服务

 Eureka 会有自我保护,当心跳失败比例超过阈值(默认 85%),那么开启自我保护,不再剔除服务。

 Eureka 高可用就是多台 Eureka 互相注册在对方上

搭建EureKa:

image-20220702201051440

导入eureka-server依赖:

1
2
3
4
5
6
7
<!--        eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>

配置yaml文件:

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

启动类添加注解:

1
2
3
4
5
6
7
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}

启动访问注册地址,判断是否是正确的:

image-20220702202203197

注册客户端服务:

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

在application.yml文件,编写下面的配置:

1
2
3
4
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/

注册user-service:

可以将user-service多次启动, 模拟多实例部署,但为了避免端口冲突,需要修改端口设置:

image-20220702203359295

order-service完成服务注册跟上面所示一致:

1
2
3
4
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/

总结:

服务注册引入eureka-client依赖,在application.yml中配置eureka地址

无论是消费者还是提供者,引入eureka-client依赖知道eureka地址后,都可以完成服务注册

依次启动服务,可以完成注册

image-20220702204218321

服务拉取:

服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡

  • 用服务名代替ip、端口:
1
2
3
4
5
6
7
8
9
10
11
12
13
  @Autowired
RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// String url = "http://localhost:8081/user/"+order.getUserId();
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);

// 4.返回
return order;
}

添加负载均衡接口:

image-20220702204818307

image-20220702210605737

不用关心服务的地址,Eureka 会进行调度。

Ribbon负载均衡

负载均衡原理

image-20220702213325601

image-20220702214043839

当服务发起请求,首先是会被LoadBalancerInterceptor负载均衡拦截器拦截,会得到请求中的服务名并交给RibbonLoadBanlanceClient,然后把服务交给DynamicServerListLoadBalancer,到eureka中拉取注册服务信息,然后根据IRule负载策略选择一个进行替换,最后发现服务。(IRule接口的实现)

负载均衡策略

Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则:

image-20220702214235677

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

修改负载均衡的策略:

使用@Bean注解:

1
2
3
4
5
6
//    配置规则
@Bean
public IRule randomRule(){
return new RandomRule();
}

该种方式是全局配置,所有的服务都是调用该接口。

在配置文件中配置:

配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:

1
2
3
4
5
6
7
8
9
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/

userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule# 负载均衡规则

只针对某个服务而言

懒加载

饥饿加载:

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

image-20220702220128590

image-20220702220240496

开启饥饿加载:

image-20220702220438191

Nacos注册中心: