当前位置: 首页 > news >正文

微服务架构---Ribbon\Feign

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-orderdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///xinxin?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: 20020630cloud: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功能,设置连接池参数


http://www.mrgr.cn/news/31131.html

相关文章:

  • 牛客BC68,X型图案
  • 【JS】path的使用说明
  • STM32G474RE使用SPI1中断发送和接收8位数据
  • 热点|创邻图查询范式引爆LDBC TUC2024
  • Unity实现自己的协程系统
  • 文件上传js代码
  • Virtuoso服务在centos中自动停止的原因分析及解决方案
  • 【云安全】云服务安全攻防
  • U 盘显示需要格式化才能用?一针见血的修复方法在这里!速看!
  • 量子噪声流加密(二:如何隐匿通信密文)
  • 蓝队技能-应急响应篇Web内存马查杀JVM分析Class提取诊断反编译日志定性
  • Centos 7 搭建Samba
  • YOLOv5白皮书-第Y1周:调用官方权重进行检测
  • Spring MVC 启动与请求处理流程解析
  • 环保行动中的关键力量:油烟净化器如何发挥重要作用
  • 乐观锁、悲观锁及死锁
  • 抖音怎么录屏保存?网页录屏和直播内容录制屏幕工具软件推荐
  • Ubuntu 22.04 源码下载的几种方法
  • 【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
  • 鸿蒙手势交互(三:组合手势)