一、Ribbon简介
1、基本概念
>Ribbon是一个客户端的负载均衡(Load Balancer,简称LB)器,它提供对大量的HTTP和TCP客户端的访问控制。
2、负载均衡简介
目前主流的负载均衡方案可分成两类:
1)集中式
>即在服务的消费方和提供方之间使用独立的LB设施,可以是硬件,如F5,也可以是软件,如nginx,由该设施负责把访问请求通过某种策略转发至服务的提供方;
2)进程内
>将LB逻辑集成到消费方,消费方从服务注册中心获取可用服务列表,然后根据指定负载均衡策略选择合适的服务器。Ribbon就属于该方式。
3、Ribbon负载策略

11) RoundRobinRule 轮询 2轮询服务列表List<server>的index,选择index对应位置的服务。 32) RandomRule 随机 4随机服务列表List<server>的index,选择index对应位置的服务。 53) RetryRule 重试 6指定时间内,重试(请求)某个服务不成功达到指定次数,则不再请求该服务。
二、Feign简介
1、基本概念
>Feign 是一个声明式的 Web Service 客户端。它的出现使开发 Web Service 客户端变得很简单。使用 Feign 只需要创建一个接口加上对应的注解,比如:@FeignClient 接口类注解。
2、执行流程
>1) 主程序入口添加 @EnableFeignClients 注解开启对 FeignClient 接口扫描加载。接口使用@FeignClient注解。
>2) 调用Feign 接口中的方法被时,通过JDK的代理的方式,生成具体的 RequestTemplate。
>3) RequestTemplate 生成 Request请求,结合Ribbon实现服务调用负载均衡策略。
三、综合使用案例
1、项目结构图

1)、模块描述
1Eureka注册中心 2node02-eureka-7001 3两个服务提供方 4node02-provider-6001 5node02-provider-6002 6Ribbon服务调用 7node02-consume-8001 8Feign服务调用 9node02-consume-8002
2)、依赖Eureka知识
上篇文章Eureka使用:
2、Ribbon服务调用
代码所属模块:node02-consume-8001
1)、核心依赖
1<dependency> 2 <groupid>org.springframework.cloud</groupid> 3 <artifactid>spring-cloud-starter-ribbon</artifactid> 4</dependency>
2)、配置文件
1@Configuration 2public class LoadConfig { 3 @Bean 4 @LoadBalanced 5 public RestTemplate getRestTemplate (){ 6 return new RestTemplate() ; 7 } 8 @Bean 9 public IRule getIRule (){ 10 // 默认轮询算法 11 // return new RoundRobinRule() ; 12 // 重试算法:默认情况,访问某个服务连续三次失败,就不会再访问 13 // return new RetryRule() ; 14 // 随机算法 15 return new RandomRule() ; 16 } 17} 18
3)、调用方式
1@RestController 2public class ConsumeController { 3 4 @Autowired 5 private RestTemplate restTemplate ; 6 7 String server_name = "http://NODE02-PROVIDER" ; 8 // http://localhost:8001/showInfo 9 @RequestMapping("/showInfo") 10 public String showInfo (){ 11 return restTemplate.getForObject(server_name+"/getInfo",String.class) ; 12 } 13 14}
这里的NODE02-PROVIDER就是服务提供方的配置文件。两个服务提供方的这块配置相同,Ribbon正基于此,实现多个服务调用的负载均衡。
1spring: 2 application: 3 name: node02-provider
4)、提供方接口
1@RequestMapping("/getInfo") 2public String getInfo (){ 3 LOG.info("provider-6002"); 4 return "success" ; 5}
3、Feign服务调用
代码所属模块:node02-consume-8002
1)、核心依赖
1<dependency> 2 <groupid>org.springframework.cloud</groupid> 3 <artifactid>spring-cloud-starter-feign</artifactid> 4</dependency>
2)、配置文件
1@FeignClient(value = "NODE02-PROVIDER") 2public interface GetAuthorService { 3 @RequestMapping(value = "/getAuthorInfo/{authorId}",method = RequestMethod.GET) 4 String getAuthorInfo (@PathVariable("authorId") String authorId) ; 5}
3)、调用方式
1@RestController 2public class ConsumeController { 3 @Resource 4 private GetAuthorService getAuthorService ; 5 @RequestMapping(value = "/getAuthorInfo") 6 public String getAuthorInfo () { 7 return getAuthorService.getAuthorInfo("1") ; 8 } 9}
4)、启动类注解
1// 因为包名路径不同,需要加basePackages属性 2@EnableFeignClients(basePackages={"cloud.block.code.service"})
5)、提供方接口
1@RequestMapping(value = "/getAuthorInfo/{authorId}",method = RequestMethod.GET) 2public String getAuthorInfo (@PathVariable("authorId") String authorId) { 3 LOG.info("provider-6002"); 4 return "知了一笑"+authorId ; 5}
四、源代码说明
1GitHub地址:知了一笑 2https://github.com/cicadasmile 3码云地址:知了一笑 4https://gitee.com/cicadasmile
</server></server>