1. 程式人生 > 其它 >Springboot-微服務-微服務元件之服務管理-eureka-服務的高可用-ribbon

Springboot-微服務-微服務元件之服務管理-eureka-服務的高可用-ribbon

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;

    }



}



開開心心,上班! 快快樂樂,遊玩! 及時行樂!