1. 程式人生 > >[Spring cloud 一步步實現廣告系統] 19. 監控Hystrix Dashboard

[Spring cloud 一步步實現廣告系統] 19. 監控Hystrix Dashboard

在之前的18次文章中,我們實現了廣告系統的廣告投放廣告檢索業務功能,中間使用到了 服務發現Eureka服務呼叫Feign,閘道器路由Zuul以及錯誤熔斷HystrixSpring Cloud元件。
簡單呼叫關係:

但是系統往往都會報錯,我們之前定義了一些容錯類和方法,但是隻是在控制檯可以看到錯誤資訊,我們想要統計一些資料,怎麼才能更直觀的看到我們的服務呼叫情況呢,接下來,和大家討論一個新的熔斷監控元件Hystrix Dashboard,顧名思義,從名字上我們就能看出來,它是監控的圖形化介面。

Hystrix 在服務中的使用

結合openfeign使用

在我們實際的專案當中,使用的最多的就是結合FeignClient#fallback

Hystrix一起來實現熔斷,我們看一下我們在mscx-ad-feign-sdk中的實現。

@FeignClient(value = "mscx-ad-sponsor", fallback = SponsorClientHystrix.class)
public interface ISponsorFeignClient {
    @RequestMapping(value = "/ad-sponsor/plan/get", method = RequestMethod.POST)
    CommonResponse<List<AdPlanVO>> getAdPlansUseFeign(@RequestBody AdPlanGetRequestVO requestVO);

    @RequestMapping(value = "/ad-sponsor/user/get", method = RequestMethod.GET)
    /**
     * Feign 埋坑之 如果是Get請求,必須在所有引數前新增{@link RequestParam},不能使用{@link Param}
     * 會被自動轉發為POST請求。
     */
    CommonResponse getUsers(@RequestParam(value = "username") String username);
}

在上述程式碼中,我們自定義了一個feignclient,並且給了這個client一個fallback的實現類:

@Component
public class SponsorClientHystrix implements ISponsorFeignClient {
    @Override
    public CommonResponse<List<AdPlanVO>> getAdPlansUseFeign(AdPlanGetRequestVO requestVO) {
        return new CommonResponse<>(-1, "mscx-ad-sponsor feign & hystrix get plan error.");
    }

    @Override
    public CommonResponse getUsers(String username) {
        return new CommonResponse<>(-1, "mscx-ad-sponsor feign & hystrix get user error.");
    }
}

這個fallback類實現了我們自定義的ISponsorFeignClient,那是因為fallback的方法必須和原始執行類的方法簽名保持一致,這樣在執行失敗的時候,可以通過反射對映到響應的降級方法/容錯方法。
mscx-ad-search服務中,我們通過注入ISponsorFeignClient來呼叫我們的mscz-ad-sponsor服務。

@RestController
@Slf4j
@RequestMapping(path = "/search-feign")
public class SearchFeignController {

    /**
     * 注入我們自定義的FeignClient
     */
    private final ISponsorFeignClient sponsorFeignClient;
    @Autowired
    public SearchFeignController(ISponsorFeignClient sponsorFeignClient) {
        this.sponsorFeignClient = sponsorFeignClient;
    }

    @GetMapping(path = "/user/get")
    public CommonResponse getUsers(@Param(value = "username") String username) {
        log.info("ad-search::getUsersFeign -> {}", JSON.toJSONString(username));
        CommonResponse commonResponse = sponsorFeignClient.getUsers(username);
        return commonResponse;
    }
}
使用HystrixCommand

其實Hystrix本身提供了一種直接在方法中應用的方式,就是使用@ com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand,我們看一下這個類的原始碼:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface HystrixCommand {
    ...

        /**
     * Specifies a method to process fallback logic.
     * A fallback method should be defined in the same class where is HystrixCommand.
     * Also a fallback method should have same signature to a method which was invoked as hystrix command.
     * for example:
     * <code>
     *      @HystrixCommand(fallbackMethod = "getByIdFallback")
     *      public String getById(String id) {...}
     *
     *      private String getByIdFallback(String id) {...}
     * </code>
     * Also a fallback method can be annotated with {@link HystrixCommand}
     * <p/>
     * default => see {@link com.netflix.hystrix.contrib.javanica.command.GenericCommand#getFallback()}
     *
     * @return method name
     */
    String fallbackMethod() default "";

    ...
}

我們主要關注2個點:

  1. @Target({ElementType.METHOD})表明當前的註解只能應用在方法上面。
  2. 可直接定義fallbackMethod來保證容錯。這個方法有一個缺陷,就是必須和執行方法在同一個類檔案中,這就會造成我們的方法在實現的時候,顯得特別的冗餘和不夠優雅。

