一、Ribbon 简述
Ribbon是spring cloud 的客户端负载均衡组件。
SpringCloud Ribbon 是一个基于HTTP 和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松的,面向服务的REST模板请求自动转换成客户端负载均衡的服务调用。
什么是负载均衡?
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。
什么是客户端负载均衡?
Spring cloud 客户端负载均衡是在客户端中维护着自己想要访问的服务清单,这些清单来源于服务注册中心。于服务端负载均衡不同在于服务端负载均衡的服务清单是无法自己进行维护的。
在Spring Cloud 构建的微服务集群中,不同服务之间的通信是通过HTTP的Rest请求完成的,可能出现A服务对B的大量Rest请求,这个时候就要对A服务做客户端的负载均衡,B服务要创建多个实例来就收这些负载均衡后的Rest请求。
二、Feign简述
-
Feign是什么?
Feign 是一个声明式 WebService 客户端。使用 Feign 能让编写的 WebService 客户端更加简洁,它的使用方法式定义一个接口,然后在上面添加注解。
Spring Cloud 对 Feign 进行了封装,使其支持了 Spring MVC 标准注解和 HttpMessageConverters。Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡。 -
为什么使用Feign?
Feign 旨在使编写 Java Http 客户端变得更容易。 前面在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 http 请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。 所以,Feign 在此基础上做了进一步的封装,由它来帮助我们定义和实现依赖服务接口的定义。 使用 Feign 只需要创建一个接口并使用一个注解来配置它即可。这就类似于我们在 dao 层的接口上标注 @Mapper 注解一样。这样的话,即完成了对服务提供方的接口绑定,简化了使用 Spring Cloud Ribbon 时的开发量。我们用实例来说明。http://blog.itpub.net/31558358/viewspace-2565058/
三、Feign 实例
服务提供端:
1.正常写接口:
服务消费端:
1.pom.xml依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
这个依赖中包含:ribbon依赖
Ribbon的依赖,不用添加
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.启动类添加注解:@EnableFeignClients
@EnableFeignClients 会扫描程序中的@FeignClient注解(feign注册器)
3.添加注册器注解:
@FeignClient(value = "${feign.client.student.server.serverName}")
public interface StudentService {
@PostMapping(value = "/api/student/findAllStudent")
@ApiOperation(value = "调用教师端查询所有学生")
String findAllStudents(@RequestParam("id") String id);
}
3.设置@FeignClient属性值
其中value 的值代表要访问的微服务的名称,配置在application.properties:
feign.client.student.server.serverName=Eureka-Client-School
另一位微服务名称:
#可以指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问。
spring.application.name=Eureka-Client-School
代码中的请求路径与服务提供端一致:
@PostMapping(value = "/api/student/findAllStudent")
@FeignClient注解的一些属性:
属性名 | 作用 |
---|---|
value | 调用服务名称,和name属性相同 |
serviceId | 服务id,作用和name属性相同 |
name | 调用服务名称,和value属性相同 |
url | 全路径地址或hostname,http或https可选 |
decode404 | 配置响应状态码为404时是否应该抛出FeignExceptions |
configuration | 自定义当前feign client的一些配置 |
fallback | 熔断机制,调用失败时,走的一些回退方法,可以用来抛出异常或给出默认返回数据。 |
path | 自动给所有方法的requestMapping前加上前缀,类似与controller类上的requestMapping |