Ribbon(负载均衡)
Ribbon概述
在 SpringCloud 中, Nacos⼀般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Nacos中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。
Ribbon作用
1.服务调用
基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进⾏调用
2. 负载均衡
当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址
Ribbon实现订单调用商品服务
-
不需导入坐标(springcloud提供的服务发现的jar中已包含了Ribbon的依赖)
-
商品服务控制层打印查询商品的信息
-
订单服务(消费者),添加负载均衡注解
@Bean
@LoadBalanced //负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
-
订单控制层通过服务名称消费使⽤
Ribbon实现负载均衡
-
服务端负载均衡
先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择⼀个进⾏访 问
-
客户端负载均衡
客户端会有⼀个服务器地址列表,在发送请求前通过负载均衡算法选择⼀个服务器,然后进行访问
商品服务举例
-
再创建一个商品微服务启动,设置其端口为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
-
引入依赖
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
-
配置连接池
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功能,设置连接池参数
-