1.Ribbon含义
- Sping cloud Ribbon是基于Netfix实现的一套客户端负载均衡工具
- Ribbon是NetFix发布的一套开源项目,主要功能提供给客户端软件负载均衡方法,将Netfix的中间层服务连接在一起,Ribbon的客户端提供一系列完整的配置项:连接超时,重试等,简单地说,就是在配置文件中列出LoadBalance(负载均衡,LB),Ribbon会基于某种规则帮你连接服务器。
- 负载均衡就是将用户请求平摊分配到多个服务器,从而达到HA(高可用)
- 常见的负载均衡软件:Ngix
- Dubbo,SpringCloud都提供了负载均衡,SpringCloud提供的负载均衡可以自定义。
- 负载均衡简单分类:集中式:在服务的消费方和提供方提供独立的负载均衡设施,如Ngix反向代理,由该设施负责把访问的请求通过某种策略转发至服务的提供方。
- 负载均衡简单分类:进程式:将负载均衡逻辑集中到消费方,消费方从服务注册中心获知有哪些地址可用,然后再从地址中选一个合适的服务器,例如:Ribbon,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务方的地址
2.导入依赖包 、 编写配置、开启注解
因为时发生在客户端,所以应该在服务消费方中编写,导入ribbon和Eurek客户端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/
3.配置负载均衡实现template
地址应该是一个变量,修改成通过服务名来随机访问服务器:
Ribbon和Eureka整合以后客户端可以直接调用不用关心IP地址和端口号。
4.实现集群负载均衡
3.1配置多个服务提供者
将服务注册到Eureka中:
3.2启动eureka,多个服务提供者 ,消费者进行测试,
测试结果:轮询访问三个服务提供者。
5.自定义负载均衡算法
负载均衡算法实现了IRule接口,有以下几个负载均衡算法:
- RoundRobinRule:轮询
- RandomRule:随机
- AvailibityFilteringRule:会先过滤掉跳闸 访问故障的服务,对剩下的服务进行轮询。
- RetryRule:会先进行轮询,如果获取指定服务失败,会在一定时间内重新尝试获取。
自定义Ribbon客户端
5.1 添加注解,配置自己的算法类
name=“服务名”,configuration=“自定义算法的类”
注意:自定义的算法类不应该与启动类在同一个目录下,否则会被componentScan扫描到,请放在一个单独的,不重叠的包。
Feign–负载均衡
简介
feign是声明式的web service客户端,只需要创建一个接口,添加一个注解即可,feign主要是面向社区,调用微服务的两种方法
- 微服务名字:ribbon
- 接口和注解:feign
feign旨在使编写Http客户端变得更容易,在feign的实现下,只需创建一个接口,添加一个注解,类似(dao接口上标注Mapper注解,现在是一个微服务接口标注一个feign注解),即可完成服务提供方的接口的绑定,
1.添加feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
2.新建service
@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER")
public interface DeptClientService {
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Long id);
@GetMapping("/dept/getAll")
public List<Dept> queryAll();
@PostMapping("/dept/add")
public boolean addDept(Dept dept);
}
3.远程调用
@RestController
public class DeptConsumerController {
@Autowired
private DeptClientService deptClientService;
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Long id){
return deptClientService.queryById(id);
}
@GetMapping("/dept/getAll")
public List<Dept> queryAll(){
return deptClientService.queryAll();
}
@PostMapping("/dept/add")
public boolean addDept(Dept dept){
return deptClientService.addDept(dept);
}
}
2.开启注解