Ribbon(负载均衡)

Ribbon概述

在 SpringCloud 中, Nacos⼀般配合Ribbon进行使用Ribbon提供了客户端负载均衡的功能,Ribbon利用从Nacos中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。

Ribbon作用

1.服务调用

基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进⾏调用

2. 负载均衡

当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址

Ribbon实现订单调用商品服务

  1. 不需导入坐标(springcloud提供的服务发现的jar中已包含了Ribbon的依赖)

  2. 商品服务控制层打印查询商品的信息

  3. 订单服务(消费者),添加负载均衡注解

  @Bean
   	@LoadBalanced //负载均衡
   	public RestTemplate getRestTemplate(){
   		return new RestTemplate();
   	}
  1. 订单控制层通过服务名称消费使⽤

image-20240820010643102

Ribbon实现负载均衡

  • 服务端负载均衡

先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择⼀个进⾏访 问

  • 客户端负载均衡

客户端会有⼀个服务器地址列表,在发送请求前通过负载均衡算法选择⼀个服务器,然后进行访问

商品服务举例

  1. 再创建一个商品微服务启动,设置其端口为8082

启动两次服务器验证效果,并查看两个控制台发现以轮询的方式调用了商品服务

负载均衡策略

yml中需要调用的微服务名称默认不写是轮询方式

  • com.netflix.loadbalancer.RoundRobinRule :以轮询(A-B-A-B)的方式进行负载均衡

  • com.netflix.loadbalancer.RandomRule :随机策略

  • com.netflix.loadbalancer.RetryRule :重试策略

  • com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权重,越高的被调用的可能性越大

  • com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实例返回

  • com.netflix.loadbalancer.AvailabilityFilteringRule :可⽤过滤策略。过滤掉故障和请求数超过阈值的服务实例,再从剩下的实例中轮询调用

  • ZoneAvoidanceRule:以区域可用的服务器为基础进行服务器的选择

在启动类方法上添加注解后再运行

自定义负载均衡策略

方式1:定义⼀个新的IRule:(全局设置--->对所有微服务生效)

@Bean
public IRule randomRule(){
 return new RandomRule();
}

方式2:在yml配置文件中配置:(局部设置--->对指定微服务生效)

#需要调⽤的微服务名称
service-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

改进一下

利用RestTemplate发起远程调用,出现可读性差,对于参数复杂的URL难以维护

解决方案:使用Feign远程调用,调⽤远程服务就像调用本地服务

Feign(远程调用)

Feign简介

使得调⽤远程服务就像调⽤本地服务⼀样简单, 只需要创建⼀个接口并添加⼀个注解即可。在Nacos下使用Fegin默认就实现了负载均衡的效果

基本使用

1.添加Fegin的依赖

<!--fegin组件-->
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.添加注解(在主类即启动类上)

@EnableFeignClients  //开启Fegin

3.设计service接口, 使用Fegin实现微服务(向商品服务发请求)

4.配置yml文件

server:
  port: 8091
spring:
  application:
    name: service-order
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///xinxin?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 20020630
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
logging:
  level:
    com.apesource: debug
feign:
  client:
    config:
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

5.修改controller代码,并启动验证

自定义配置

配置文件方式

(1)配置⽂件修改feign的⽇志级别可以针对单个服务

feign:
 client:
   config:
     service-product: # 针对某个微服务的配置
     loggerLevel: FULL # ⽇志级别

(2)针对所有服务

feign:
 client:
   config:
     default: # 这⾥⽤default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL # ⽇志级别

注意:需要把⽇志级别设置

logging:
  level:
    com.apesource: debug

日志的级别分类

  • NONE:不记录任何⽇志信息,这是默认值。

  • BASIC:仅记录请求的⽅法, URL以及响应状态码和执⾏时间

  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

Feign使用优化

提高Feign的性能主要手段就是使用连接池代替默认的URLConnection

  1. 引入依赖

<!--httpClient的依赖 -->
<dependency>
 	<groupId>io.github.openfeign</groupId>
 	<artifactId>feign-httpclient</artifactId>
</dependency>
  1. 配置连接池

feign:
 client:
   config:
 	 default: # default全局的配置
 		loggerLevel: BASIC # ⽇志级别,BASIC就是基本的请求和响应信息
 httpclient:
 	enabled: true # 开启feign对HttpClient的⽀持
 	max-connections: 200 # 最⼤的连接数
 	max-connections-per-route: 50 # 每个路径的最⼤连接数

总结:

  • 日志级别尽量用basic

  • 使用HttpClient或OKHttp代替URLConnection

    • 引入feign-httpClient依赖配置文件

    • 开启httpClient功能,设置连接池参数

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部