一、Ribbon
概述
SpringCloudRibbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,提供客户端的软件负载均衡算法和服务调用。
那么什么是客户端负载均衡?大家有听说过nginx吧,它是服务端负载均衡。它的意思是当客户端(比如用户)向你的服务器发起请求,会由nginx进行负载均衡选择转发,这就是服务端负载均衡
,也就是客户端无需任何选择,只用发给nginx就行了。
而Ribbon是被集成在客户端上,比如你的一个微服务A,当它需要请求另一个微服务B时,那么你的服务A就是客户端。它会从注册中心(Eureka,Nacos等)获取微服务B的集群,然后通过负载均衡选择合适的一个进行转发。在这个过程中,微服务B也就是服务端是无需任何选择,全由客户端进行选择。所以Ribbon被称为客户端负载均衡
。
使用
使用起来非常简单,先添加依赖。如果你已经添加了Eureka或者Nacos的依赖,那么无需再添加依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
然后在RestTemplate的配置类的@bean方法上加上@LoadBalanced。ribbon一般是搭配RestTemplate对象使用的,RestTemplate对httpclient进行了封装,可以进行远程的http请求,RestTemplate是在web包下的。
//RestTemplate 配置类
public class RestTemplateConfig{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
// 调用类
public class RestTemplateTest{
@Autowired
private RestTemplate restTemplate;
@getMapping("/test")
public void test1(){
// 没使用ribbon前,url需要使用ip地址+端口号
restTemplate.getForEntity("http://ip:port/XXX",返回对象.Class)
// 使用ribbon后
restTemplate.getForEntity("http://服务名/XXX",返回对象.Class)
}
}
二、Feign
概述
前面在使用Ribbon+RestTemplate 时, 利用 @LoadBalanced 注解 将RestTemplate 类加强,并实现客户端对服务端的调用并负载均衡,但是我们发现,在调用服务端时 必须手动指定其服务名,而客户端往往不止调用一个服务端,这使的Ribbon的使用变得复杂
Feign 集成了Ribbon,它是一个声明式的客户端工具,可以通过定义一个接口,并通过注解的方式生成代理类,封装了Ribbon的调用,它有一套自己的注解
OpenFeign是springcloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
使用
使用起来非常简单,先加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
创建一个接口,在接口加上@FeignClient("被调用的服务名")
注解
@Component
@FeignClient("被调用的服务名")
public interface FeignService {
在该接口中申明的方法要和被调用方提供的方法接口相同,
所以一般用这个接口直接继承被调用方的接口即可。
}
// 在需要使用的类中使用自动注入即可使用
@Autowire
FeignService feignService;