Spring Cloud------Zipkin(brave-okhttp)實現監控

本文截取自:http://blog.csdn.net/liaokailin/article/details/52077620 html

本博客是博主根據大神的博客,學習而來。 拒絕伸手黨。java

zipkin是什麼?

        Zipkin 是一款開源的分佈式實時數據追蹤系統(Distributed Tracking System),基於 Google Dapper 的論文設計而來,由 Twitter 公司開發貢獻。其主要功能是彙集來自各個異構系統的實時監控數據,用來追蹤微服務架構下的系統延時問題。linux

1.獲取zipkin 運行界面包

若是你不使用zipkin的jar包運行,你也能夠用spring boot來構建zipkin的服務。git

1.1在官網下載服務jar包

    進入官網 http://zipkin.io/pages/quickstart.html,以後使用命令啓動服務jar便可。github

    官方提供了jar包獲取辦法,還有linux上經過weget來獲取zipkin的jar包。web

    點擊箭頭所指的鏈接,便可下載jar包。下面紅色框內的爲linux下的jar包獲取辦法。spring

1.2 運行官方jar包,並查看zipkin界面

運行官方下載的jar包,以下圖所示apache

1.3 zipkin界面測試

運行成功之後,咱們便可在瀏覽器輸入 http://localhost:9411,便可看到zipkin的監控頁面。api

注意:博主這個截圖是已經有服務在監控了,你的沒有服務監控 因此都是空的。瀏覽器

 

2. java代碼實現監控

    該程序基於maven,不會maven的同窗先去看看哈,使用的話仍是比較簡單的。

 2.1 pom.xml配置

   所有的pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jg.zipkin</groupId>
    <artifactId>zipkin-brave</artifactId>
    <packaging>jar</packaging>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.6.RELEASE</version>
    </parent>



    <!-- https://mvnrepository.com/artifact/io.zipkin.brave/brave-core -->
    <dependencies>

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-core</artifactId>
            <version>3.9.0</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-http</artifactId>
            <version>3.9.0</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-spancollector-http</artifactId>
            <version>3.9.0</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-web-servlet-filter</artifactId>
            <version>3.9.0</version>
        </dependency>

        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-okhttp</artifactId>
            <version>3.9.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

    </dependencies>

    <repositories>
        <repository>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <id>central</id>
            <name>bintray</name>
            <url>http://jcenter.bintray.com</url>
        </repository>
    </repositories>


    <!-- Package as an executable jar -->
    <build>
        <finalName>server1</finalName>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

2.2 程序具體實現

2.2.1 新建HomeController類

package com.jg.zipkin.controller;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Random;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/")
public class HomeController {

    @Autowired
    private OkHttpClient client;

    private  Random random = new Random();

    @RequestMapping("start")
    public String start() throws InterruptedException, IOException {
        int sleep= random.nextInt(100);
        TimeUnit.MILLISECONDS.sleep(sleep);
        Request request = new Request.Builder().url("http://localhost:9090/foo").get().build();
        Response response = client.newCall(request).execute();
        return " [service1 sleep " + sleep+" ms]" + response.body().toString();
    }


    @RequestMapping("foo")
    public String foo() throws InterruptedException, IOException {
        int sleep= random.nextInt(100);
        TimeUnit.MILLISECONDS.sleep(sleep);
        Request request = new Request.Builder().url("http://localhost:9091/bar").get().build();  //service3
        Response response = client.newCall(request).execute();
        String result = response.body().string();
        request = new Request.Builder().url("http://localhost:9092/tar").get().build();  //service4
        response = client.newCall(request).execute();
        result += response.body().string();
        return " [service2 sleep " + sleep+" ms]" + result;
    }


    @RequestMapping("bar")
    public String bar() throws InterruptedException, IOException {  //service3 method
        int sleep= random.nextInt(100);
        TimeUnit.MILLISECONDS.sleep(sleep);
        return " [service3 sleep " + sleep+" ms]";
    }

