Istio-解决Zipkin对项目的侵入性问题

Istio采用SideCar模式注入的Enovy代理在某些情况下不能完全解决对项目的无侵入性,比如需要用到Istio的链路追踪功能的时候。需要在代码中手动注入链路追踪需要的header,这样就出现了Istio对业务功能的侵入性。

Istio-解决Zipkin对项目的侵入性问题_第1张图片

istio服务网格的调用链跟踪需要依赖在服务之间传递trade和span相关的header来实现,否则无法把不同的服务调用关联到同一个调用链,envoy可以实现流量拦截和指标上报,但是无法协助应用程序传递
header,所以应用程序要是需要进行传递header的埋点。请看下面的例子:

借助opentracing,可以实现半自动化埋点。

通过引入opentracing-spring-zipkin-web-starter可以实现调用链跟踪的自动化埋点。
pom.xml:

<dependency>
	<groupId>io.opentracing.contribgroupId> 		
	<artifactId>opentracing-spring-zipkin-web-starterartifactId> 
	<version>0.1.4version>
dependency>

application.yml:

opentracing: 
	zipkin:
		enabled: true 
		http-sender:
			baseUrl: http://zipkin:9411/

关于手动埋点的例子,可以在istio官网的bookinfo的例子中见到。如下:

package application.rest;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.StringReader;

@Path("/")
public class LibertyRestEndpoint extends Application {

    private final static Boolean ratings_enabled = Boolean.valueOf(System.getenv("ENABLE_RATINGS"));
    private final static String star_color = System.getenv("STAR_COLOR") == null ? "black" : System.getenv("STAR_COLOR");
    private final static String services_domain = System.getenv("SERVICES_DOMAIN") == null ? "" : ("." + System.getenv("SERVICES_DOMAIN"));
    private final static String ratings_hostname = System.getenv("RATINGS_HOSTNAME") == null ? "ratings" : System.getenv("RATINGS_HOSTNAME");
    private final static String ratings_port = System.getenv("RATINGS_SERVICE_PORT") == null ? "9080" : System.getenv("RATINGS_SERVICE_PORT");
    private final static String ratings_service = String.format("http://%s%s:%s/ratings", ratings_hostname, services_domain, ratings_port);
    private final static String pod_hostname = System.getenv("HOSTNAME");
    private final static String clustername = System.getenv("CLUSTER_NAME");
    // HTTP headers to propagate for distributed tracing are documented at
    // https://istio.io/docs/tasks/telemetry/distributed-tracing/overview/#trace-context-propagation
    private final static String[] headers_to_propagate = {
        // All applications should propagate x-request-id. This header is
        // included in access log statements and is used for consistent trace
        // sampling and log sampling decisions in Istio.
        "x-request-id",

        // Lightstep tracing header. Propagate this if you use lightstep tracing
        // in Istio (see
        // https://istio.io/latest/docs/tasks/observability/distributed-tracing/lightstep/)
        // Note: this should probably be changed to use B3 or W3C TRACE_CONTEXT.
        // Lightstep recommends using B3 or TRACE_CONTEXT and most application
        // libraries from lightstep do not support x-ot-span-context.
        "x-ot-span-context",

        // Datadog tracing header. Propagate these headers if you use Datadog
        // tracing.
        "x-datadog-trace-id",
        "x-datadog-parent-id",
        "x-datadog-sampling-priority",

        // W3C Trace Context. Compatible with OpenCensusAgent and Stackdriver Istio
        // configurations.
        "traceparent",
        "tracestate",

        // Cloud trace context. Compatible with OpenCensusAgent and Stackdriver Istio
        // configurations.
        "x-cloud-trace-context",

        // Grpc binary trace context. Compatible with OpenCensusAgent nad
        // Stackdriver Istio configurations.
        "grpc-trace-bin",

        // b3 trace headers. Compatible with Zipkin, OpenCensusAgent, and
        // Stackdriver Istio configurations. Commented out since they are
        // propagated by the OpenTracing tracer above.
        "x-b3-traceid",
        "x-b3-spanid",
        "x-b3-parentspanid",
        "x-b3-sampled",
        "x-b3-flags",

        // SkyWalking trace headers.
        "sw8",

        // Application-specific headers to forward.
        "end-user",
        "user-agent",

        // Context and session specific headers
        "cookie",
        "authorization",
        "jwt",
    };

    private String getJsonResponse(String productId, int starsReviewer1, int starsReviewer2) {//省略}

    private JsonObject getRatings(String productId, HttpHeaders requestHeaders) {//省略}
      
}

你可能感兴趣的:(学习笔记,istio,云原生)