以我們的mscx-ad-search中的廣告查詢為例:

@Service
@Slf4j
public class SearchImpl implements ISearch {

    /**
     * 查詢廣告容錯方法
     *
     * @param e 第二個引數可以不指定,如果需要跟蹤錯誤,就指定上
     * @return 返回一個空map 物件
     */
    public SearchResponse fetchAdsFallback(SearchRequest request, Throwable e) {

        System.out.println("查詢廣告失敗,進入容錯降級 : %s" + e.getMessage());
        return new SearchResponse().builder().adSlotRelationAds(Collections.emptyMap()).build();
    }

    @HystrixCommand(fallbackMethod = "fetchAdsFallback")
    @Override
    public SearchResponse fetchAds(SearchRequest request) {
        ...
    }
}

在我們請求出錯的時候,會轉到我們的fallback方法,這個實現是通過在應用啟動的時候,我們開始了@EnableCircuitBreaker註解,這個註解會通過AOP攔截所有的HystrixCommand方法,將HystrixCommand整合到springboot的容器中,並且將註解標註的方法放入hystrix的執行緒中,一旦失敗,通過反射呼叫fallback方法來實現。

建立dashboard project

上述程式碼我們看了Hystrix實現熔斷的2種方式,接下來我們來實現請求監控的圖形化介面,建立mscx-ad-dashboard,Let's code.
依然遵從我們springboot專案的三部曲:

  1. 加依賴

    <dependencies>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-hystrix</artifactId>
             <version>1.2.7.RELEASE</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
             <version>1.2.7.RELEASE</version>
         </dependency>
         <!--eureka client-->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
     </dependencies>
  2. 加註解

    /**
       * AdDashboardApplication for Hystrix Dashboard 啟動類
       *
       * @author <a href="mailto:[email protected]">Isaac.Zhang | 若初</a>
       * @since 2019/8/15
       */
        @SpringBootApplication
        @EnableDiscoveryClient
        @EnableHystrixDashboard
        public class AdDashboardApplication {
    
            public static void main(String[] args) {
                SpringApplication.run(AdDashboardApplication.class, args);
            }
        }
  3. 改配置

        server:
            port: 1234
        spring:
            application:
                name: mscx-ad-dashboard
        eureka:
            client:
                service-url:
                defaultZone: http://server1:7777/eureka/,http://server2:8888/eureka/,http://server3:9999/eureka/
        management:
            endpoints:
                web:
                exposure:
                    include: "*"`

直接啟動,可以看到如下頁面:

新增要監控的服務地址:

相關推薦

[Spring cloud 步步實現廣告系統] 19. 監控Hystrix Dashboard

在之前的18次文章中,我們實現了廣告系統的廣告投放,廣告檢索業務功能,中間使用到了 服務發現Eureka,服務呼叫Feign,閘道器路由Zuul以及錯誤熔斷Hystrix等Spring Cloud元件。 簡單呼叫關係: 但是系統往往都會報錯,我們之前定義了一些容錯類和方法,但是隻是在控制檯可以看到錯誤資訊

[Spring cloud 步步實現廣告系統] 3. 閘道器路由

Zuul(Router and Filter) WIKI: 傳送門 作用 認證,鑑權(Authentication/Secur

[Spring cloud 步步實現廣告系統] 4. 通用程式碼模組設計

一個大的系統,在程式碼的複用肯定是必不可少的,它能解決: 統一的響應處理(可以對外提供統一的響應物件包裝) 統一的異常處理

[Spring cloud 步步實現廣告系統] 7. 中期總結回顧

在前面的過程中,我們建立了4個project: 服務發現 我們使用Eureka 作為服務發現元件,學習了Eureka Server

[Spring cloud 步步實現廣告系統] 2. 配置專案結構 & 實現Eureka服務

父專案管理 首先,我們在建立投放系統之前,先看一下我們的工程結構: mscx-ad-sponsor就是我們的廣告投放系統。如上結

[Spring cloud 步步實現廣告系統] 14. 全量索引程式碼實現

上一節我們實現了索引基本操作的類以及索引快取工具類,本小節我們開始實現載入全量索引資料,在載入全量索引資料之前,我們需要先將資料庫中的表資料匯出到一份檔案中。Let's code. 1.首先定義一個常量類,用來儲存匯出檔案儲存的目錄和檔名稱 因為我們匯出的檔案需要在搜尋服務中使用到,因此,我們將檔名 &am

[Spring cloud 步步實現廣告系統] 15. 使用開源元件監聽Binlog 實現增量索引準備

MySQL Binlog簡介 什麼是binlog? 一個二進位制日誌,用來記錄對資料發生或潛在發生更改的SQL語句,並以而進

[Spring cloud 步步實現廣告系統] 16. 增量索引實現以及投送資料到MQ(kafka)

實現增量資料索引 上一節中,我們為實現增量索引的載入做了充足的準備,使用到mysql-binlog-connector-java 開源元件來實現MySQL 的binlog監聽,關於binlog的相關知識,大家可以自行網路查閱。或者可以mailto:[email protected] 本節我們將根據

[Spring cloud 步步實現廣告系統] 17. 根據流量型別查詢廣告

廣告檢索服務 功能介紹 媒體方(手機APP開啟的展示廣告,走在路上看到的大螢幕廣告等等) 請求資料物件實現 從上圖我們可以看出,在媒體方向我們的廣告檢索系統發起請求的時候,請求中會有很多的請求引數資訊,他們分為了三個部分,我們來編碼封裝這幾個引數物件資訊以及我們請求本身的資訊。Let's code.

[Spring cloud 步步實現廣告系統] 18. 查詢返回廣告創意

根據三個維度繼續過濾 在上一節中我們實現了根據流量資訊過濾的程式碼,但是我們的條件有可能是多條件一起傳給我們的檢索服務的,本節我們繼續實現根據推廣單元的三個維度條件的過濾。 在SearchImpl類中新增過濾方法 public class SearchImpl implements ISearch {

[Spring cloud 步步實現廣告系統] 20. 系統執行測試

系統執行 經過長時間的編碼實現,我們的主體模組已經大致完成,因為之前我們都是零散的對各個微服務自行測試,接下來,我們需要將所有的服務模組進行聯調測試,Let's do it. 清除測試資料&測試檔案 我們在實現各個服務的過程中,添加了不少的測試檔案和測試資料,為了不影響我們最終的展示效果,我們先將之前

[Spring cloud 步步實現廣告系統] 21. 系統錯誤彙總

廣告系統學習過程中問題答疑 部落格園 Eureka叢集啟動報錯 Answer 因為Eureka在叢集啟動過程中,會連線叢集中其他的機器進行資料同步,在這個過程中,如果別的服務還沒有啟動完成,就會出現Connection refused: connecterror,當其他節點啟動完成之後,報錯就會消失。 AdS

[Spring cloud 步步實現廣告系統] 22. 廣告系統回顧總結

到目前為止,我們整個初級廣告檢索系統就初步開發完成了,我們來整體回顧一下我們的廣告系統。 整個廣告系統編碼結構如下: 1.mscx-ad 父模組 主要是為了方便我們專案的統一管理 2.mscx-ad-db 這個模組主要有2個作用,本身只應該作為資料庫指令碼管理package來使用,但是我們在生成索引

步步實現web程式資訊管理系統之二--後臺框架實現跳轉登陸頁面

SpringBoot springboot的目的是為了簡化spring應用的開發搭建以及開發過程。內部使用了特殊的處理,使得開發人員不需要進行額外繁鎖的xml檔案配置的編寫,其內部包含很多模組的配置只需要新增maven依賴即可使用,這項功能可謂對開發人員提供了大大的好處。使用springboot

步步實現 Redis 搜索引擎

行集 準備 exp sta 發的 ast 註意 自己 內容 來源:jasonGeng88 github.com/jasonGeng88/blog/blob/master/201706/redis-search.md 如有好文章投稿,請點擊 → 這裏了解詳情 場景 大家如

WPF步步實現完全無邊框自定義Window(附源碼)

nbsp interop -c 思路 pan cit 最終 auto pre 在我們設計一個軟件的時候,有很多時候我們需要按照美工的設計來重新設計整個版面,這當然包括主窗體,因為WPF為我們提供了強大的模板的特性,這就為我們自定義各種空間提供了可能性,這篇博客主要用來

spring cloud():微服務架構開篇

java spring cloud 微服務 在公司使用spring cloud快一年了,項目也上線了,同時在線用戶到達有幾十萬,公司之前用的是傳統項目部署,業務放在一起,導致系統龐大,難以維護;采用spring cloud之後,一個業務對應一個獨立的模塊,也就是我們所說的微服務,開發人員維

Spring Cloud :服務註冊與發現(Eureka)【Dalston版】

什麽是 pom 日誌 操作 prop ng- 通過 決策 target Spring Cloud簡介 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局

Spring Cloud():服務註冊與發現

足夠 負載 方案 opener 屏蔽 腳手架 更新 pin pen Spring Cloud是什麽 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷

Spring Cloud Sleuth + zipkin 實現服務追蹤

工作 process image -o 唯一id dep 單元 圖片 zipkin 服務追蹤 Spring Cloud Sleuth實現了一種分布式的服務鏈路跟蹤解決方案,通過使用Sleuth可以讓我們快速定位某個服務的問題。 官方文檔地址如下: http://cloud