sb2.0新版springcloud微服務(wù)實(shí)戰(zhàn):Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin
springboot 版本是 2.0.3.RELEASE 典勇,springcloud 版本是 Finchley.RELEASE
本篇文章是springboot2.x升級(jí)后的升級(jí)springcloud專貼焊虏,因?yàn)橹鞍姹靖乱呀?jīng)好久了,好多人評(píng)論可不可以出個(gè)新版本舍肠,大家一定要注意籍凝,這是springboot2.x版本的巡李,springboot1.x的請(qǐng)參考 點(diǎn)擊查看文章掘猿,基本組件都不變就是升級(jí)jar包版本锥涕,主要就是hystrix-dashboard使用有點(diǎn)變化衷戈。還有一點(diǎn)要注意的是sc默認(rèn)使用的是eureka1.9.x版本,大家一定要主要层坠,不要自己手動(dòng)改為2.x版本殖妇,因?yàn)?.x版本還沒(méi)有正式發(fā)布,而且停止開(kāi)發(fā)了破花,官方還在積極的維護(hù)1.x版本(并不是網(wǎng)傳的閉源)谦趣。
相信現(xiàn)在已經(jīng)有很多小伙伴已經(jīng)或者準(zhǔn)備使用springcloud微服務(wù)了,接下來(lái)為大家搭建一個(gè)微服務(wù)框架座每,后期可以自己進(jìn)行擴(kuò)展前鹅。會(huì)提供一個(gè)小案例: 服務(wù)提供者和服務(wù)消費(fèi)者 ,消費(fèi)者會(huì)調(diào)用提供者的服務(wù)峭梳,新建的項(xiàng)目都是用springboot舰绘,附源碼下載,推薦使用coding地址下載葱椭,因?yàn)榭梢郧袚Q分支捂寿,后期可以及時(shí)更新。
coding倉(cāng)庫(kù)地址(推薦下載): coding地址 遠(yuǎn)程配置倉(cāng)庫(kù)地址 遠(yuǎn)程配置倉(cāng)庫(kù)地址
如果有問(wèn)題請(qǐng)?jiān)谙逻呍u(píng)論孵运,或者200909980加群交流秦陋。或者關(guān)注文章結(jié)尾微信公眾號(hào)治笨,私信后臺(tái)
Eureka/Consul/Zookeeper:服務(wù)發(fā)現(xiàn) (根據(jù)情況選擇一個(gè),eureka已經(jīng)宣布閉源)
Hystrix:斷路器
Zuul:智能路由
Ribbon/Feign:客戶端負(fù)載均衡 (Feign用的更多)
Turbine&hystrix-dashboard:集群監(jiān)控
Springcloud-config:遠(yuǎn)程獲取配置文件
接下來(lái)驳概,我們開(kāi)始搭建項(xiàng)目,首先我們到spring為我們提供的一個(gè)網(wǎng)站快速搭建springboot項(xiàng)目旷赖,點(diǎn)擊訪問(wèn)顺又,我這里用的是gradle,如果各位客官喜歡用maven杠愧,好吧你可以到http://mvnrepository.com/查看對(duì)應(yīng)的依賴待榔,點(diǎn)我訪問(wèn)。
一流济、搭建eureka-server服務(wù)sc-eureka-server
使用 spring-cloud-consul 作為服務(wù)發(fā)現(xiàn) 請(qǐng)參考 點(diǎn)擊查看使用springcloud consul 作為服務(wù)發(fā)現(xiàn)
eureka-server作為服務(wù)發(fā)現(xiàn)的核心锐锣,第一個(gè)搭建,后面的服務(wù)都要注冊(cè)到eureka-server上绳瘟,意思是告訴eureka-server自己的服務(wù)地址是啥雕憔。當(dāng)然還可以用zookeeper或者springconsul。
- 1.修改build.gradle文件
如果是maven項(xiàng)目請(qǐng)對(duì)應(yīng)的修改pom.xml
//加入阿里的私服倉(cāng)庫(kù)地址
maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
//加入依賴
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-server')
//加入security糖声,是因?yàn)樵L問(wèn)eureka-server需要用戶名和密碼訪問(wèn)斤彼,為了安全
compile('org.springframework.boot:spring-boot-starter-security')
還有幾點(diǎn)需要修改的分瘦,大家對(duì)應(yīng)圖片看看,就是springboot打包的時(shí)候會(huì)提示找不到主類琉苇。
- 2.修改 application.yml嘲玫,建議用yml。
server:
port: 8761
eureka:
datacenter: trmap
environment: product
server:
# 關(guān)閉自我保護(hù)
enable-self-preservation: false
# 清理服務(wù)器
eviction-interval-timer-in-ms: 5000
client:
healthcheck:
enabled: true
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
register-with-eureka: false
fetch-registry: false
spring:
security:
basic:
enabled: true
user:
name: root
password: booszy
- 3.修改程序的主類并扇,建議修改類名去团,要加如eureka的 @EnableEurekaServer 注解,然后運(yùn)行main方法穷蛹。
@EnableEurekaServer
@SpringBootApplication
public class Sb2scEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scEurekaApplication.class, args);
}
}
http://localhost:8761/ 這個(gè)是eureka-server的頁(yè)面地址土陪,密碼在yml配置文件中,到這里肴熏,說(shuō)明eureka-server搭建好了鬼雀,簡(jiǎn)單吧,這一步一定要成功蛙吏,否則后面的就不能繼續(xù)進(jìn)行下去了源哩,后邊基本類似。
二出刷、搭建config-server服務(wù)sc-config-server
springcloud-config-server是用來(lái)將遠(yuǎn)程git倉(cāng)庫(kù)的配置文件動(dòng)態(tài)拉下來(lái)璧疗,這樣配置文件就可以動(dòng)態(tài)的維護(hù)了。當(dāng)然也可以選擇本地倉(cāng)庫(kù)馁龟。
新建一個(gè)springboot項(xiàng)目崩侠,修改maven私服地址,并加入一下依賴坷檩。
- 1.修改build.gradle文件
compile('org.springframework.cloud:spring-cloud-config-server')
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
//連接config-server也需要用戶名和密碼
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-actuator')
- 2.修改application.yml文件
server:
port: 8800
spring:
security:
basic:
enabled: true
user:
name: root
password: booszy
application:
name: sc-config-server
cloud:
config:
server:
git:
uri: https://git.coding.net/yirenyishi/springcloud-config-profile
searchPaths: '{application}'
eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-config-server
- 3.修改啟動(dòng)類
修改啟動(dòng)類却音,要加入這三個(gè)注解,因?yàn)橐?cè)到eureka-server上矢炼,所以需要@EnableDiscoveryClient這個(gè)注解
@EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class Sb2scConfigApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scConfigApplication.class, args);
}
}
然后運(yùn)行啟動(dòng)springboot項(xiàng)目系瓢,等啟動(dòng)成功后訪問(wèn)eureka的頁(yè)面,會(huì)發(fā)現(xiàn)sc-config-server已經(jīng)注冊(cè)到上面了句灌,如果啟動(dòng)報(bào)錯(cuò)夷陋,請(qǐng)檢查錯(cuò)誤信息。
三胰锌、搭建服務(wù)提供者服務(wù)sc-provider
編寫(xiě)一個(gè)服務(wù)提供者骗绕,為下邊的消費(fèi)者提供服務(wù),用到了spring-webflux(spring新出的非阻塞式框架)不是springmvc资昧,當(dāng)然你們公司用什么你還是繼續(xù)用什么酬土。
- 注意 : 這里除了application.xml,還需要一個(gè)bootstrap.yml, 因?yàn)閎ootstrap.yml得加載順序是在application.xml前邊,服務(wù)注冊(cè)和config配置必須放到bootstrap.yml。
- 修改build.gradle文件
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile('org.springframework.cloud:spring-cloud-starter-config')
compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.boot:spring-boot-starter-actuator')
- 2.編寫(xiě)配置文件bootstrap.yml
** 注意 : 這里除了application.xml,還需要一個(gè)bootstrap.yml*
application.xml我是放到遠(yuǎn)程倉(cāng)庫(kù)地址的格带,大家可以直接到我的遠(yuǎn)程倉(cāng)庫(kù)撤缴,根據(jù)項(xiàng)目名(sc-provider-config)查詢刹枉。配置文件的倉(cāng)庫(kù)地址:點(diǎn)擊訪問(wèn)。
eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-provider
spring:
application:
name: sc-provider
cloud:
config:
discovery:
enabled: true
service-id: sc-config-server
fail-fast: true
username: root
password: booszy
profile: csdn
- 3.編寫(xiě)代碼
編寫(xiě)主類
@EnableDiscoveryClient
@SpringBootApplication
public class Sb2scProviderApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scProviderApplication.class, args);
}
}
新建IndexController進(jìn)行測(cè)試屈呕,這里只是為了測(cè)試微宝,案例代碼使用的是webflux,如果想使用springmvc凉袱,修改jar包依賴即可芥吟。
@RestController
@RequestMapping("test")
public class IndexController {
//返回一個(gè)實(shí)體
@GetMapping("{msg}")
public Mono<String> sayHelloWorld(@PathVariable("msg") String msg) {
System.out.println("come on " + msg);
return Mono.just("sc-provider receive : " +msg);
}
//返回一個(gè)列表
@GetMapping("list")
public Flux<Integer> list() {
List<Integer> list = new ArrayList<>();
list.add(8);
list.add(22);
list.add(75);
list.add(93);
Flux<Integer> userFlux = Flux.fromIterable(list);
return userFlux;
}
}
運(yùn)行springboot項(xiàng)目,去eureka-server查看侦铜,有沒(méi)有注冊(cè)上专甩。
我們的sc-provider已經(jīng)注冊(cè)到eureka上了,訪問(wèn)接口钉稍,成功涤躲。
四、搭建消費(fèi)者服務(wù)sc-consumer
消費(fèi)者要訪問(wèn)服務(wù)提供者的服務(wù)贡未,這里用的是通過(guò)RestTemplate/feign請(qǐng)求resetful接口种樱,使用ribbon做客戶端負(fù)載均衡,hystrix做錯(cuò)誤處理俊卤,feign和ribbon二選一,案例中ribbon和feign都有嫩挤,也可以都用。
還是熟悉的配方消恍,熟悉的味道岂昭,新建springboot項(xiàng)目,添加項(xiàng)目依賴狠怨。
- 1.修改build.gradle文件
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile('org.springframework.cloud:spring-cloud-starter-config')
compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.cloud:spring-cloud-starter-openfeign')
compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix')
- 2.修改bootstrap.yml文件
application.yml 在git倉(cāng)庫(kù)约啊,請(qǐng)前往git倉(cāng)庫(kù)查看。
eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-consumer
spring:
application:
name: sc-consumer
cloud:
config:
discovery:
enabled: true
service-id: sc-config-server
fail-fast: true
username: root
password: booszy
profile: csdn
#新版配置佣赖,否則后面dashboard無(wú)法找到hystrix.stream
management:
endpoints:
web:
exposure:
include: '*'
- 3.編寫(xiě)代碼
啟動(dòng)類代碼
@RibbonClient 指定服務(wù)使用的負(fù)載均衡類型恰矩,name不指定服務(wù)則為所有的服務(wù)打開(kāi)負(fù)載均衡,也可以在用yml中進(jìn)行配置憎蛤。
@EnableHystrix 是支持hystrix打開(kāi)斷路器外傅,在規(guī)定時(shí)間內(nèi)失敗參數(shù)超過(guò)一定參數(shù),就會(huì)打開(kāi)斷路器俩檬,不會(huì)發(fā)起請(qǐng)求萎胰,而是直接進(jìn)入到錯(cuò)誤處理方法。
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrix
@SpringBootApplication
public class Sb2scConsumerApplication {
// ribbon需要配置豆胸,負(fù)載均衡
@Autowired
private RestTemplateBuilder builder;
// ribbon需要配置奥洼,負(fù)載均衡
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return builder.build();
}
public static void main(String[] args) {
SpringApplication.run(Sb2scConsumerApplication.class, args);
}
}
1.ribbon案例
ribbon不需要單獨(dú)依賴,新建 RibbonController
ribbon一個(gè)坑晚胡,不能接受List類型灵奖,要使用數(shù)組接收嚼沿。
@HystrixCommand(fallbackMethod="fallbackMethod")
如果請(qǐng)求失敗,會(huì)進(jìn)入fallbackMethod這個(gè)方法瓷患,fallbackMethod這個(gè)方法要求參數(shù)和返回值與回調(diào)他的方法保持一致骡尽。
@RestController
public class RibbonController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/ribbon/{wd}")
@HystrixCommand(fallbackMethod="fallbackMethod")
public Mono<String> sayHelloWorld(@PathVariable("wd") String parm) {
String res = this.restTemplate.getForObject("http://sc-provider/test/" + parm, String.class);
return Mono.just(res);
}
public Mono<String> fallbackMethod(@PathVariable("wd") String parm) {
return Mono.just("fallback");
}
運(yùn)行springboot項(xiàng)目,先看有沒(méi)有注冊(cè)到eureka-server上擅编。
注冊(cè)成功后攀细,訪問(wèn)接口,測(cè)試是否正確爱态。
ribbon使用就是這么簡(jiǎn)單谭贪,ribbon是springboot自帶,所以不需要單獨(dú)添加依賴锦担。
2.feign案例
在實(shí)際開(kāi)發(fā)中俭识,feign使用的還是挺多的,feign底層還是使用了ribbon洞渔。廢話不多說(shuō)套媚,直接上步驟,在服務(wù)消費(fèi)者中使用feign訪問(wèn)服務(wù)提供者磁椒。
- 1配置文件
ribbon:
ReadTimeout: 30000
ConnectTimeout: 15000
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
feign的默認(rèn)請(qǐng)求超時(shí)時(shí)間是1s堤瘤,所以經(jīng)常會(huì)出現(xiàn)超時(shí)的問(wèn)題,這里我設(shè)置的是10s浆熔,因?yàn)槲业臄?shù)據(jù)庫(kù)服務(wù)器在美國(guó)本辐,所以有時(shí)候請(qǐng)求會(huì)比較慢。ribbon的請(qǐng)求時(shí)間也要設(shè)置蘸拔,因?yàn)閒eign用的是ribbon师郑。這里貼的是application.yml文件中的一小段
- 2 編碼
1、主類注解
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrix
這三個(gè)都要调窍,hystrix主要作用是斷路器宝冕,會(huì)進(jìn)如fein的fallback中。 主類代碼在上面已經(jīng)貼出來(lái)了
2邓萨、編寫(xiě)feign接口地梨,MFeignClient.class
name是指要請(qǐng)求的服務(wù)名稱。這里請(qǐng)求的是服務(wù)提供者
fallback 是指請(qǐng)求失敗缔恳,進(jìn)入斷路器的類宝剖,和使用ribbon是一樣的。
configuration 是feign的一些配置歉甚,例如編碼器等万细。
@FeignClient(name = "sc-provider",fallback = MFeignClientFallback.class, configuration = MFeignConfig.class)
public interface MFeignClient {
// 這是被請(qǐng)求微服務(wù)的地址,也就是provider的地址
@GetMapping(value = "/test/{msg}")
String sayHelloWorld(@PathVariable("msg") String msg);
@GetMapping(value = "/test/list")
List<Integer> list();
@GetMapping(value = "/test/list")
Integer[] array();
}
- 3 MFeignConfig.class feign的配置
這里配置了feign的打印日志等級(jí)
@Configuration
public class MFeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
- 4 MFeignClientFallback.class 纸泄,斷路器回調(diào)方法
斷路器要實(shí)現(xiàn)上邊定義的MFeignClient接口赖钞,請(qǐng)求失敗腰素,進(jìn)入斷路器時(shí),會(huì)回調(diào)這里的方法雪营。
@Component
public class MFeignClientFallback implements MFeignClient{
@Override
public String sayHelloWorld(String msg) {
return "fallback";
}
@Override
public List<Integer> list() {
return new ArrayList<>();
}
@Override
public Integer[] array() {
return new Integer[0];
}
}
- 5 在controller中使用feign
@RestController
public class FeignController {
@Autowired
private MFeignClient feignClient;
@GetMapping("/feign/{wd}")
public Mono<String> sayHelloWorld(@PathVariable("wd") String parm) {
String result = feignClient.sayHelloWorld(parm);
return Mono.just(result);
}
@GetMapping("/feign/list")
public Flux<Integer> list() {
List<Integer> list = feignClient.list();
Flux<Integer> userFlux = Flux.fromIterable(list);
return userFlux;
}
@GetMapping("/feign/array")
public Flux<Integer> array() {
Integer[] arrays = feignClient.array();
Flux<Integer> userFlux = Flux.fromArray(arrays);
return userFlux;
}
}
五弓千、用zuul做路由轉(zhuǎn)發(fā)和負(fù)載均衡
這些微服務(wù)都是隱藏在后端的,用戶是看不到献起,或者不是直接接觸洋访,可以用nginx或者zuul進(jìn)行路由轉(zhuǎn)發(fā)和負(fù)載均衡,zuul負(fù)載均衡默認(rèn)用的是ribbon谴餐。
- 1.修改build.gradle文件
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile('org.springframework.cloud:spring-cloud-starter-config')
compile('org.springframework.cloud:spring-cloud-starter-netflix-zuul')
compile('org.springframework.boot:spring-boot-starter-actuator')
- 2.修改bootstrap.yml
還是原來(lái)的配方姻政,application.yml在git倉(cāng)庫(kù)
eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-zuul
spring:
application:
name: sc-zuul
cloud:
config:
discovery:
enabled: true
service-id: sc-config-server
fail-fast: true
username: root
password: booszy
profile: csdn
- 3.啟動(dòng)類
@RefreshScope這個(gè)注解是當(dāng)application.yml配置文件發(fā)生變化的時(shí)候,不需要手動(dòng)的進(jìn)行重啟总寒,調(diào)用localhost:8400/refresh,就會(huì)加載新的配置文件扶歪,當(dāng)然正在訪問(wèn)的客戶并不影響還是使用舊的配置文件,因?yàn)椴皇侵貑⑸阏ⅲ髞?lái)的用戶會(huì)使用新的配置文件。注意這塊的刷新要用post請(qǐng)求妹萨。
@EnableDiscoveryClient
@SpringBootApplication
@EnableZuulProxy
@RefreshScope
public class Sb2scZuulApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scZuulApplication.class, args);
}
}
啟動(dòng)springboot項(xiàng)目年枕,訪問(wèn)eureka-server
這時(shí)候,我們就要通過(guò)zuul訪問(wèn)微服務(wù)了乎完,而不是直接去訪問(wèn)微服務(wù)熏兄。
應(yīng)該訪問(wèn)地址http://localhost:8400/sc-consumer/feign/list,這塊你要換成你的zuul地址树姨。
但是有些人就會(huì)說(shuō)摩桶,這樣以后用戶請(qǐng)求會(huì)不會(huì)太長(zhǎng),比較反感帽揪,所以可以通過(guò)配置進(jìn)行修改訪問(wèn)地址硝清。
zuul:
routes:
springcloud-consumer-config: /consumer/**
springcloud-provider-config: /provider/**
在application.yml中加入這樣一段配置,其實(shí)就是nginx中的反向代理转晰,使用一下簡(jiǎn)短的可以代理這個(gè)微服務(wù)芦拿。這個(gè)時(shí)候我們就可以這樣去訪問(wèn)了http://localhost:8400/consumer/feign/list,是不是簡(jiǎn)短了很多
六查邢、用hystrix-turbine-dashboard 做集群監(jiān)控
項(xiàng)目在生產(chǎn)環(huán)境中蔗崎,每個(gè)服務(wù)的訪問(wèn)量都不通,有些服務(wù)的訪問(wèn)量比較大扰藕,有時(shí)候有些服務(wù)掛了缓苛,不能繼續(xù)服務(wù),需要重啟的時(shí)候邓深,我們并不知道未桥,所以這時(shí)候就需要使用hystrix-turbine-dashboard做一個(gè)監(jiān)控番官,監(jiān)控所有的微服務(wù),可以看到這個(gè)接口實(shí)時(shí)訪問(wèn)量钢属,和健康狀況徘熔。
新建一個(gè)springboot項(xiàng)目,老套路淆党,加入如下依賴
- 1 添加依賴
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix')
compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix-dashboard')
compile('org.springframework.cloud:spring-cloud-starter-netflix-turbine')
- 2 修改application.yml配置文件
注意:是application.yml酷师,這里不需要bootstrap.yml
server:
port: 8900
eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-dashboard
turbine:
aggregator:
clusterConfig: default
appConfig: sc-consumer
clusterNameExpression: "'default'"
spring:
application:
name: sc-dashboard
#management:
# endpoints:
# web:
# exposure:
# include: '*'
appConfig 后面是要檢測(cè)的注冊(cè)在eureka上的服務(wù)名,必須要有
- 3 修改主類
@EnableTurbine 染乌,@EnableHystrixDashboard 一個(gè)都不能少
@EnableDiscoveryClient
@SpringBootApplication
@EnableTurbine
@EnableHystrixDashboard
public class Sb2scDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scDashboardApplication.class, args);
}
}
- 4 訪問(wèn)測(cè)試
這塊的端口是8900山孔,訪問(wèn)地址http://localhost:8900/hystrix,看到的是下面的頁(yè)面荷憋。
然后在那個(gè)網(wǎng)址的輸入框里輸網(wǎng)址http://localhost:8900/turbine.stream台颠,點(diǎn)擊monitor stream。剛打開(kāi)的時(shí)候可能是空的勒庄,什么也沒(méi)有串前,這并不表示你已經(jīng)錯(cuò)了。這時(shí)候你訪問(wèn)消費(fèi)者服務(wù)的接口实蔽,例如訪問(wèn)http://localhost:8400/consumer/feign/list荡碾,多訪問(wèn)幾次,然后看控制臺(tái)有沒(méi)有出現(xiàn)一個(gè)監(jiān)控面板局装,沒(méi)有就等會(huì)刷新一次坛吁,如果一直不出現(xiàn),應(yīng)該是配置有問(wèn)題铐尚。
七拨脉、使用sleuth+zipkin 實(shí)現(xiàn)鏈路追蹤服務(wù)
在使用微服務(wù)的時(shí)候,我們發(fā)現(xiàn)宣增,有時(shí)候排錯(cuò)不好排查玫膀,所以就給大家整個(gè)這個(gè)鏈路追蹤,很方便知道是哪一個(gè)服務(wù)調(diào)用哪一個(gè)服務(wù)出現(xiàn)了問(wèn)題统舀。因?yàn)橛行╉?xiàng)目可能服務(wù)比較多匆骗。
- 1 添加依賴
新建一個(gè)springboot項(xiàng)目
雖然其他服務(wù)調(diào)用zipkin不是從eureka上動(dòng)態(tài)過(guò)去服務(wù)地址,而是硬編碼誉简,但是這塊還是考慮吧zipkin注冊(cè)到eureka上碉就。
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile group: 'io.zipkin.java', name: 'zipkin-server', version: '2.9.3'
compile group: 'io.zipkin.java', name: 'zipkin-autoconfigure-ui', version: '2.9.3'
compile('org.springframework.boot:spring-boot-starter-actuator')
如果提示log4j有沖突,要排除依賴
configurations {
compile.exclude module: 'log4j'
compile.exclude module: 'slf4j-log4j12'
compile.exclude module: 'spring-boot-starter-logging'
}
- 2 修改application配置文件
server:
port: 9411
spring:
application:
name: sc-sc-zipkin
profiles:
active: csdn
eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-zipkin
management:
metrics:
web:
server:
auto-time-requests: false
- 3 主類注解添加
@EnableZipkinServer 主要是這個(gè)注解
啟動(dòng)服務(wù)后訪問(wèn)http://localhost:9411,就可以打開(kāi)zipkin的控制臺(tái)頁(yè)面闷串,這時(shí)候應(yīng)該是什么都沒(méi)有
@EnableDiscoveryClient
@SpringBootApplication
@EnableZipkinServer
public class Sb2scZipkinApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scZipkinApplication.class, args);
}
}
- 4 其他服務(wù)中調(diào)用
這里我們?cè)谙M(fèi)者服務(wù)和提供者服務(wù)里都加入如下依賴
....
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-sleuth', version: '1.3.1.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-sleuth-zipkin', version: '1.3.1.RELEASE'
...
然后修改配置文件瓮钥,bootstrap.yml、
這塊zipkin的地址是硬編碼的,目前還沒(méi)發(fā)現(xiàn)怎么從服務(wù)注冊(cè)中心eureka上動(dòng)態(tài)獲取碉熄,以后有解決方案桨武,會(huì)更新帖子
sleuth這個(gè)是配置提取率,可以配置也可以不配置
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
percentage: 1.0
啟動(dòng)服務(wù)锈津,然后訪問(wèn)消費(fèi)者服務(wù)的接口呀酸,這時(shí)候訪問(wèn)zipkin的控制臺(tái)http://localhost:9411
點(diǎn)擊依賴分析,可以看到調(diào)用服務(wù)鏈琼梆,因?yàn)檫@塊只涉及到兩個(gè)服務(wù)性誉,所以只有兩個(gè),在實(shí)際生產(chǎn)環(huán)境中茎杂,這塊可能有很多错览,到時(shí)候看起來(lái)就特別直觀了。
關(guān)注
如果有問(wèn)題煌往,請(qǐng)?jiān)谙路皆u(píng)論倾哺,或者加群討論 200909980
關(guān)注下方微信公眾號(hào),可以及時(shí)獲取到各種技術(shù)的干貨哦刽脖,如果你有想推薦的帖子羞海,也可以聯(lián)系我們的。