    @RequestMapping("tar")
    public String tar() throws InterruptedException, IOException { //service4 method
        int sleep= random.nextInt(100);
        TimeUnit.MILLISECONDS.sleep(sleep);
        return " [service4 sleep " + sleep+" ms]";
    }



}

2.2.2 新建Application類

package com.jg.zipkin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class Application {

   public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.run(args);

    }
}

 

2.2.3  新建 ZipkinConfig 類

這個類爲zipkin的核心類

package com.jg.zipkin;

import okhttp3.OkHttpClient;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.github.kristofa.brave.Brave;
import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler;
import com.github.kristofa.brave.Sampler;
import com.github.kristofa.brave.SpanCollector;
import com.github.kristofa.brave.http.DefaultSpanNameProvider;
import com.github.kristofa.brave.http.HttpSpanCollector;
import com.github.kristofa.brave.okhttp.BraveOkHttpRequestResponseInterceptor;
import com.github.kristofa.brave.servlet.BraveServletFilter;


@Configuration
public class ZipkinConfig {

    @Autowired
    private ZipkinProperties properties;


    @Bean
    public SpanCollector spanCollector() {
        HttpSpanCollector.Config config = HttpSpanCollector.Config.builder()
                                                              .connectTimeout(5000)//5s,默認10s
                                                              .readTimeout(6000)//5s,默認60s
                                                              .compressionEnabled(false)//默認false,span在transport以前是否會被gzipped。
                                                              .flushInterval(1)//1s
                                                              .build();
        
        return HttpSpanCollector.create("http://10.114.72.122:1011", config, new EmptySpanCollectorMetricsHandler());
    }


    @Bean
    public Brave brave(SpanCollector spanCollector){
        Brave.Builder builder = new Brave.Builder("server1");  //指定state
        builder.spanCollector(spanCollector);
        builder.traceSampler(Sampler.ALWAYS_SAMPLE);
        Brave brave = builder.build();
        return brave;
    }

    @Bean
    public BraveServletFilter braveServletFilter(Brave brave){
        BraveServletFilter filter = new BraveServletFilter(brave.serverRequestInterceptor(),brave.serverResponseInterceptor(),new DefaultSpanNameProvider());
        return filter;
    }

    @Bean
    public OkHttpClient okHttpClient(Brave brave){
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new BraveOkHttpRequestResponseInterceptor(brave.clientRequestInterceptor(), brave.clientResponseInterceptor(), new DefaultSpanNameProvider()))
                .build();
        return client;
    }
}

2.2.4 配置端口號

在application.properties中配置
 

server.port=8080

 

按照上面的配置再配置三個服務,基礎配置和上面如出一轍,只用修改分端口號 和 服務名就能夠

上面的講解的服務名爲server1,端口號爲8080的服務

接下來配置其餘三個服務:

server2:

服務名在ZipkinConfig 類中,修改服務名

端口號修改以下:

server.port=9090

server3:

服務名在ZipkinConfig 類中,修改服務名

端口號修改以下:

server.port=9091

server4:

服務名在ZipkinConfig 類中,修改服務名

端口號修改以下:

server.port=9092

2.3 測試

分別啓動四個服務。

訪問:http://localhost:8080/start

獲得以下訪問返回值(多訪問幾回):

咱們在回到zipkin的ui上:

就能看到咱們的四個服務

在UI上選擇相應的服務,選擇對應的時間,點擊Find便可獲得響應的請求信息,

以下圖所示。

具體顯示信息:

在zipkin的ui界面點擊頭部導航條中的Dependencies,選擇相應時間,點擊analyze,

便可獲得以下圖所示的關聯關係

 

zipkin+brave講到這裏就結束了,本文是根據頂部那一篇文章而來,真所謂站在巨人肩膀上,歡迎你們拍磚。

示例代碼地址:

https://github.com/913545731/springcloud_demo/tree/master/springcloud_zipkin_brave

相關文章
相關標籤/搜索