程序員欣宸 2021-09-19 22:08:02 阅读数:969
這裏分類和匯總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos
名稱 | 鏈接 | 備注 |
---|---|---|
項目主頁 | https://github.com/zq2599/blog_demos | 該項目在GitHub上的主頁 |
git倉庫地址(https) | https://github.com/zq2599/blog_demos.git | 該項目源碼的倉庫地址,https協議 |
git倉庫地址(ssh) | [email protected]:zq2599/blog_demos.git | 該項目源碼的倉庫地址,ssh協議 |
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>spring-cloud-tutorials</artifactId>
<groupId>com.bolingcavalry</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jaeger-service-provider</artifactId>
<dependencies>
<dependency>
<groupId>com.bolingcavalry</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>
</plugins>
</build>
</project>
spring:
application:
name: jaeger-service-provider
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());
}
}
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;
}
}
# 指定基礎鏡像,這是分階段構建的前期階段
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"]
mvn clean package -U -DskipTests
docker build -t bolingcavalry/jaeger-service-provider:0.0.1 .
spring:
application:
name: jaeger-service-consumer
opentracing:
jaeger:
enabled: true
udp-sender:
host: jaeger
port: 6831
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;
}
}
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<String> 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;
}
}
version: '3.0'
networks:
jaeger-tutorials-net:
driver: bridge
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
services:
jaeger:
image: jaegertracing/all-in-one:1.26
container_name: jaeger
# 處理時鐘漂移帶來的計算出負數的問題
command: ["--query.max-clock-skew-adjustment=100ms"]
#選擇網絡
networks:
- jaeger-tutorials-net
#選擇端口
ports:
- 16686:16686/tcp
restart: always
redis:
image: redis:6.2.5
container_name: redis
#選擇網絡
networks:
- jaeger-tutorials-net
restart: always
jaeger-service-provider:
image: bolingcavalry/jaeger-service-provider:0.0.1
container_name: jaeger-service-provider
#選擇網絡
networks:
- jaeger-tutorials-net
restart: always
jaeger-service-consumer:
image: bolingcavalry/jaeger-service-consumer:0.0.1
container_name: jaeger-consumer-provider
#選擇端口
ports:
- 18080:8080/tcp
#選擇網絡
networks:
- jaeger-tutorials-net
restart: always
will$ docker-compose up -d
Creating network "jaeger-service-provider_jaeger-tutorials-net" with driver "bridge"
Creating jaeger-service-provider ... done
Creating jaeger ... done
Creating redis ... done
Creating jaeger-consumer-provider ... done
版权声明:本文为[程序員欣宸]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919220802124A.html