11.服务链路追踪(sleuth+zikpin)

来源:互联网 发布:centos kvm 多主机 编辑:程序博客网 时间:2024/06/02 01:23

1.zikpin介绍

zikpin是一个分布式跟踪系统,致力于搜集服务的定时数据,解决微服务架构中的服务延迟问题,包括数据的搜集、存贮、查找、展现

在大规模分布式集群架构下面,多个服务之间相互调用,zikpin可以通过web窗口展示服务之间的调用关系,开发者可以通过这个web窗口轻松掌握整个服务调用之间的关系,快速定位系统的瓶颈,快速定位某个高延迟服务。

sleuth是springcloud下的服务追踪工具,对zikpin提供良好的支持

2.下载zipkin-server-2.3.1-exec

使用jar方式启动(需要jdk8及以上版本),浏览器访问端口9411



3.创建provider-server1

注册eureka
ribbon负载均衡使用服务名称调用provider-server2
暴露一个接口给provider-server2调用

(1)pom.xml

<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.tyf</groupId>  <artifactId>eureks_serverProvider_test</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>  <name>eureks_serverProvider_test</name>  <url>http://maven.apache.org</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>  <!-- parent -->  <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.2.RELEASE</version>        <relativePath/>  </parent>  <dependencies>        <!--eureka-->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</artifactId>        </dependency><!--web--><dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!--test-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <!-- zikpin -->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-zipkin</artifactId>        </dependency>        <!-- ribbon -->              <dependency>                  <groupId>org.springframework.cloud</groupId>                  <artifactId>spring-cloud-starter-ribbon</artifactId>              </dependency>   </dependencies>  <dependencyManagement>        <dependencies>            <dependency>                <groupId>org.springframework.cloud</groupId>                <artifactId>spring-cloud-dependencies</artifactId>                <version>Dalston.RC1</version>                <type>pom</type>                <scope>import</scope>            </dependency>        </dependencies>  </dependencyManagement>  <!-- 打包工具 -->  <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>  </build>  <repositories>        <repository>            <id>spring-milestones</id>            <name>Spring Milestones</name>            <url>https://repo.spring.io/milestone</url>            <snapshots>                <enabled>false</enabled>            </snapshots>        </repository>  </repositories></project>

(2)application.properties

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/     server.port=8766spring.application.name=provider-server1    spring.zipkin.base-url=http://localhost:9411


(3)app

package com.tyf.serverProvider;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.sleuth.sampler.AlwaysSampler;import org.springframework.context.annotation.Bean;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;/* * 调用provider2:http://localhost:8766/provider1-call-provider2 *  *  */@SpringBootApplication@EnableEurekaClient@RestController@EnableDiscoveryClient //使用ribbon使用服务名称调用public class App {    public static void main( String[] args )    {        SpringApplication.run(App.class, args);    }      //注入远程调用bean    @Autowired    private RestTemplate restTemplate;    @Bean    @LoadBalanced//使用ribbon开启负载均衡    public RestTemplate getRestTemplate(){        return new RestTemplate();    }    //注入sleuth跟踪器    @Bean    public AlwaysSampler defaultSampler(){        return new AlwaysSampler();    }            //调用provider-server2:    @RequestMapping("/provider1-call-provider2")    public String callHome(){    //返回结果给浏览器        return restTemplate.getForObject("http://provider-server2/provider2", String.class);    }        //暴露接口给provider-server2调用    @RequestMapping("/provider1")    public String info(){        return "provider1计算的结果";    }    }

4.创建provider-server2

注册eureka
ribbon负载均衡使用服务名称调用provider-server1
暴露一个接口给provider-server1调用

(1)pom.xml

同provider-server1

(2)application.properties

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/     server.port=8769spring.application.name=provider-server2    spring.zipkin.base-url=http://localhost:9411

(3)app

package com.tyf.serverProvider;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.sleuth.sampler.AlwaysSampler;import org.springframework.context.annotation.Bean;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;/* * 调用provider1:http://localhost:8769/provider2-call-provider1 *  *  */@SpringBootApplication@EnableEurekaClient@RestController@EnableDiscoveryClient //使用ribbon开启负载均衡(使用服务名称调用)public class App {    public static void main( String[] args )    {        SpringApplication.run(App.class, args);    }      //注入远程调用bean    @Autowired    private RestTemplate restTemplate;    @Bean    @LoadBalanced //使用ribbon开启负载均衡    public RestTemplate getRestTemplate(){        return new RestTemplate();    }    //注入sleuth跟踪器    @Bean    public AlwaysSampler defaultSampler(){        return new AlwaysSampler();    }            //调用provider-server1:    @RequestMapping("/provider2-call-provider1")    public String callHome(){    //返回结果给浏览器        return restTemplate.getForObject("http://provider-server1/provider1", String.class);    }        //暴露接口给provider-server1调用    @RequestMapping("/provider2")    public String info(){        return "provider2计算的结果";    }    }

5.测试

一次启动  eureka-server/zikpin-server/provider-server1/provider-server2

浏览器访问provider-server1来调用provider-server2

http://localhost:8766/provider1-call-provider2

浏览器显示结果:provider2计算结果(服务互调成功)

查看zikpin的web窗口查看调用细节


阅读全文
0 0
原创粉丝点击