一、引入
上面那個使用者一直都是訪問的第一個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發送一次心跳檢測。輪詢到關掉的服務之後就會報連接錯誤。
測試覺得麻煩可以關閉自我保護機制,線上使用一定要開啓。
因爲雖然彙報一兩次錯,若返回錯誤次數多了就不會輪詢這個服務。開啓保護機制之後服務註冊不會被刪除,過一會再訪問他還是會先去嘗試使用掉線的服務,報錯了之後不再使用。等待他重新接入。
沒有保護機制就直接刪除服務。最簡單的就是斷網了的情況,後面如果回覆通信了,可是服務已經被刪除了,需要重新啓動服務服務纔行。