1. Ribbon 1.1 概念B站尚硅谷P36~P46
代码Gitee地址
以上次博客的eureka集群作为注册中心来演示。
Spring Cloud Ribbon 是基于Netflix Ribbon实现的一套客户端负载均衡工具。
即主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项,连接超时,重试等。
但更新也处于维护模式。
- 负载均衡:将用户的请求平坦到多个服务上,从而到达到系统的高可用。
- 与Nginx的区别:
- Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后又Nginx实现转发请求。集中式LB
- Ribbon是本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。进程内LB。
-
实际上,在引入下方依赖时,已经在服务调用端就已经引入了Ribbon。
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
实际上Ribbon就是负载均衡+RestTemplate。
-
getForEntity和getForObject的区别:
- getForEntity():返回对象为响应体中数据转化成的对象,基本上可以理解为Json;
- getForObject():返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等。
以如下代码演示:
@GetMapping("/payment/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id){ return restTemplate.getForObject(PAYMENT_URL+"/payment/" + id , CommonResult.class); } @GetMapping("/payment/entity/{id}") public CommonResult getEntityPaymentById(@PathVariable("id") Long id){ ResponseEntityentity = restTemplate. getForEntity(PAYMENT_URL + "/payment/" + id, CommonResult.class); return entity.getStatusCode().is2xxSuccessful() ? entity.getBody() : new CommonResult(444,"操作失败"); } 因为前后端分离大趋势,getForObject要比getForEntity用的多。
post请求的也是同理。
-
Ribbon中的负载均衡规则主要是实现了IRule接口的类。
-
自带轮询规则:
-
替换负载均衡方式(在order80下修改):负载均衡的配置文件,不能放在被@ComponentScan能够扫描到的子包的下面,否则配置类就会被所有的Ribbon客户端共享,无法特殊定制化。
新建一个包,与主启动类父包同层级,如图。
-
负载均衡配置类:在myrule包下新建:
@Configuration public class MySelfRule { @Bean public IRule myRule(){ return new RandomRule(); // 随机 } } -
修改主启动类:
@SpringBootApplication @EnableEurekaClient @RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class) public class OrderMain80 { public static void main(String[] args) { SpringApplication.run(OrderMain80.class,args); } }
OpenFeign是Spring Cloud项目组在Feign的基础上对其进行再次开发的项目。
是一个声明式的WebService客户端,使用方法是定义一个服务接口然后在上面添加注解。支持可插拔式的编码器和解码器,支持SpringMVC标准注解和HttpMessageConverers。可以与Eureka和Ribbon组合使用以支持负载均衡。
-
与Ribbon:
使用Ribbon+RestTemplate是,利用RestTemplate对Http请求的封装形成了一套模板化的调用方法。由于在实际开发时,对服务依赖可能不止一处,一个接口会被多处调用,通常会针对每个微服务自行封装一些客户端来包装这些依赖的调用。因此OpenFeign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。只需要创建一个接口并使用注解的方式来配置它就可以完成对服务提供方的接口绑定。
Feign也集成了Ribbon,实现了轮询的负载均衡,与Ribbon不同的是,它只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。 -
与Feign:
这里以eureka作为注册中心。
-
新建maven的module:cloud-consumer-feign-order80
-
pom:
org.springframework.cloud spring-cloud-starter-openfeign org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.example cloud-api-commons 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test -
配置文件
server: port: 80 #spring: # application: # name: cloud-order-service eureka: client: register-with-eureka: false # 不注册进eureka服务中心 service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/ -
主启动类
@SpringBootApplication @EnableFeignClients public class OrderFeignMain80 { public static void main(String[] args) { SpringApplication.run(OrderFeignMain80.class,args); } } -
业务类:这里的接口路径都是服务提供者的接口。
@Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") // 指定调用的微服务 public interface PaymentFeignService { @PostMapping("/payment/create") CommonResultcreate(Payment payment); @GetMapping("/payment/{id}") CommonResult getPaymentById(@PathVariable(value = "id") Long id); } -
controller:
@Slf4j @RestController @RequestMapping("/consumer") public class OrderFeignController { @Autowired private PaymentFeignService paymentFeignService; @PostMapping("/payment/create") public CommonResult create(@RequestBody Payment payment){ return paymentFeignService.create(payment); } @GetMapping("/payment/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id){ return paymentFeignService.getPaymentById(id); } } -
启动测试:可以调用成功,并且拥有负载均衡。
默认Feign客户端只等待一秒钟,但是服务端处理需要超过1秒钟,导致Feign客户端不再等待,直接返回报错。
为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制。
cloud-consumer-feign-order80模块yml配置文件添加:
#设置feign客户端超时时间 ribbon: #建立连接所用的时间 ReadTimeout: 5000 #建立连接后从服务器读取到可用资源的时间 ConncetTimeout: 50002.4 日志打印
日志等级有 4 种,分别是:
- NONE:不输出日志。
- BASIC:只输出请求方法的 URL 和响应的状态码以及接口执行的时间。
- HEADERS:将 BASIC 信息和请求头信息输出。
- FULL:输出完整的请求信息
-
配置类:
@Configuration public class FeignConfiguration { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } } -
主配置文件新增:
logging: level: # feign日志以 debug 级别监控以接口为准 com.jm.cloud.service.PaymentFeignService: debug



