織夢網(wǎng)站欄目管理空白廣州網(wǎng)站優(yōu)化公司排名
??Skywalking是由國內(nèi)開源愛好者吳晟開源并提交到Apache孵化器的開源項目, 2017年12月SkyWalking成為Apache國內(nèi)首個個人孵化項目, 2019年4月17日SkyWalking從Apache基金會的孵化器畢業(yè)成為頂級項目, 目前SkyWalking支持Java、 .Net、 Node.js、 go、 python等探針, 數(shù)據(jù)存儲支持MySQL、 ElasticSearch等, SkyWalking與Pinpoint相同, 對業(yè)務(wù)代碼無侵入, 不過探針采集數(shù)據(jù)粒度相較于Pinpoint來說略粗, 但性能表現(xiàn)優(yōu)秀, 目前SkyWalking增長勢頭強勁, 社區(qū)活躍, 中文文檔齊全, 沒有語言障礙, 支持多語言探針, 這些都是 SkyWalking的優(yōu)勢所在, 還有就是SkyWalking支持很多框架, 包括很多國產(chǎn)框架, 例如, Dubbo、 gRPC、 SOFARPC 等等, 同時也有很多開發(fā)者正在不斷向社區(qū)提供更多插件以支持更多組件無縫接入SkyWalking。
官網(wǎng)地址:https://skywalking.apache.org/
這個是官網(wǎng)的架構(gòu)設(shè)計圖:
SkyWalking有兩中版本,ES版本和非ES版。如果我們決定采用ElasticSearch作為存儲,那么就下載es版本。? SkyWalking 支持 ES、MySQL?等等作為存儲器,實現(xiàn)鏈路等信息的讀寫。
一般情況下,我們推薦使用 ES 存儲器。
下面我們來安裝一下。
es 安裝這個之前有說明,可以自行去看文章安裝。
skywalking安裝可以參考官網(wǎng),下載源碼包,在linux或者windows環(huán)境安裝。
解壓后如下:
- agent目錄將來要拷貝到各服務(wù)所在機器上用作探針
- bin目錄是服務(wù)啟動腳本
- config目錄是配置文件
- oap-libs目錄是oap服務(wù)運行所需的jar包
- webapp目錄是web服務(wù)運行所需的jar包
接下來,要選擇存儲了,支持的存儲有:
- H2
- ElasticSearch 6, 7
- MySQL
- TiDB
- InfluxDB
作為監(jiān)控系統(tǒng),首先排除H2和MySQL,這里推薦InfluxDB,它本身就是時序數(shù)據(jù)庫,非常適合這種場景
這里要注意,最新的安裝包jdk1.8以上才可以。我這里是11:
接下來,我們選擇es作為存儲數(shù)據(jù)源,在 config/application.yml ,設(shè)置storage中的es地址即可,如果是集群,就寫集群的地址
???????
2.2. 安裝Agent
https://github.com/apache/skywalking/blob/v8.2.0/docs/en/setup/service-agent/java-agent/README.md
將agent目錄拷貝至各服務(wù)所在的機器上
這里,我將它拷貝至某個服務(wù)目錄下:
SkyWalking插件都是即插即用的,可以把optional-plugins中的插件放到plugins中
修改 agent/config/agent.config 配置文件,也可以通過命令行參數(shù)指定
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800} ip改為自己服務(wù)的地址即可。
?這個包的位置可以隨便放,可以在你的啟動參數(shù)里面加上,也可以使用jar的方式指定路徑:
-javaagent:D:\work\gitwork\mavendemo\skywalking-agent\skywalking-agent.jar -Dskywalking.agent.service_name=skywalking-jsbc-service -Dskywalking.collector.backend_service=127.0.0.1:11800
接著修改監(jiān)控web端口地址:
當(dāng)然也可以不用修改,使用默認的地址和端口。?
?啟動skywalking服務(wù):
?現(xiàn)在打開
?
?我現(xiàn)在比如向數(shù)據(jù)庫中插數(shù)據(jù),
?
?模擬100次插入:
通過postman請求:
打開監(jiān)控可以看到下面的鏈路日志和執(zhí)行時間:
’
?服務(wù)執(zhí)行響應(yīng)時間,成功率等等指標,可以去官網(wǎng)上看文檔
?服務(wù)拓撲結(jié)構(gòu)
?鏈路log和執(zhí)行時間,這樣可以看出鏈路消耗時間和性能
除來這個我們可以Grafana 來監(jiān)控性能,比如redis,mysql之類的性能。
Grafana安裝也很簡單,下載源碼包,解壓后直接啟動即可:
?然后啟動:
?賬號密碼admin/admin
添加redis數(shù)據(jù)源
?
如果是集群的,填寫集群地址即可,保存后,我們可以自定義redis性能,也可以使用官方的模版導(dǎo)入json文件模版即可:
Redis Dashboard | Grafana Labs
下面我們寫個程序讀寫redis,下面是pom文件:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.58</version></dependency><!-- redis分布式鎖 --><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-redis</artifactId></dependency><!-- redis 連接池--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
@Testpublic void shouldUse3DbConcurrent(){final String key3="dm:3:cr:string:key";final String key0="dm:0:cr:string:key";List<String> keys=Arrays.asList(key0, key3);stringRedisManager.deleteKeyBatch(keys);string3RedisManager.deleteKeyBatch(keys);stringRedisManager.set(key0, "0");string3RedisManager.set(key3, "0");int threadCount=500;int addTotal=50000;RedisAddManager addManager0=new RedisAddManager(stringRedisManager, key0, threadCount, addTotal);RedisAddManager addManager3=new RedisAddManager(string3RedisManager, key3, threadCount, addTotal);addManager0.startThreads();addManager3.startThreads();addManager0.countDown();addManager3.countDown();//等待線程執(zhí)行完畢addManager0.joins();addManager3.joins();int expectedTotal=threadCount*addTotal;String expectedTotalStr=String.valueOf(expectedTotal);String result0=stringRedisManager.get(key0);Assert.assertEquals(expectedTotalStr, result0);String result0_=stringRedisManager.get(key3);Assert.assertNull(result0_);String result3=string3RedisManager.get(key3);Assert.assertEquals(expectedTotalStr, result3);String result3_=string3RedisManager.get(key0);Assert.assertNull(result3_);}private class RedisAddManager{private CountDownLatch countDownLatch=new CountDownLatch(1);private RedisManager<String,String> stringRedisManager;private String key;private int threadCount;private int addTotal;private List<Thread> threads=new ArrayList<>();public RedisAddManager(RedisManager<String, String> stringRedisManager, String key, int threadCount, int addTotal) {this.stringRedisManager = stringRedisManager;this.key = key;this.threadCount=threadCount;this.addTotal = addTotal;}
啟動執(zhí)行后,可以看到儀表盤redis的讀寫性能: