目录
- Ribbon简单介绍
- 配置Ribbon
- 整合Eureka集群实现负载均衡
- 自定义选择负载均衡的方法
- Feign简单介绍
一、Ribbon的简单介绍
ribbon是什么
- Spring Cloud Ribbon 是基于Netflix Ribbon实现的一套 客户端负载均衡的工具
- 简单的说,Ribbon是Netflix发布的开源项目,主要的功能是提供客户端软件的负载均衡算法,将Netflix的中间层服务连接在一起。
- Ribbon的客户端组件提供一些列完整的配置如:连接超时、重试等。
- 简单的说,就在配置文件中列出LoadBalancer(简称LB:负载均衡)后面所有的机器,Ribbon会走动的帮助你基于某种规则(如简单轮询、随机连接等)去连接这些机器,相当于分发。我们很容易使用Ribbon实现自定义的负载均衡算法!
ribbon能干什么
- LB(Load Balance)即负载均衡,在微服务或者分布式集群中经常用的一种应用,实现高可用
- 常见的负载均衡软件有Nginx、Lvs、Apach + tomcat等
- dubbo、SpringcCloud中均给我们提供了负载均衡,Spring Cloud的负载均衡算法可以自定义
- 负载均衡简单分类
- 集中式LB:在服务的消费方和提供方之间使用独立的LB设施,如Nginx,由该设施复杂把访问的请求通过某种策略转发至服务的提供方
- 进程式LB:将LB的逻辑集成到消费方,有消费方自行从注册中心获取哪些地址可用,然后自己再从这些地址中选出一台合适的服务器。Ribbon就是进程内Lb,他只是一个类库,集成消费方进程,消费方通过他来获取到服务器提供方的地址!
基本使用(在服务消费者位置配置)
- 导依赖
- 配置Eureka集群
- 加RestTemplate获取Bean的地方加上
@LoadBalance
注解(默认轮询) - 自己配置负载均衡方法,新建一个外部的包,
@Bean
将IRule的某个待用负载均衡实现类放入容器
二、配置Ribbon
1.整合Eureka集群实现负载均衡
基本原理
基本步骤
- 导依赖Spring Cloud Starter Netflix Ribbon,
地址:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
- 导依赖:spring-cloud-starter-eureka
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
- 配置application.yml
配合Eureka三个服务注册中心负载均衡 - 注解开启Ribbon负载均衡
- 修改请求的resturl前缀
- 配置微服务数据库环境,集群中的每一个都对应一个数据库,最后访问测试,默认负载均衡的方式是轮询
2.自定义选择负载均衡方法
Ribbon的负载均衡的方法,IRule接口有很多实现类,主要是这些实现类实现负载均衡算法
- RoundRobinRule轮询
- RandomRule随机
- AvailabilityFilteringRule跳闸,会先过滤掉故障的服务,对剩下的进行轮询
- RetryRule:会先按照轮询获取服务,失败就找指定的时间内重试
这些实现类都继承了抽象类 AbstractLoadBalanceRule
,直接将该方法对应的实例@Bean
即可
3.使用随机RandomRule负载均衡代替默认的轮询
注意Ribbon的负载均衡客户端不能放在Application的上下文,需要单独写一个包
三、Feign简单介绍
Feign是什么
- 声明式的web service 客户端,他让微服务之间的调用变得更简单了,调用微服务接口的方式,类似controller 调用 service
- SpringCloud集成了Ribbon和Eureka,可以在使用Feign时提供负载均衡的http客户端
- 和Ribbon功能类似,对Ribbon调用方式再封装,面向接口为准,解决远程调用问题,配合Ribbon实现负载均衡
和Ribbon之间的区别,主要是调用微服务的方式不同,类似Dubbo+Zookeeper的调用方式
- feign:接口和注解
- ribbon:微服务名字
Feign能干什么
- 编写Java Http 客户端变得更容易
- 前面使用Ribbon + RestTemplate 时,利用RestTemplate 对Http 请求进行封装处理,形成了一套模板化的调用方式。但是在实际的开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用,所以,feign在此基础上做了进一步的封装,有他来帮助我们定义和实现 依赖服务接口的定义
- 在Feign的实现下,我们只需要创建一个接口并使用注解的方式配置它(类似以前Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可)完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon 是,自动封装服务调用客户端的开发
- feign集成了Ribbon,只不过是换了中调用的方式,将微服务名再封装
四、Feign配置
1. Feign实现远程过程调用
基本使用
- 导依赖Spring Cloud Starter Netflix Feign,
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-feign</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
- 在api模块写service接口里面包含业务方法,加上
@FeignClient
- 在服务消费者模块@Autowaired注入 引用 api 模块的servcie
- 在消费者的的controller的方法中,使用service实例调用远程api模块的业务逻辑方法
- 启动类注解@EnableFeignClients注解开启Feign