目录
SpringCloud Ribbon
Ribbon 介绍
LB(Load Balance)
LB 分类
1. 集中式LB
2. 进程内LB
实例-前面member-consumer 轮询负载访问10000/10002 底层就是Ribbon 默认的轮询负载算法
Ribbon 架构图&机制
Ribbon 机制
Ribbon 常见负载算法
替换负载均衡算法-应用实例
需求分析/图解
1.创建member-service-consumer-80 com/springcloud/config/RibbonRule.java
2.修改member-service-consumer-80 com/springcloud/MemberConsumerApplication.java
SpringCloud OpenFeign
OpenFeign 介绍
Feign 和OpenFeign 区别
Feign
OpenFeign
OpenFeign-应用实例
示意图
创建服务消费模块-通过OpenFeigen 实现远程调用
创建application.yml 内容如下
创建主启动类MemberConsumerOpenfeignApplication80.java
创建com/springcloud/service/MemberFeignService.java,
创建com/springcloud/controller/MemberConsumerFeignController.java
注意事项和细节
日志配置
基本介绍
配置日志-应用实例
1. 在member-service-consumer-openfeign-80 创建com/springcloud/config/OpenFeignConfig.java
2. 在member-service-consumer-openfeign-80 修改application.yml
测试
OpenFeign 超时
先看一个问题
设置超时时间
1. 修改member-service-consumer-openfeign-80 的application.yml
测试
SpringCloud Ribbon
本篇前言 本篇的项目是跟前面的博客 SpringCloud Eureka 的详细讲解及示意图_尘觉的博客-CSDN博客 是Ribbon结合Eureka
Ribbon 介绍
1. Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具
2. Ribbon 主要功能是提供客户端负载均衡算法和服务调用
3. Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。
4. Ribbon 会基于某种规则(如简单轮询,随机连接等)去连接指定服务
5. 程序员很容易使用Ribbon 的负载均衡算法实现负载均衡
6. 一句话: Ribbon: 负载均衡+RestTemplate 调用
官网
1. https://github.com/Netflix/ribbon
2. Ribbon 进入维护状态
3. 官网地址: https://github.com/Netflix/ribbon
4. Ribbon 目前进入维护模式, 未来替换方案是Spring Cloud LoadBalancer
LB(Load Balance)
LB 分类
1. 集中式LB
即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是软件,如Nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方;LB(Load Balance 负载均衡)
2. 进程内LB
将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些服务地址可用,然后再从这些地址中选择出一个合适的服务地址。
Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址
实例-前面member-consumer 轮询负载访问10000/10002 底层就是Ribbon 默认的轮询负载算法
Ribbon 架构图&机制
Ribbon 机制
1. 先选择EurekaServer,它优先选择在同一个区域内负载较少的server
2. 再根据用户指定的策略,在从server 取到的服务注册列表中选择一个地址
3. Ribbon 提供了多种策略∶ 比如轮询、随机和根据响应时间加权
Ribbon 常见负载算法
替换负载均衡算法-应用实例
需求分析/图解
1. 需求: 将默认的轮询算法改成随机算法RandomRule
2. 浏览器输入: http://localhost/member/consumer/get/1
3. 要求访问的10000/10002 端口的服务是随机的
1.创建member-service-consumer-80 com/springcloud/config/RibbonRule.java
/**
* RibbonRule: 配置自己的负载均衡算法
*/
@Configuration
public class RibbonRule {
//配置注入自己的负载均衡算法
@Bean
public IRule myRibbonRule() {
//这里返回的是RandomRule,当然也可以自己指定
return new RandomRule();
}
}
2.修改member-service-consumer-80 com/springcloud/MemberConsumerApplication.java
//@EnableEurekaClient 将程序标识为eureka client
@EnableEurekaClient
@SpringBootApplication
@EnableDiscoveryClient //启用服务发现
//指定Ribbon的负载均衡算法
@RibbonClient(name = "MEMBER_SERVICE_PROVIDER_URL",configuration = RibbonRule.class)
public class MemberConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(MemberConsumerApplication.class,args);
}
}
测试
1. 浏览器输入: http://localhost/member/consumer/get/1
2. 观察访问的10000/10002 端口的服务是随机的
图片上面有 这里就不展示了
SpringCloud OpenFeign
OpenFeign 介绍
- OpenFeign 是个声明式WebService 客户端,使用OpenFeign 让编写Web Service 客户端更简单
- 它的使用方法是定义一个服务接口然后在上面添加注解
- OpenFeign 也支持可拔插式的编码器和解码器
- Spring Cloud 对OpenFeign 进行了封装使其支持了Spring MVC 标准注解和HttpMessageConverters
- OpenFeign 可以与Eureka 和Ribbon 组合使用以支持负载均衡
- 官网 https://github.com/spring-cloud/spring-cloud-openfeign
Feign 和OpenFeign 区别
Feign
- Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端
- Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务
- Feign的使用方式是:使用Feign的注解定义接口,调用服务注册中心的服务
- Feign支持的注解和用法请参考官方文档:https://github.com/OpenFeign/feign
- Feign本身不支持Spring MVC的注解,它有一套自己的注解
- 引入依赖
<!--引入feign-starter 就是场景启动器 使用版本仲裁-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
OpenFeign
- OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
- OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口
- OpenFeign通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
- 引入依赖
<!--引入openfeign-starter 就是场景启动器 使用版本仲裁-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
精简一句话:OpenFeign 就是在Feign 基础上做了加强, 有些程序员为了方便,说Feign就是指的OpenFeign
OpenFeign-应用实例
示意图
创建服务消费模块-通过OpenFeigen 实现远程调用
1. 参考member-service-consumer-80 创建member-service-consumer-openfeign-80(具体步骤参考以前)
SpringCloud Eureka 的详细讲解及示意图_尘觉的博客-CSDN博客
2. 修改pom.xml
拷贝member-service-consumer-80 的pom.xml 内容,加入openfeign-starter
<!--引入相关的依赖: 我们引入了当前需要的依赖,后面如果有其它需要,再灵活调整-->
<dependencies>
<!--引入openfeign-starter 就是场景启动器 使用版本仲裁-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--引入eureka client 场景启动器starter-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--引入web-starter 说明我们使用版本仲裁(从父项目继承了版本)
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--说明:starter-actuator 是springboot程序的监控系统, 可以实现系统的健康检测
可以通过http://localhost:80/actuator 看到相关的连接,和信息
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--引入e_commerce_center-common-api-->
<dependency>
<groupId>com.wyxedu.springcloud</groupId>
<artifactId>e_commerce_center-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
创建application.yml 内容如下
server:
port: 80
spring:
application:
name: e-commerce-consumer-openfeign-80
#配置eureka-client
eureka:
client:
register-with-eureka: true #将自己注册到Eureka-Server
fetch-registry: true
service-url:
#表示将自己注册到哪个eureka-server
#这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka
创建主启动类MemberConsumerOpenfeignApplication80.java
@SpringBootApplication
@EnableEurekaClient
//启动OpenFeignClient
@EnableFeignClients
public class MemberConsumerOpenfeignApplication {
public static void main(String[] args) {
SpringApplication.run(MemberConsumerOpenfeignApplication.class, args);
}
}
先测试一下看看程序有没有报错在执行后面的配置
创建com/springcloud/service/MemberFeignService.java,
注意:这里是OpenFeign 的核心
@Component
//这里MEMBER-SERVICE-PROVIDER 就是Eureka Server 服务提供方注册的名称
@FeignClient(value = "MEMBER-SERVICE-PROVIDER")
public interface MemberFeignService {
//这里定义方法-就是远程调用的接口
/**
* 1. 远程调用的方式是get
* 2. 远程调用的url http://MEMBER-SERVICE-PROVIDER/member/get/{id}
* 3. MEMBER-SERVICE-PROVIDER 就是服务提供方在Eureka Server 注册的服务
* 4. openfeign 会根据负载均衡来决定调用10000/10002-默认是轮询
* 5. 因为openfeign 好处是支持了springmvc注解 + 接口解耦
*/
@GetMapping("/member/get/{id}")
public Result getMemberById(@PathVariable("id") Long id);
}
创建com/springcloud/controller/MemberConsumerFeignController.java
@RestController
public class MemberConsumerFeignController {
//装配MemberFeignService
@Resource
private MemberFeignService memberFeignService;
@GetMapping(value = "/member/consumer/openfeign/get/{id}")
public Result getMemberById(@PathVariable("id") Long id) {
return memberFeignService.getMemberById(id);
}
}
测试
1. 浏览器输入: http://localhost/member/consumer/openfeign/get/1
2. 观察访问的10000/10002 端口的服务是轮询的
注意事项和细节
1. 配Openfeign的使用特点是微服务调用接口+@FeignClient , 使用接口进行解耦
2. @FeignClient(value = "MEMBER-SERVICE-PROVIDER")
这里MEMBER-SERVICE-PROVIDER就是Eureka Server服务提供方注册的名称, 不要写错了
3. 接口方法上: value是不能乱写
远程调用的url 为http://MEMBER-SERVICE-PROVIDER/member/get/{id}
@GetMapping(value = "/member/get/{id}")
public Result<Member> getMembertById(@PathVariable("id") Long id);
日志配置
基本介绍
1. 说明: Feign 提供了日志打印功能,可以通过配置来调整日志级别,从而对Feign 接口的调用情况进行监控和输出
2. 日志级别
- NONE∶默认的,不显示任何日志
- BASIC∶仅记录请求方法、URL、响应状态码及执行时间;
- HEADERS∶除了BASIC中定义的信息之外,还有请求和响应的头信息;
- FULL∶除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
配置日志-应用实例
1. 在member-service-consumer-openfeign-80 创建com/springcloud/config/OpenFeignConfig.java
@Configuration
public class OpenFeignConfig {
@Bean
public Logger.Level loggerLevel() {
//日志级别指定为FULL
return Logger.Level.FULL;
}
}
2. 在member-service-consumer-openfeign-80 修改application.yml
常见的日志级别有5 种,分别是error、warn、info、debug、trace
.
- error:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的;
- warn:警告日志,一般的错误,对业务影响不大,但是需要开发关注;
- info:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
- debug:用于开发DEBUG 的,关键逻辑里面的运行时数据;
- trace:最详细的信息,一般这些信息只记录到日志文件中。
server:
port: 80
spring:
application:
name: e-commerce-consumer-openfeign-80
#配置eureka-client
eureka:
client:
register-with-eureka: true #将自己注册到Eureka-Server
fetch-registry: true
service-url:
#表示将自己注册到哪个eureka-server
#这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka
logging:
level:
#对MemberFeignService 接口调用过程打印信息-Debug
com.wyxedu.springcloud.service.MemberFeignService: debug
测试
1 浏览器: http://localhost/member/consumer/openfeign/get/1
2 结果页面
别忘了,撤销测试日志配置
OpenFeign 超时
先看一个问题
1. 修改member-service-provider-10000/10002 的com/wyxedu/springcloud/controller/MemberController.java
//查询的方法/接口
//这里使用url占位符+@PathVariable
@GetMapping("/member/get/{id}")
public Result getMemberById(@PathVariable("id") Long id, HttpServletRequest request) {
//模拟超时, 休眠5s
try {
TimeUnit.MILLISECONDS.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Member member = memberService.queryMemberById(id);
//使用Result把查询到的结果返回
if (member != null) {
//return Result.success("查询会员成功 member-service-provider-10000 " + color + "-" + address, member);
return Result.success("查询会员成功 member-service-provider-10000", member);
} else {
return Result.error("402", "ID= " + id + "不存在");
}
}
2.浏览器访问http://localhost/member/consumer/openfeign/get/1
原因分析: OpenFeign 默认超时时间1 秒钟,即等待返回结果1 秒
设置超时时间
说明: 在某些情况下,一个服务调用时间可能要超过1 秒,就需要重新设置超时时间
1. 修改member-service-consumer-openfeign-80 的application.yml
server:
port: 80
spring:
application:
name: e-commerce-consumer-openfeign-80
#配置eureka-client
eureka:
client:
register-with-eureka: true #将自己注册到Eureka-Server
fetch-registry: true
service-url:
#表示将自己注册到哪个eureka-server
#这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka
#logging:
# level:
# #对MemberFeignService 接口调用过程打印信息-Debug
# com.wyxedu.springcloud.service.MemberFeignService: debug
ribbon:
#1. 设置feign客户端超时时间(openfeign默认支持ribbon)
#2. ReadTimeout: 8000: 建立连接从服务提供方获取可用资源的所用的全部时间
#3. 时间单位是毫秒
ReadTimeout: 8000
#两端连接所用时间
ConnectionTimeout: 8000
测试
1. 浏览器输出: http://localhost/member/consumer/openfeign/get/1, 不会出现超时,会轮询访问10000/10002
别忘了,撤销超时测试代码和配置