目录
一、Ribbon简介
- 是什么
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端 负载均衡 工具简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这次额机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。
- Ribbon工作步骤
第一步先选择 EurekaServer,它优先选择同一个区域内负载较少的server
第二步再根据用户指定的策略,再从server取到的服务注册列表中选择一个地址
- Ribbon核心组件IRule
![在这里插入图片描述 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_spring cloud](//dev-img.mos.moduyun.com/20231020/e6c0fdfc-67a4-48ea-8031-0157436adeca.png)
二、Ribbon入门案列
2.1引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
![在这里插入图片描述 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_云原生_02](//dev-img.mos.moduyun.com/20231020/5e64d926-3d61-4bd9-b4d1-204106bf5fda.png)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
2.2 使用ribbon
我们用的RestTemplate
+ribbon
来实现负载均衡
主程序(加@EnableEurekaClient注解)
@SpringBootApplication
@EnableEurekaClient
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class,args);
}
}
controller
@RestController
public class DeptController_Consumer
{
private static final String REST_URL_PREFIX = "http://CLOUD-PAYMENT-SERVICE"; //微服务的虚拟id
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/consumer/dept/add")
public boolean add(Dept dept)
{
return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
}
}
这样就能在CLOUD-PAYMENT-SERVICE开启负载均匀了
2.2修改负载均匀的方式
- 默认按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败侧在指定的时间会进行重试,进行获取可用的服务
- 根据官方文档的意思,推荐在
springboot 主程序扫描的包范围之外
进行自定义配置类
- 创建配置类
![在这里插入图片描述 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_原力计划_03](//dev-img.mos.moduyun.com/20231020/ce28fb3d-aa08-4f24-add2-e27cecdca9be.png)
- 代码如下
![在这里插入图片描述 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_微服务_04](//dev-img.mos.moduyun.com/20231020/ef0eb21f-86a6-4078-ae78-22dc74f16f9c.png)
- 然后在启动类加上
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
注解
![在这里插入图片描述 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_微服务_05](//dev-img.mos.moduyun.com/20231020/7210fdca-6975-41a0-9064-ced0595f1f2e.png)
三 、openfeign简介
- 是什么
OpenFeign为微服务架构下服务之间的调用提供了解决方案,OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
- openfeign的用途
服务发现,负载均衡,服务调用
- 原理
基于@EnableFeignClients 将所有被@FeignClient注解的类 注册到容器中。当这些被@FeignClient注解的类被调用时会创建一个动态代理的对象为我们创建被调用类的实例,然后都会被统一转发给 Feign 框架所定义的一个 InvocationHandler , 由该 Handler 完成后续的 HTTP 转换, 发送, 接收, 翻译HTTP响应的工作。
![在这里插入图片描述 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_微服务_06](//dev-img.mos.moduyun.com/20231020/5bcc0981-7f3a-45a7-800f-06a9905fbf28.png)
四、openfeign的使用
4.1导入maven依赖
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
![在这里插入图片描述 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_负载均衡_07](//dev-img.mos.moduyun.com/20231020/862c6a49-ea0e-491b-8777-49f9f74361f7.png)
4.2服务调用
- 上面我们用的是
ribbon+restTemplate
- 现在直接
openfeign
一、
接口+注解(微服务调用接口=
@FeignClient
)
写服务接口
![在这里插入图片描述 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_原力计划_08](//dev-img.mos.moduyun.com/20231020/3379a63a-a5d9-4108-9df4-a2a766a89f3b.png)
代码如下
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@GetMapping("/payment/get/{id}")
CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
二、yml文件
server:
port: 8000
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/
三、主启动类开启功能(加@EnableFeignClients
注解)
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class,args);
}
}
四、业务类
@RestController
@Slf4j
public class OederFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
{
return paymentFeignService.getPaymentById(id);
}
}
4.3 openfeign超时控制
只需要在yaml文件加上如下代码
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
完整的yml文件
server:
port: 8000
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
4.4 openfeign日志打印功能
先在yml加上
logging:
level:
# feign日志以什么级别监控哪个接口
具体的接口路径:
比如我的yml文件
server:
port: 8000
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
logging:
level:
# feign日志以什么级别监控哪个接口
com.xbfinal.springcloud.service.PaymentFeignService:
然后写配置类
![在这里插入图片描述 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_原力计划_09](//dev-img.mos.moduyun.com/20231020/30904df0-79c5-4497-a011-b81df3222066.png)
@Configuration
public class FeignConfig
{
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;//详细日志
}
}
-
日志级别介绍
:
NONE:默认的,不显示任何日志
BASIC:仅记录请求方法、URL、响应状态码及执行时间
HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息
FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据
- 测试
![在这里插入图片描述 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_原力计划_10](//dev-img.mos.moduyun.com/20231020/c679c4ce-9202-4b49-a959-65bb398a3d2d.png)