微服务整合Zipkin、RabbitMQ和 Elasticsearch

微服务之间通过轻量级的通讯协议进行通信,而网络也相对脆弱、网络资源也相当有限。如果我们能够跟踪每一个请求,了解请 求经过哪些微服务、请求的耗时、网络延迟、业务逻辑耗时这些指标,这样我们就能够更好的分析系统的瓶颈、针对的解决系统问题。因此、我们微服务体系中加上跟踪还是很有必要的

RabbitMQ用于的微服务和Zipkin服务端的通信(取代微服务和Zipkin服务端通过http通信,实现了微服务和Zipkin服务端的解耦,微服务不需要知道Zipkin服务端的网络地址,一些情况下微服务可能和Zipkin服务端网络不通(Zipkin服务端宕机),使用http通信收集方式将无法工作)

Zipkin提供了一个很友好的界面、利于分析追踪数据(没有尝试过使用elk分析追踪数据(不再需要zipkin服务端,直接分析日志数据))。

Mysql或Elasticsearch实现了追踪数据的持久化(Zipkin默认是将追踪数据存在内存中,如服务端重启或宕机,会导致历史数据丢失,所以追踪数据持久化很有必要)。

(1)创建一个 Spring Boot 工程,在pom.xml文件中添加以下依赖。

		<!-- 引入 zipkin -->
		<dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
        </dependency>

        <!-- 使用消息的方式收集数据(使用rabbitmq) -->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
            <version>2.6.1</version>
        </dependency>
		
		<!-- 采用 elasticsearch 存储数据 -->
		<dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
            <version>2.6.1</version>
        </dependency>

 

(2)、在主应用类里添加注解

@SpringBootApplication
@EnableZipkinServer // 此注解标识这个服务监听所有操作和行为以供查询。
public class MyZipkinServerEsApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyZipkinServerEsApplication.class, args);
	}
}

 

(3)、在application.properties添加相关配置

#表示当前程序不使用sleuth
spring.sleuth.enabled=false
spring.sleuth.sampler.percentage=1

#表示zipkin数据存储方式是elasticsearch
zipkin.storage.type=elasticsearch
zipkin.storage.StorageComponent=elasticsearch
zipkin.storage.elasticsearch.cluster=elasticsearch
zipkin.storage.elasticsearch.hosts=192.168.41.24:9200
zipkin.storage.elasticsearch.max-requests=64
zipkin.storage.elasticsearch.index=zipkin
zipkin.storage.elasticsearch.index-shards=5
zipkin.storage.elasticsearch.index-replicas=1


zipkin.collector.rabbitmq.addresses=192.168.41.24:5672
zipkin.collector.rabbitmq.username=admin
zipkin.collector.rabbitmq.password=admin
zipkin.collector.rabbitmq.queue=zipkin

(4)、在监听服务里添加依赖和相关配置

        <!-- 项目添加zipkin支持 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
        </dependency>
	
#rabbitmq配置
spring.rabbitmq.host=192.168.41.24
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
zipkin.rabbitmq.queue=zipkin

#Zipkin服务器的地址
spring.zipkin.base-url=http://192.168.41.24:8204
#将采样比例设置为1.0,也就是全部都需要
spring.sleuth.sampler.percentage=1.0

(5)、在 resources文件下添加 logback-spring.xml 日志配置文件,可以直接使用。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <!-- 说明: 1、日志级别及文件 日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中 例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志, 
                    日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名 例如log-level-2013-12-21.0.log 
                    其它级别的日志也是如此。 2、文件路径 若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹,以相对路径../logs。 
                    若部署到Tomcat下,则在Tomcat下的logs文件中 3、Appender FILEERROR对应error级别,文件名以log-error-xxx.log形式命名 
        FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名 FILEINFO对应info级别,文件名以log-info-xxx.log形式命名 
        FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名 stdout将日志信息输出到控制上,为方便开发测试使用 -->	
	<property name="LOG_PATH" value="../logs" />
	<!--设置系统日志目录 -->
	<property name="APPDIR" value="UserServer" />

	<property name="CONSOLE_LOG_PATTERN"
		value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />

	<!-- 日志记录器,日期滚动记录 -->
	<appender name="FILEINFO"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 正在记录的日志文件的路径及文件名 -->
		<file>${LOG_PATH}/${APPDIR}/log_info.log</file>
		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 
				而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
			<fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log
			</fileNamePattern>
			<maxHistory>30</maxHistory>
			<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始, 命名日志文件,例如log-error-2013-12-21.0.log -->
			<timeBasedFileNamingAndTriggeringPolicy
				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>2MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
		<!-- 追加方式记录日志 -->
		<append>true</append>
		<!-- 日志文件的格式 -->
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
			<charset>utf8</charset>
		</encoder>
	</appender>

	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<!--encoder 默认配置为PatternLayoutEncoder -->
		<encoder>
			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
			<charset>utf8</charset>
		</encoder>
		<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息 -->
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>debug</level>
		</filter>
	</appender>

	<logger name="org.springframework" level="WARN" />
	<logger name="org.hibernate" level="WARN" />

	<!-- 生产环境下,将此级别配置为适合的级别,以免日志文件太多或影响程序性能 -->
	<root level="INFO">
		<appender-ref ref="FILEINFO" />
		<!-- 生产环境将请stdout,testfile去掉 -->
		<appender-ref ref="STDOUT" />
	</root>
</configuration>

(6)启动 zipkin 和 监听的服务。进行服务接口的调用,通过zipkin进行分析追踪数据。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值