Наконец, в центре нашего внимания — микросервисы.
Подобно клиенту, реализованному 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 совершенствовалась, расширялось и ее использование. При разработке собственного программного обеспечения вы можете заранее зарезервировать интерфейс (обычно предоставляя функцию перехватчика важной функции), чтобы вы могли добавить себя в звено цепочки вызовов при расширении.
Остальное - нагрузка.