Springboot-微服務-微服務元件之服務管理-eureka-服務的高可用-ribbon
阿新 • • 發佈:2021-07-17
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; } }