[jaeger] В-четвертых, цепочка вызовов микросервисов (Feign+SpringCloud)

Java Микросервисы

Наконец, в центре нашего внимания — микросервисы.

Подобно клиенту, реализованному OkHttp3, интерфейс Feign изначально является вызовом Http, и заголовок Http все еще может использоваться для передачи значения.TraceПройти вниз.

Эта статья больше оSpringCloudНекоторые из знаний, которые вам нужно знать о некоторых основныхSpringсоответствующие знания.

Для получения дополнительных серий, пожалуйста, обратите внимание на вкус Miss Sister в общедоступной учетной записи.Для адреса github соответствующего кода в этой статье см.:

https://github.com/sayhiai/example-jaeger-opentracing-tutorial-004

Установить Консул

Для реестра SpringCloud мы выбираем Consul.

Consul также разработан с помощью golang. Скачав бинарный пакет с официального сайта консула, распакуйте его.

./consul agent   -bind 127.0.0.1 -data-dir . -node my-register-center -bootstrap-expect 1 -ui -dev

Быстро начните использовать приведенный выше скрипт, и вы готовы к работе.

доступhttp://localhost:8500/ui/Вы можете увидеть веб-страницу Консула.

Создание серверов и клиентов микросервисов

maven-зависимости

Компоненты springboot и springcloud вводятся по пути bom.

spring-boot-dependencies 2.1.3.RELEASE
spring-cloud-dependencies Greenwich.SR1

Оба являются горячими и свежими версиями.

Далее импортируем другие необходимые пакеты

opentracing-util 0.32.0
jaeger-client 0.35.0
logback-classic 1.2.3
opentracing-spring-jaeger-cloud-starter 2.0.0

spring-boot-starter-web
spring-boot-starter-aop
spring-boot-starter-actuator
spring-cloud-starter-consul-discovery
spring-cloud-starter-openfeign

построить сервер

Порт серверного приложения8888

@SpringBootApplication
@EnableAutoConfiguration
@EnableDiscoveryClient
@ComponentScan(basePackages = {
        "com.sayhiai.example.jaeger.totorial04.controller",
})
public class App extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

В application.yml настройте Consul в качестве центра конфигурации.

 cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      discovery:
        register: true
        tags: version=1.0,author=xjjdog
        healthCheckPath: /actuator/health
        healthCheckInterval: 5s

Создать службу отдыха/hello

@PostMapping("/hello")
@ResponseBody
public String hello(@RequestBody String name) {
        return "hello " + name;
}

Собрать клиент Feign

Порт приложения клиента Feign:9999, который также является сервисом SpringCloud.

Создать FeignClient

@FeignClient("love-you-application")
public interface LoveYouClient {
    @PostMapping("/hello")
    @ResponseBody
    public String hello(@RequestBody String name);
}

Создать запись вызова/test

@GetMapping("/test")
@ResponseBody
public String hello() {
    String rs = loveYouClient.hello("小姐姐味道");
    return rs;
}

встроенный егерь

На данный момент уже есть родственные колеса SpringCloud, и повторять изготовление мы не будем.

Сначала давайте посмотрим, как его использовать, а затем объясним принцип, лежащий в его основе. Поняв принцип, вы легко добавите функцию трассировки в разрабатываемое вами промежуточное ПО.


Колесо здесь, вы можете использовать его, внедрив соответствующий пакет maven:

https://github.com/opentracing-contrib/java-spring-jaeger
<dependency>
  <groupId>io.opentracing.contrib</groupId>
  <artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
</dependency>

Добавьте конфигурацию, чтобы она вступила в силу

существуетapplication.yml, добавьте следующую конфигурацию, вы можете получить функцию цепочки вызовов.

Конфигурация указывает адрес хранения трассировки и открывает локальный журнал.

opentracing.jaeger.http-sender.url: http://10.30.94.8:14268/api/traces
opentracing.jaeger.log-spans: true

Посетите localhost:9999/test, и вы получите следующую цепочку вызовов.

можно увидеть. Весь процесс вызова Feign записывается.

принцип

Звонок Фейна

Feign передает параметры через заголовок

Сначала взгляните на конструктор запросов Feign.

public static Request create(
String method, 
String url, 
Map<String, Collection<String>> headers,
byte[] body, 
Charset charset) {
    return new Request(method, url, headers, body, charset);
}

Например, код можно передать, добавив необходимую нам информацию к параметру заголовков.

Затем посмотрите исходный код: Клиент**->** LoadBalancerFeignClient выполнить()-> executeWithLoadBalancer()-> IClient**->**

