Springboot-微服务-微服务组件之服务管理-eureka-服务的高可用-ribbon

关键要点

  • 引入相关依赖

  • 在restTemplate 添加@LoadBalanced//开启负载均衡注解

入门使用方式

引入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-ribbon</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

在restTemplate 添加@LoadBalanced//开启负载均衡注解

package com.caicai;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient//开启eureka服务端的调用
@SpringBootApplication
public class ConsumerServiceApplication {
    //Spring boot 调用的接口都是rest风格的接口,这里我们使用,Spring 自带的resTemplate 去调用,它包含了:http,post 等等

    @Bean
    @LoadBalanced//开启负载均衡注解
    public RestTemplate restTemplate(){

        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(ConsumerServiceApplication.class);
    }
}



客户端根据服务名称进行调用

以下代码包含了多种方式,由繁琐到简单。ribbon有多种负载均衡算法,默认的是轮询


package com.caicai.Consumer.Control;


import com.caicai.Consumer.po.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
@RequestMapping("consumer")
public class ConsumerControl {
    @Autowired
    private RestTemplate restTemplate;

//    @Autowired
//    private DiscoveryClient discoveryClient; //这里的discoverclient 是Spring下面的discovercliet
   //写死调用方式
//    @GetMapping("{id}")
//    public User queryById(@PathVariable("id") Long id)
//    {
//          String url = "http://localhost:8081/user/"+id;
//          User user = restTemplate.getForObject(url,User.class);
//          return user;
//
//    }

    //动态调用方式 五负载均衡的方式运行,比较low
//   @GetMapping("{id}")
//    public User queryById(@PathVariable("id") Long id)
//    {
//          //根据服务ID 获取实例
//          List<ServiceInstance> instances =   discoveryClient.getInstances("user-service");
//          //从实例种获取相关信息
//           ServiceInstance instance =   instances.get(0);
//          String url = "http://"+instance.getHost()+":"+instance.getPort()+"/user/"+id;
//          System.out.println(url);
//          User user = restTemplate.getForObject(url,User.class);
//          return user;
//
//    }



//带有负载均衡,调用方式
//第一种方式,还是太麻烦
//    @Autowired
//    private RibbonLoadBalancerClient loadBalancerClient; //这里的discoverclient 是Spring下面的discovercliet
//
//    @GetMapping("{id}")
//    public User queryById(@PathVariable("id") Long id)
//    {
//        //从实例种获取相关信息
//        //这里已经做了负载均衡
//        ServiceInstance instance =   loadBalancerClient.choose("user-service");
//        //获取实例,进行拆分
//        String url = "http://"+instance.getHost()+":"+instance.getPort()+"/user/"+id;
//
//        System.out.println(url);
//        User user = restTemplate.getForObject(url,User.class);
//        return user;
//
//    }


//通俗易懂的方式

    @GetMapping("{id}")
    public User queryById(@PathVariable("id") Long id)
    {
        //更具服务直接写url,原因是ribbon有一个拦截器,拦截一切rest请求方式,它会根据你请求的地址,获取服务名,然后根据服务名获取hostname、port,轮询之后,返回给你使用。
        String url = "http://user-service/user/"+id;
        User user = restTemplate.getForObject(url,User.class);
        return user;

    }



}



ribbon 也提供可以修改轮询的方式,这个可以在官网上面能查的到

SpringBoot也帮我们提供了修改负载均衡规则的配置入口:

user-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

格式是:{服务名称}.ribbon.NFLoadBalancerRuleClassName,值就是IRule的实现类。

开开心心,上班! 快快乐乐,游玩! 及时行乐!