【SpringCloud】簡單應用(三)——Ribbon負載均衡

一、引入

上面那個使用者一直都是訪問的第一個goods-serivce服務,那如果我有很多個service服務,後面豈不是都是沒用的,所以我們要解決這一問題。現版本的Eureka Server已經自動集成了Ribbon無需引入。

二、開啓多個goods服務

現來模擬有3個goods-server服務
更改goods配置文件中的端口號
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
再打印一下信息,這樣讓我們知道是那個服務收到的信息

@RestController
@RequestMapping(value = "/goods" ,produces ="application/json;charset=UTF-8")
public class GoodsController {
    @Autowired
    GoodsService goodsService;
    @GetMapping("/{id}")
    public JSONObject get(@PathVariable("id") int id){
        System.out.println("1號收到請求");
        return goodsService.findGoodsByID(id);
    }
}

因爲是直接用的同一個項目開啓服務,所以一定要修改之後再選擇對應的啓動器
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
開啓3個之後我們再Eureka中查看一下
在這裏插入圖片描述

三、開啓負載均衡

在order的restTemplate上添加`` @LoadBalanced```

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

修改實現類

	@Autowired
    RestTemplate restTemplate;

    @Override
    public JSONObject queryOrderByUserIDII(int id) {
        List<Order> orders = orderMapper.queryOrderByUserIDII(id);
        JSONArray goods = new JSONArray();
        for (Order order:orders){
            /**
             * 有多臺服務器用ribbon做負載均衡
             */
            String service = "goods-service";
            String url = "http://" + service + "/goods/" + order.getGoods_id();
            Goods good =restTemplate.getForObject(url,Goods.class);
            JSONObject jsonObject = (JSONObject) JSONObject.toJSON(good);
            goods.add(jsonObject);
        }
        JSONObject returnJsono = new JSONObject();
        returnJsono.put("code",200);
        returnJsono.put("msg","success");
        returnJsono.put("data",goods);
        return returnJsono;
    }

四、查看是否實現

在提供的數據中2017用戶的訂單有兩個,那麼就會查詢兩次物品信息
再次訪問http://localhost:8888/order/query/2017在打印臺中我們能看知道
在這裏插入圖片描述
在這裏插入圖片描述
多刷新幾次就會發現2條信息,總會有一個服務不用做事,這就是輪詢的方式實現負載均衡,當使用者發來請求,註冊中心會將調用多個同名服務中的下一個。

五、總結

我們關掉三個中的一個服務,刷新三次其中兩次出現這樣的問題:
在這裏插入圖片描述
另外一次就會成功查詢。
  因爲我們模擬了一個服務宕機,但是他沒有從Eureka服務中立即刪除。Eureka自我保護機制,當其註冊表裏服務因爲網絡或其他原因出現故障而關停時,Eureka不會剔除服務註冊,而是等待其修復,90s發送一次心跳檢測。輪詢到關掉的服務之後就會報連接錯誤。
  測試覺得麻煩可以關閉自我保護機制,線上使用一定要開啓
  因爲雖然彙報一兩次錯,若返回錯誤次數多了就不會輪詢這個服務。開啓保護機制之後服務註冊不會被刪除,過一會再訪問他還是會先去嘗試使用掉線的服務,報錯了之後不再使用。等待他重新接入。
  沒有保護機制就直接刪除服務。最簡單的就是斷網了的情況,後面如果回覆通信了,可是服務已經被刪除了,需要重新啓動服務服務纔行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章