一、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;

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