springboot2新版springcloud微服務(wù)全家桶實(shí)戰(zhàn)

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)

1.png

一流济、搭建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.png
  • 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);
    }
}

4.png

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ò)誤信息。


3.png

三胰锌、搭建服務(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。
    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')
  • 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è)上专甩。


5.png

我們的sc-provider已經(jīng)注冊(cè)到eureka上了,訪問(wèn)接口钉稍,成功涤躲。


6.png

四、搭建消費(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上擅编。


7.png

注冊(cè)成功后攀细,訪問(wèn)接口,測(cè)試是否正確爱态。

8.png

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;
    }
}
9.png

五弓千、用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


10.png

這時(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)短了很多

11.png

六查邢、用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è)面荷憋。

13.png

然后在那個(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)題铐尚。

12.png

七拨脉、使用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

14.png

點(diǎn)擊依賴分析,可以看到調(diào)用服務(wù)鏈琼梆,因?yàn)檫@塊只涉及到兩個(gè)服務(wù)性誉,所以只有兩個(gè),在實(shí)際生產(chǎn)環(huán)境中茎杂,這塊可能有很多错览,到時(shí)候看起來(lái)就特別直觀了。

15.png
16.png

關(guān)注

如果有問(wèn)題煌往,請(qǐng)?jiān)谙路皆u(píng)論倾哺,或者加群討論 200909980

關(guān)注下方微信公眾號(hào),可以及時(shí)獲取到各種技術(shù)的干貨哦刽脖,如果你有想推薦的帖子羞海,也可以聯(lián)系我們的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末曾棕,一起剝皮案震驚了整個(gè)濱河市扣猫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翘地,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌幕,死亡現(xiàn)場(chǎng)離奇詭異衙耕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)勺远,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門橙喘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胶逢,你說(shuō)我怎么就攤上這事厅瞎。” “怎么了和簸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)锁保。 經(jīng)常有香客問(wèn)我,道長(zhǎng)爽柒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任浩村,我火速辦了婚禮,結(jié)果婚禮上心墅,老公的妹妹穿的比我還像新娘。我一直安慰自己嗓化,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布严肪。 她就那樣靜靜地躺著,像睡著了一般谦屑。 火紅的嫁衣襯著肌膚如雪驳糯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天氢橙,我揣著相機(jī)與錄音酝枢,去河邊找鬼。 笑死悍手,一個(gè)胖子當(dāng)著我的面吹牛帘睦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坦康,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼竣付,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了滞欠?” 一聲冷哼從身側(cè)響起古胆,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筛璧,沒(méi)想到半個(gè)月后逸绎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夭谤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年棺牧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沮翔。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陨帆,死狀恐怖曲秉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疲牵,我是刑警寧澤承二,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站纲爸,受9級(jí)特大地震影響亥鸠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜识啦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一负蚊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧家妆,春花似錦冕茅、人聲如沸姨伤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忿偷。三九已至臊泌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背礁凡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工顷牌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罪裹。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓状共,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冯袍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碾牌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348