Jaeger开发入门(java版),2024年最新unixlinux编程实践教程pdf

redis:

database: 0

Redis服务器地址 写你的ip

host: redis

Redis服务器连接端口

port: 6379

Redis服务器连接密码(默认为空)

password:

连接池最大连接数(使用负值表示没有限制 类似于mysql的连接池

jedis:

pool:

max-active: 10

连接池最大阻塞等待时间(使用负值表示没有限制) 表示连接池的链接拿完了 现在去申请需要等待的时间

max-wait: -1

连接池中的最大空闲连接

max-idle: 10

连接池中的最小空闲连接

min-idle: 0

连接超时时间(毫秒) 去链接redis服务端

timeout: 6000

opentracing:

jaeger:

enabled: true

udp-sender:

host: jaeger

port: 6831

  • 配置类:

package com.bolingcavalry.jaeger.provider.config;

import io.jaegertracing.internal.MDCScopeManager;

import io.opentracing.contrib.java.spring.jaeger.starter.TracerBuilderCustomizer;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class JaegerConfig {

@Bean

public TracerBuilderCustomizer mdcBuilderCustomizer() {

// 1.8新特性,函数式接口

return builder -> builder.withScopeManager(new MDCScopeManager.Builder().build());

}

}

  • 另外,由于本篇的重点是jaeger,因此redis相关代码就不贴出来了,有需要的读者请在此查看:RedisConfig.javaRedisUtils.java

  • 接下来看看如何使用Trace的实例来定制span,下面是定了span及其子span的web接口类,请注意trace的API的使用,代码中已有详细注释,就不多赘述了:

package com.bolingcavalry.jaeger.provider.controller;

import com.bolingcavalry.common.Constants;

import com.bolingcavalry.jaeger.provider.util.RedisUtils;

import io.opentracing.Span;

import io.opentracing.Tracer;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;

import java.util.Date;

@RestController

@Slf4j

public class HelloController {

@Autowired

private Tracer tracer;

@Autowired

private RedisUtils redisUtils;

private String dateStr(){

return new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”).format(new Date());

}

/**

  • 模拟业务执行,耗时100毫秒

  • @param parentSpan

*/

private void mockBiz(Span parentSpan) {

// 基于指定span,创建其子span

Span span = tracer.buildSpan(“mockBizChild”).asChildOf(parentSpan).start();

log.info(“hello”);

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

span.finish();

}

/**

  • 返回字符串类型

  • @return

*/

@GetMapping(“/hello”)

public String hello() {

long startTime = System.currentTimeMillis();

// 生成当前时间

String timeStr = dateStr();

// 创建一个span,在创建的时候就添加一个tag

Span span = tracer.buildSpan(“mockBiz”)

.withTag(“time-str”, timeStr)

.start();

// span日志

span.log(“normal span log”);

// 模拟一个耗时100毫秒的业务

mockBiz(span);

// 增加一个tag

span.setTag(“tiem-used”, System.currentTimeMillis()-startTime);

// span结束

span.finish();

// 写入redis

redisUtils.set(“Hello”, timeStr);

// 返回

return Constants.HELLO_PREFIX + ", " + timeStr;

}

}

  • 编码已经结束,接下来要将此工程制作成docker镜像了,新建Dockerfile文件,和pom.xml在同一个目录下:

指定基础镜像,这是分阶段构建的前期阶段

FROM openjdk:8-jdk-alpine as builder

设置时区

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN echo ‘Asia/Shanghai’ >/etc/timezone

执行工作目录

WORKDIR application

配置参数

ARG JAR_FILE=target/*.jar

将编译构建得到的jar文件复制到镜像空间中

COPY ${JAR_FILE} application.jar

通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果

RUN java -Djarmode=layertools -jar application.jar extract

正式构建镜像

FROM openjdk:8-jdk-alpine

WORKDIR application

前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer

COPY --from=builder application/dependencies/ ./

COPY --from=builder application/spring-boot-loader/ ./

COPY --from=builder application/snapshot-dependencies/ ./

COPY --from=builder application/application/ ./

ENTRYPOINT [“java”, “org.springframework.boot.loader.JarLauncher”]

  • 先在父工程spring-cloud-tutorials的pom.xml所在目录执行以下命令完成编译构建:

mvn clean package -U -DskipTests

  • 再在Dockerfile所在目录执行以下命令制作docker镜像:

docker build -t bolingcavalry/jaeger-service-provider:0.0.1 .

  • 至此,jaeger-service-provider相关开发已经完成

创建web工程之二:jaeger-service-consumer

  • jaeger-service-consumer工程的创建过程和jaeger-service-provider如出一辙,甚至还要更简单一些(不操作redis),所以描述其开发过程的内容尽量简化,以节省篇幅

  • pom.xml相比jaeger-service-provider的,少了redis依赖,其他可以照抄

  • application.yml也少了redis:

spring:

application:

name: jaeger-service-consumer

opentracing:

jaeger:

enabled: true

udp-sender:

host: jaeger

port: 6831

  • 配置类JaegerConfig.java可以照抄jaeger-service-provider的

  • 由于要远程调用jaeger-service-provider的web接口,因此新增restTemplate的配置类:

package com.bolingcavalry.jaeger.consumer.config;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.http.client.ClientHttpRequestFactory;

import org.springframework.http.client.SimpleClientHttpRequestFactory;

import org.springframework.web.client.RestTemplate;

@Configuration

public class RestTemplateConfig {

@Bean

public RestTemplate restTemplate(ClientHttpRequestFactory factory) {

RestTemplate restTemplate = new RestTemplate(factory);

return restTemplate;

}

@Bean

public ClientHttpRequestFactory simpleClientHttpRequestFactory() {

SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();

factory.setReadTimeout(5000);

factory.setConnectTimeout(15000);

return factory;

}

}

  • 关键代码是web接口的实现,会通过restTemplate调用jaeger-service-provider的接口:

package com.bolingcavalry.jaeger.consumer.controller;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

@RestController

@Slf4j

public class HelloConsumerController {

@Autowired

RestTemplate restTemplate;

/**

  • 返回字符串类型

  • @return

*/

@GetMapping(“/hello”)

public String hello() {

String url = “http://jaeger-service-provider:8080/hello”;

ResponseEntity responseEntity = restTemplate.getForEntity(url, String.class);

StringBuffer sb = new StringBuffer();

HttpStatus statusCode = responseEntity.getStatusCode();

String body = responseEntity.getBody();

// 返回

return "response from jaeger-service-provider \nstatus : " + statusCode + "\nbody : " + body;

}

}

  • 接下来是编译构建制作docker镜像,和前面的jaeger-service-provider一样;

docker-compose.yml文件编写

  • 现在咱们要将所有服务都运行起来了,先盘点一共有哪些服务要在docker-compose中启动的,如下所示,共计四个:
  1. jaeger

  2. redis

  3. jaeger-service-provider

  4. jaeger-service-consumer

  • 完整的docker-compose.yml内容如下:

version: ‘3.0’

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
架构面试专题及架构学习笔记导图.png

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

499312)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-JzLoFwl4-1712789499312)]

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
[外链图片转存中…(img-8Lxuge5k-1712789499312)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-FIxfREe0-1712789499313)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值