1. 程式人生 > >spring cloud 入門(五)【負載均衡與 FeignClient 容錯機制一(通過類容錯)】

spring cloud 入門(五)【負載均衡與 FeignClient 容錯機制一(通過類容錯)】

一 負載均衡

spring cloud 負載均衡非常簡單,現在服務提供者 menu,重新copy 一份munu ,命名 menu2 ,將埠 修改為 8764 ,其他配置都不變

這個時候 如何 再次呼叫 user/getMenu 介面, 檢視 menu 和 menu2 的日誌,我們可以看出來,user 訪問一次,兩個 menu 是通過 輪詢交替訪問的

容錯機制

 

容錯是榮的 伺服器 提供者的 錯,如何服務提供者 程式碼邏輯有問題,就會報錯

修改 menu 提供者  menu/getMenu 程式碼,

修改  MenuController 程式碼,直接拋異常

@RequestMapping(value = "/menu/getMenu")
public @ResponseBody
List<Map<String, Object>>
getSubNav(HttpServletRequest request, HttpServletResponse response) {
    throw new RuntimeException();
}

這個時候,我們再通過 user 呼叫 menu 微服務 中getMenu 的方法

顯然 這個將錯誤 直接列印到頁面上 是非常不友好的

 

spring cloud 提供了  Hystric 元件 對這樣的問題進行處理,具體操作如下:

以下操作都再服務消費方進行修改,也就是在user中 進行修改

第一個坑: 

feign.hystrix.enabled=true  這個預設是false 需要手動開啟

user 中 application.properties  中

server.port=8763
eureka.client.service-url.defaultZone = http://localhost:8761/eureka/
spring.application.name=user
spring.profiles.active=dev
feign.hystrix.enabled=true

UserService 中 新增   fallback 失敗回撥

@FeignClient(value = "menu", fallback = UserServiceHystric.class)

程式碼如下:

package com.study.user.service;


import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;
import java.util.Map;

@FeignClient(value = "menu", fallback = UserServiceHystric.class)
public interface UserService {


    @RequestMapping(value="menu/getMenu")
    List<Map<String, Object>> getMenu();


}

建立 UserServiceHystric 程式碼如下 需要實現 getMenu 方法

 

package com.study.user.service;

import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class UserServiceHystric implements UserService {

    @Override
    public List<Map<String, Object>> getMenu() {
        List<Map<String, Object>> list = new ArrayList<>();
        Map<String, Object> map = new HashMap<>();
        map.put("menu", "選單");
        list.add(map);
        return list;
    }
}

再次訪問  http://127.0.0.1:8763/user/getMenu

 

容錯返回的內容可以根據我們實際情況,自己定義