Ниже реализация IClient имеетOkHttpLoadBalanceClient RibbonLoadBalancingHttpClient (пакет на основе Apache) и т. д., все они могут легко установить свой заголовок

В конце концов, наш запрос по-прежнему инициируется этими базовыми библиотечными функциями, по умолчанию используется HttpURLConnection.

Любой, кто читал исходный код Feign и Ribbon, знает, что эта часть кода не является общим беспорядком, но, к счастью, верхний Feign непротиворечив.

Оберните клиента делегатом

путем реализацииfeign.ClientИнтерфейсы в сочетании с делегатами могут быть переупакованыexecuteметод, то информацияinjectв сферу Фейна.

Автоматически перехватывать вызовы Feign с помощью Aop

@Aspect
class TracingAspect {
  @Around("execution (* feign.Client.*(..)) && !within(is(FinalType))")
  public Object feignClientWasCalled(final ProceedingJoinPoint pjp) throws Throwable {
    Object bean = pjp.getTarget();
    if (!(bean instanceof TracingClient)) {
      Object[] args = pjp.getArgs();
      return new TracingClientBuilder((Client) bean, tracer)
          .withFeignSpanDecorators(spanDecorators)
          .build()
          .execute((Request) args[0], (Request.Options) args[1]);
    }
    return pjp.proceed();
  }
}

Используя технологию Spring Boot Starter, мы можем иметь функцию трассировки без каких-либо других изменений.


Отправка и получение через веб-интерфейс

Любой, кто знаком со Spring, знает, что самое подходящее место для добавления и извлечения информации из http-заголовка — это перехватчики и фильтры.

Отправить

Для обычных клиентов HTTP-запросов это делается путем добавленияClientHttpRequestInterceptorПерехватчик для достижения. Процесс больше не выражается и по-прежнему использует такие функции, как inject для установки информации заголовка.

перенимать

Для приема реализовано с помощью Filter. Путем реализации обычного фильтра сервлета. в состоянии пройтиextractФункция извлекает информацию трассировки, а затем передает контекст в качестве атрибута запроса.

Ниже приведены соответствующие фрагменты кода.

if (servletRequest.getAttribute(SERVER_SPAN_CONTEXT) != null) {
    chain.doFilter(servletRequest, servletResponse);
} else {
    SpanContext extractedContext = tracer.extract(Format.Builtin.HTTP_HEADERS,
            new HttpServletRequestExtractAdapter(httpRequest));

    final Span span = tracer.buildSpan(httpRequest.getMethod())
            .asChildOf(extractedContext)
            .withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)
            .start();

httpRequest.setAttribute(SERVER_SPAN_CONTEXT, span.context());

Таким образом, вся цепочка перемежается.

Автопроводка с приборкой

Подобно тому, что делают pinpoint и SkyWalking. opentracing-contrib также основан наbytebuddyНаписал относительно полный набор агентов.

https://github.com/opentracing-contrib/java-specialagent

Следующие клиенты уже поддерживаются.

OkHttp3
JDBC API (java.sql)
Concurrent API (java.util.concurrent)
Java Web Servlet API (javax.servlet)
Mongo Driver
Apache Camel
AWS SDK
Cassandra Driver
JMS API (javax.jms v1 & v2)
Elasticsearch6 Client
RxJava 2
Kafka Client
AsyncHttpClient
RabbitMQ Client
RabbitMQ Spring
Thrift
GRPC
Jedis Client
Apache HttpClient
Lettuce Client
Spring Web
Spring Web MVC
Spring WebFlux
Redisson
Grizzly HTTP Server
Grizzly AsyncHttpClient
Reactor
Hazelcast

но,bytebuddyПроизводительность низкая, вам может понадобиться обратиться к этим кодам, используйтеasmКласс API для сборки.

Для получения более подробной информации о технологии javaagent вы можете обратиться к другой статье Miss Sister:Непопулярный пакет инструментов, функция d fried sky

End

Наши следующие статьи, от одномашинных до многомашинных, от многопоточных до распределенных, иллюстрируют использование API OpenTracing. Можно видеть, что его абстракция является относительно всеобъемлющей и может адаптироваться к большинству сценариев.

По мере того, как спецификация OpenTracing совершенствовалась, расширялось и ее использование. При разработке собственного программного обеспечения вы можете заранее зарезервировать интерфейс (обычно предоставляя функцию перехватчика важной функции), чтобы вы могли добавить себя в звено цепочки вызовов при расширении.

Остальное - нагрузка.