SpringCloud(二)之feign和ribbon

SpringCloud(二)之feign和ribbon

1.ribbon

ribbon的作用,如果像上篇一样我们调用的话写死固定的节点,这样我们的服务还是一个单点调用。ribbon就是实现服务多个提供者之间的负载均衡的一个插件。

集成ribbon

a.导入ribbon的依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>

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

b.启动类添加注解**@RibbonClient(name = “PROVIDER-EUREKA”)**:

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "PROVIDER-EUREKA")
public class RibbonConsumerAppklication {

    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumerAppklication.class);
    }

    @Bean
    @LoadBalanced //默认轮询
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

注解LoadBalanced就是开启负载均衡策略,默认是轮询策略。

c.controller层代码

@Autowired
private RestTemplate restTemplate;

@Autowired
private LoadBalancerClient loadBalancerClient;


@GetMapping("/ribbon")
public String hiRibbion(){
    String result = restTemplate.getForObject("http://PROVIDER-EUREKA/hi/ribbon", String.class);
    ServiceInstance choose = loadBalancerClient.choose("PROVIDER-EUREKA");
    System.out.println(choose.getHost()+choose.getPort());
    return result+choose.getUri();
}

直接使用RestTemplate通过服务名调用服务,LoadBalancerClient对象可以获取服务提供者的详细信息。我们可以打印控制太看他的负载均衡策略是什么样子的。

d.自定义ribbon的负载均衡测策略

最简单的就是直接在yml配置文件中配置即可:

PROVIDER-EUREKA: #要设置 ribbon 的服务的名字
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡的规则 随机

其他的策略配置和其他的方式自定义负载策略的方式可以参考springcloud的官方文档。

2.feign

feign的内部其实就是封装了ribbon和RestTemplate的操作我们通过一个接口和注解就可以操作了。只是进行了分封装,简化了操作。

a.第一步当然还是导入feign的依赖。(feign的依赖中已经包含了ribbon的了)

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

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

b.第二步实现一个接口,进行feign的配置

@FeignClient("PROVIDER-EUREKA")//内部其实就是通过ribbon和restTemplate实现的帮我们省略了实现的过程
public interface ProviderService {
    @RequestMapping("/hi/feign")
    String hiFiegn();
}

c.最后在controller中注入接口,调用方法即可。

    @Autowired
    private   ProviderService providerService;

    @GetMapping("/feign")
    public String hiFeign(){
        return providerService.hiFiegn();
    }

ribbon就是为了实现消费者对服务提供者负载均衡调用的插件,防止服务中出现单点故障。feign就是对我们用ribbon实现服务提供者负载均衡过程的一个封装,用起来更加简便,直接使用即可。å

猜你喜欢

转载自blog.csdn.net/weixin_39034379/article/details/85329709