spring-cloud 学习笔记 - 外传(3)

2021年11月24日 阅读数:4
这篇文章主要向大家介绍spring-cloud 学习笔记 - 外传(3),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

[外传] 关于 Ribbon 和 Feign

  在微服务消费的学习过程当中,我并无像别的博主使用Feign和Ribbon。由于这两个东西若是直接放到博文中可能会致使读者的混乱,搞不清楚这二者的关系,因此我单独写一篇来介绍这二者的关系。java

一. 关于Ribbon

什么是 Ribbon

Spring Cloud Netflix Ribbon 是由 Netflix 开源的客户端负载均衡的组件。使用 java 语言实现。nginx

说白了,ribbon像是nginx中的负载均衡组件同样,用来实现客户端的负载均衡。spring

为何使用 Ribbon

Ribbon做为后端负载均衡器,比Nginx更注重的是承担并发而不是请求分发,能够直接感知后台动态变化来指定分发策略。 ---Lovnx : Ribbon负载均衡策略配置json

从上面这段话咱们能够看出,和nginx的定位不同,nginx是被动分发请求,而Ribbon是主动选择不一样的服务提供者,Ribbon的服务提供者又来至于服务注册中心eureka或者consul等。segmentfault

Ribbon有什么特色

说白了,Ribbon的最大的优点就是背靠Spring Cloud Netflix这座大山,做为Netflix全家桶中的一员,Ribbon拥有天生的整合优点。后端

如何使用 Ribbon

若是使用的是RestTemplate框架的话,只须要在RestTemplate初始化的方法上面加一个@LoadBalanced就能够了。性能优化

@Bean
@LoadBalanced
RestTemplate restTemplate() {
    return new RestTemplate();
}

二. 关于Feign

什么是Feign

Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,而后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign能够与Eureka和Ribbon组合使用以支持负载均衡。 ---spring-cloud官方手册中文翻译 : 声明式REST客户端:Feign并发

如何使用

首先在pom.xml中引入资源:app

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

使用spring-cloud-starter-feign会默认引入ribbon的包,也就是说feign是默认集成了ribbon的负载均衡

修改Application主类,添加@EnableFeignClients注解,以启用Feign:

@SpringBootApplication
@EnableAutoConfiguration
@EnableDiscoveryClient
@EnableFeignClients
public class SpringCloudServerConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudServerConsumerApplication.class, args);
    }
}

建立远程调用接口类HelloClient.java

@FeignClient(name = "SPRING-CLOUD-EUREKA-CLIENT")
public interface HelloClient {

    @RequestMapping(method = RequestMethod.POST,value = "/say",consumes = "application/json")
    String say();
}

在@FeignClient中使用一个字符串(例子中的"SPRING-CLOUD-EUREKA-CLIENT")来指定客户端名字,这个名字也将被用于一个Ribbon负载均衡器。 还能够配置url属性来指定URL。 在Spring容器中会使用全限定名做为这个Bean的名称。一样,能够经过name属性进行自定义。 在上例中,经过@Qualifier("helloClient")就能够引用到这个Bean。 若是须要改变默认引用名称,能够在@FeignClient中配置qualifier属性。

使用接口调用实现:

@RestController
public class ServerCallController {

    @Autowired
    private HelloClient helloClient;

    @RequestMapping("/callServer")
    public String callServer(){
        return helloClient.say();
    }
}

参考文章

上述的Feign使用是很是基础的实现,若是须要实现更多的内容,能够参考如下文章:

结束

本文部分文原本源于互联网

感谢如下文章提供的灵感和帮助