springcloud微服務實戰:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

springcloud微服務實戰:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

注意:這篇文章是基於springboot1.x老版本springcloud,springboot2.x的springcloud(Finchley之後)新版本文章,請移步升級版專貼

新版本地址 https://blog.csdn.net/yp090416/article/details/81414105

相信現在已經有很多小夥伴已經或者準備使用springcloud微服務了,接下來爲大家搭建一個微服務框架,後期可以自己進行擴展。會提供一個小案例: 服務提供者和服務消費者 ,消費者會調用提供者的服務,新建的項目都是用springboot,附源碼下載,推薦使用coding地址下載,因爲可以切換分支,後期可以及時更新。

coding倉庫地址(推薦下載): coding地址 csdn下載地址: csdn下載地址 遠程配置倉庫地址 遠程配置倉庫地址

如果有問題請在下邊評論,或者200909980加羣交流。

Eureka/Consul:服務發現 (根據情況選擇一個)
Hystrix:斷路器
Zuul:智能路由
Ribbon/Feign:客戶端負載均衡 (Feign用的更多)
Turbine:集羣監控
Springcloud-config:遠程獲取配置文件

這裏寫圖片描述

接下來,我們開始搭建項目,首先我們到spring爲我們提供的一個網站快速搭建springboot項目,點擊訪問,我這裏用的是gradle,如果各位客官喜歡用maven,好吧你可以到http://mvnrepository.com/查看對應的依賴,點我訪問

一、搭建eureka-server服務springcloud-eureka-server

使用 spring-cloud-consul 作爲服務發現 請參考 點擊查看使用springcloud consul 作爲服務發現

eureka-server作爲服務發現的核心,第一個搭建,後面的服務都要註冊到eureka-server上,意思是告訴eureka-server自己的服務地址是啥。當然還可以用zookeeper或者springconsul。

這裏寫圖片描述

  • 1.修改build.gradle文件

如果是maven項目請對應的修改pom.xml

//加入阿里的私服倉庫地址
maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
//加入依賴  
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka-server', version: '1.3.4.RELEASE'
//加入security,是因爲訪問eureka-server需要用戶名和密碼訪問,爲了安全
compile group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '1.5.6.RELEASE'

還有幾點需要修改的,大家對應圖片看看,就是springboot打包的時候會提示找不到主累。
這裏寫圖片描述

  • 2.修改 application.yml,建議用yml。
server:
  port: 8761
eureka:
  datacenter: trmap
  environment: product
  client:
    healthcheck:
      enabled: true
    service-url:
      defaultZone: http://root:booszy@localhost:8761/eureka
    register-with-eureka: false #關閉自己作爲客戶端註冊
    fetch-registry: false
security:
  basic:
    enabled: true
  user:
    name: root #用戶名和密碼,等會訪問的時候,會要求你登錄,服務註冊的時候也需要帶着用戶名和密碼
    password: booszy
  • 3.修改程序的主類,建議修改類名,要加如eureka的 @EnableEurekaServer 註解,然後運行main方法。
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

這裏寫圖片描述

http://localhost:8761/ 這個是eureka-server的頁面地址,到這裏,說明eureka-server搭建好了,簡單吧,這一步一定要成功,否則後面的就不能繼續進行下去了,後邊基本類似。

二、搭建config-server服務springcloud-config-server

springcloud-config-server是用來將遠程git倉庫的配置文件動態拉下來,這樣配置文件就可以動態的維護了。當然也可以選擇本地倉庫。

新建一個springboot項目,修改maven私服地址,並加入一下依賴。

  • 1.修改build.gradle文件
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-config-server', version: '1.3.2.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE'
//連接config-server也需要用戶名和密碼
compile group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '1.5.6.RELEASE'
  • 2.修改application.yml文件
server:
  port: 8500
eureka:
  client:
    service-url:
      #註冊服務到eureka上,記住這裏要加上eureka-server的用戶名和密碼
      defaultZone: http://root:booszy@localhost:8761/eureka
  instance:
    prefer-ip-address: true
    #可能比較長,複製的時候請寫在一行
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
    appname: springcloud-config-server
spring:
  application:
    name: springcloud-config-server
  cloud:
    config:
      server:
        git:
          #這是其他項目配置文件的git倉庫地址
          uri: https://git.coding.net/yirenyishi/springcloud-config-profile
          searchPaths: '{application}'
security:
  basic:
    enabled: true
  user:
    #這是config-server的用戶名和密碼
    name: root
    password: booszy
  • 3.修改啓動類

修改啓動類,要加入這三個註解,因爲要註冊到eureka-server上,所以需要@EnableEurekaClient這個註解

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigServerApplication {

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

然後運行啓動springboot項目,等啓動成功後訪問eureka的頁面,會發現springcloud-config-server已經註冊到上面了,如果啓動報錯,請檢查錯誤信息。

這裏寫圖片描述

三、搭建服務提供者服務springcloud-provider-config

編寫一個服務提供者,提供兩個接口,即獲取單個用戶的信息和獲取一個用戶列表。用到了spring-data-jpa 和 spring-webmvc ,當然你們公司用什麼你還是繼續用什麼。

  • 注意 : 這裏除了application.xml,還需要一個bootstrap.yml, 因爲bootstrap.yml得加載順序是在application.xml前邊

    1. 修改build.gradle文件
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
compile("com.alibaba:druid-spring-boot-starter:1.1.2")
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-config', version: '1.3.2.RELEASE'
compile group: 'org.springframework.session', name: 'spring-session-data-redis', version: '1.3.1.RELEASE'
runtime('mysql:mysql-connector-java')
  • 2.編寫配置文件bootstrap.yml

* 注意 : 這裏除了application.xml,還需要一個bootstrap.yml

application.xml我是放到遠程倉庫地址的,大家可以直接到我的遠程倉庫,根據項目名(springcloud-provider-config)查詢。配置文件的倉庫地址:點擊訪問

spring:
  application:
    name: springcloud-provider-config
  cloud:
    config:
      #config-server的配置,不需要硬編碼config-server的地址,使用service-id去eureka-server獲取cong-server的地址
      discovery:
        enabled: true
        service-id: springcloud-config-server
      fail-fast: true
      username: root
      password: booszy
      profile: dev
eureka:
  client:
    service-url:
      defaultZone: http://root:booszy@localhost:8761/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
    appname: springcloud-provider-config
  • 3.編寫代碼

編寫主類

@SpringBootApplication
@EnableEurekaClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

新建UserController, 考慮篇幅 UserService 和 UserRepository就不貼代碼了,想看的可以下載我的代碼。

@RequestMapping("user")
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public User getuser(@PathVariable String id) {
        User user = null;
        try {
            System.out.println(id);
            user = userService.find(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return user;
    }

    /**
     * @return
     */
    @GetMapping("list")
    public List<User> users() {
        try {
            List<User> user = userService.findAll();
            if (user != null && user.size() != 0) {
                return user;
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

運行springboot項目,去eureka-server查看,有沒有註冊上。

這裏寫圖片描述

我們的springcloud-provider-config已經註冊到eureka上了,訪問接口,成功。

這裏寫圖片描述

四、搭建消費者服務springcloud-consumer-ribbon-config-swagger

消費者要訪問服務提供者的服務,這裏用的是通過RestTemplate請求resetful接口,使用ribbon做客戶端負載均衡,hystrix做錯誤處理,swagger生成接口文檔。文章結尾處會更新feign的案例,feign和ribbon二選一,也可以都用。
還是熟悉的配方,熟悉的味道,新建springboot項目,添加項目依賴。

  • 1.修改build.gradle文件
compile('org.springframework.boot:spring-boot-starter-web')
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-config', version: '1.3.2.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix', version: '1.3.4.RELEASE'
compile(
    "io.springfox:springfox-swagger2:2.7.0",
    "io.springfox:springfox-swagger-ui:2.7.0"
)
  • 2.修改bootstrap.yml文件

application.yml 在git倉庫,請前往git倉庫查看。

spring:
  application:
    name: springcloud-consumer-config
  cloud:
    config:
      discovery:
        enabled: true
        service-id: springcloud-config-server
      fail-fast: true
      username: root
      password: booszy
      profile: dev
eureka:
  client:
    service-url:
      defaultZone: http://root:booszy@localhost:8761/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
    appname: springcloud-consumer-config
  • 3.編寫代碼

啓動類代碼

@RibbonClient 指定服務使用的負載均衡類型,name不指定服務則爲所有的服務打開負載均衡,也可以在用yml中進行配置。
@EnableHystrix 是支持hystrix打開斷路器,在規定時間內失敗參數超過一定參數,就會打開斷路器,不會發起請求,而是直接進入到錯誤處理方法。

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "springcloud-provider-config", configuration = RibbonConfiguration.class)
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExtendRibbon.class)})
@EnableHystrix
public class ConsumerApplication {
    @Autowired
    private RestTemplateBuilder builder;

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return builder.build();
    }

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

新建UserController

ribbon一個坑,不能接受List類型,要使用數組接收。
@Api xxx 是swagger的註解
@HystrixCommand(fallbackMethod=”userFallbackMethod”)
如果請求失敗,會進入userFallbackMethod這個方法,userFallbackMethod這個方法要求參數和返回值與回調他的方法保持一致。

ribbon這個方法就是通過service-id獲取獲取服務實際的地址,這樣服務的地址就不用硬編碼了。

@Api("springcloud consumer user 控制器")
@RequestMapping("user")
@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    /**
     * @param id
     * @return
     */
    @ApiOperation(value = "根據用戶id查詢用戶信息", httpMethod = "GET", produces = "application/json")
    @ApiResponse(code = 200, message = "success", response = User.class)
    @GetMapping("{id}")
    @HystrixCommand(fallbackMethod="userFallbackMethod")
    public User getUser(@ApiParam(name = "id", required = true, value = "用戶Id") @PathVariable String id) {
        return this.restTemplate.getForObject("http://springcloud-provider-config/user/" + id, User.class);
    }

    public User userFallbackMethod(String id){
        return null;
    }

    /**
     * 這塊ribbon不支持複雜數據類型list,所以要用數組接受,然後轉list
     * @return
     */
    @GetMapping("list")
    @HystrixCommand(fallbackMethod = "userList")
    public List<User> users(HttpServletRequest request) {
        try {
            User[] forObject = this.restTemplate.getForObject("http://springcloud-provider-config/user/list", User[].class);
            List<User> users = Arrays.asList(forObject);
            return users == null ? new ArrayList<User>() : users;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public List<User> userList(HttpServletRequest request) {
        return null;
    }

    /**
     * 通過服務id獲取服務的地址
     * @return
     */
    @GetMapping("ribbon")
    public String ribbon(){
        ServiceInstance serviceInstance = loadBalancerClient.choose("springcloud-provider-config");
        return serviceInstance.getUri().toString();
    }
}

運行springboot項目,先看有沒有註冊到eureka-server上。

這裏寫圖片描述

註冊成功後,訪問接口,測試是否正確。

這裏寫圖片描述

測試swagger-ui,訪問localhost:8200/swagger-ui.html

這裏寫圖片描述

到這裏消費者服務就算是完成了,後邊大家自己進行擴展。

五、用zuul做路由轉發和負載均衡

這些微服務都是隱藏在後端的,用戶是看不到,或者不是直接接觸,可以用nginx或者zuul進行路由轉發和負載均衡,zuul負載均衡默認用的是ribbon。

  • 1.修改build.gradle文件
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-zuul', version: '1.3.4.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-config', version: '1.3.2.RELEASE'
  • 2.修改bootstrap.yml

還是原來的配方,application.yml在git倉庫

spring:
  application:
    name: springcloud-zuul
  cloud:
    config:
      discovery:
        enabled: true
        service-id: springcloud-config-server
      fail-fast: true
      username: root
      password: booszy
      profile: dev
eureka:
  client:
    service-url:
      defaultZone: http://root:booszy@localhost:8761/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
    appname: springcloud-zuul
  • 3.啓動類

@RefreshScope這個註解是當application.yml配置文件發生變化的時候,不需要手動的進行重啓,調用localhost:8400/refresh,就會加載新的配置文件,當然正在訪問的客戶並不影響還是使用舊的配置文件,因爲不是重啓,後來的用戶會使用新的配置文件。注意這塊的刷新要用post請求

@SpringBootApplication 

@EnableEurekaClient
@EnableZuulProxy
@RefreshScope
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }

}

啓動springboot項目,訪問eureka-server

這裏寫圖片描述

這時候,我們就要通過zuul訪問微服務了,而不是直接去訪問微服務。
應該訪問地址http://192.168.89.89:8400/springcloud-consumer-config/user/list,這塊你要換成你的zuul地址。

但是有些人就會說,這樣以後用戶請求會不會太長,比較反感,所以可以通過配置進行修改訪問地址。

zuul:
  routes:
    springcloud-consumer-config: /consumer/**
    springcloud-provider-config: /provider/**

在application.yml中加入這樣一段配置,其實就是nginx中的反向代理,使用一下簡短的可以代理這個微服務。這個時候我們就可以這樣去訪問了http://192.168.89.89:8400/consumer/user/list,是不是簡短了很多

這裏寫圖片描述

六、用hystrix-turbine-dashboard 做集羣監控

項目在生產環境中,每個服務的訪問量都不通,有些服務的訪問量比較大,有時候有些服務掛了,不能繼續服務,需要重啓的時候,我們並不知道,所以這時候就需要使用hystrix-turbine-dashboard做一個監控,監控所有的微服務,可以看到這個接口實時訪問量,和健康狀況。
新建一個springboot項目,老套路,加入如下依賴

  • 1 添加依賴
    compile('org.springframework.boot:spring-boot-starter-web')
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-netflix-turbine', version: '1.3.4.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix', version: '1.3.4.RELEASE'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix-dashboard', version: '1.3.4.RELEASE'
  • 2 修改application.yml配置文件
server:
  port: 8900
eureka:
  client:
    healthcheck:
      enabled: true
    service-url:
      defaultZone: http://root:booszy@localhost:8761/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
    appname: springcloud-turbine-dashboard
turbine:
  aggregator:
    clusterConfig: default
  appConfig: springcloud-consumer-config,springcloud-provider-config
  clusterNameExpression: "'default'"
spring:
  application:
    name: springcloud-turbine-dashboard

appConfig 後面是要檢測的註冊在eureka上的服務名,必須要有

  • 3 修改主類

@EnableTurbine ,@EnableHystrixDashboard 一個都不能少

@SpringBootApplication
@EnableTurbine
@EnableEurekaClient
@EnableHystrixDashboard
public class TurbineDashboardApplication {

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

訪問hystrix-dashboard頁面

然後在那個網址的輸入框裏輸網址http://localhost:8900/turbine.stream,點擊monitor stream。剛打開的時候可能是空的,什麼也沒有,這並不表示你已經錯了。這時候你訪問消費者服務的接口,例如訪問http://localhost:8200/user/list,多訪問幾次,然後看控制檯有沒有出現一個監控面板,沒有就等會刷新一次,如果一直不出現,應該是配置有問題。

這裏寫圖片描述

後邊更新會追加到後邊,後邊隨時更新


2018-01-24 更新:補充使用feign


七、使用feign

在實際開發中,feign使用的還是挺多的,feign底層還是使用了ribbon。廢話不多說,直接上步驟,在服務消費者中使用feign訪問服務提供者。新建一個springboot項目,或者複製一個。

  • 1加入依賴

swagger不使用的話,可以刪掉。

compile('org.springframework.boot:spring-boot-starter-web')
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-actuator', version: '1.5.6.RELEASE'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-config', version: '1.3.2.RELEASE'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-feign', version: '1.3.4.RELEASE'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix', version: '1.3.4.RELEASE'
    compile(
            "io.springfox:springfox-swagger2:2.7.0",
            "io.springfox:springfox-swagger-ui:2.7.0"
    )
  • 2修改配置文件

    這裏修改的是bootstrap.yml,這裏吧application.yml的配置也貼出來,這個是放在遠程倉庫的,通過config動態拉取下來。

spring:
  application:
    name: springcloud-consumer-feign
  cloud:
    config:
      discovery:
        enabled: true
        service-id: springcloud-config-server
      fail-fast: true
      username: root
      password: booszy
      profile: csdn
eureka:
  client:
    service-url:
      defaultZone: http://root:booszy@localhost:8761/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
    appname: springcloud-consumer-feign

application.yml

server:
  port: 8201
logging:
  level:
    com.yasaka.stock.feign.MFeignClient: debug
feign:
  hystrix:
    enabled: true
ribbon:
  ReadTimeout:  30000
  ConnectTimeout:  15000
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 10000

feign的默認請求超時時間是1s,所以經常會出現超時的問題,這裏我設置的是10s,因爲我的數據庫服務器在美國,所以有時候請求會比較慢。ribbon的請求時間也要設置,因爲feign用的是ribbon。

  • 3 編碼

1、主類註解

@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrix

這三個都要,hystrix主要作用是斷路器,會進如fein的fallback中。

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrix
public class ConsumerApplication {

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

2、編寫feign接口,MFeignClient.class

name是指要請求的服務名稱。這裏請求的是服務提供者
fallback 是指請求失敗,進入斷路器的類,和使用ribbon是一樣的。
configuration 是feign的一些配置,例如編碼器等。

@FeignClient(name = "springcloud-provider-config",fallback = HystrixFeignFallback.class, configuration = MFeignConfig.class)
public interface MFeignClient {

    //這裏是使用feign請求的地址
    @RequestMapping(method = RequestMethod.GET, value = "/user/{id}")
    User getUser(@PathVariable("id") String id);

    //新版本支持使用GetMapping,之前的老版本可能不支持
    @GetMapping(value = "/user/list")
    List<User> getUsers();
}
  • 3 MFeignConfig.class feign的配置

    這裏配置了feign的打印日誌等級

@Configuration
public class MFeignConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
  • 4 HystrixFeignFallback.class ,斷路器回調方法

    斷路器要實現上邊定義的MFeignClient接口,請求失敗,進入斷路器時,會回調這裏的方法。

@Component
public class HystrixFeignFallback implements MFeignClient {
    @Override
    public User getUser(String id) {
        User user = new User();
        user.setId("233");
        return user;
    }

    @Override
    public List<User> getUsers() {
        return new ArrayList<User>();
    }
}
  • 5 在controller中使用feign
@Api("springcloud consumer user 控制器")
@RequestMapping("user")
@RestController
public class UserController {

    @Autowired
    private MFeignClient feignClient;

    /**
     * @param id
     * @return
     */
    @ApiOperation(value = "根據用戶id查詢用戶信息", httpMethod = "GET", produces = "application/json")
    @ApiResponse(code = 200, message = "success", response = User.class)
    @GetMapping("{id}")
    public User getUser(@ApiParam(name = "id",   required = true, value = "用戶Id") @PathVariable String id) {
        User user = feignClient.getUser(id);
        return user;
    }


    @GetMapping("list")
    public List<User> users(HttpServletRequest request) {
        try {
            List<User> users = feignClient.getUsers();
            return users == null ? new ArrayList<User>() : users;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

20180125更新: 補充使用sleuth+zipkin 實現鏈路追蹤服務


八、使用sleuth+zipkin 實現鏈路追蹤服務

在使用微服務的時候,我們發現,有時候排錯不好排查,所以就給大家整個這個鏈路追蹤,很方便知道是哪一個服務調用哪一個服務出現了問題。因爲有些項目可能服務比較多。

  • 1 添加依賴

    新建一個springboot項目
    雖然其他服務調用zipkin不是從eureka上動態過去服務地址,而是硬編碼,但是這塊還是考慮吧zipkin註冊到eureka上。

compile group: 'io.zipkin.java', name: 'zipkin-server', version: '2.4.4'
compile group: 'io.zipkin.java', name: 'zipkin-autoconfigure-ui', version: '2.4.4'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: '1.3.4.RELEASE'
  • 2 修改application配置文件
server:
  port: 9411
eureka:
  client:
    service-url:
      defaultZone: http://root:booszy@localhost:8761/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
    appname: springcloud-zipkin-server
spring:
  application:
    name: springcloud-zipkin-server
  • 3 主類註解添加

@EnableZipkinServer 主要是這個註解
啓動服務後訪問http://localhost:9411,就可以打開zipkin的控制檯頁面,這時候應該是什麼都沒有

@SpringBootApplication
@EnableZipkinServer
@EnableEurekaClient
public class ZipkinServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZipkinServerApplication.class, args);
    }
}
  • 4 其他服務中調用

這裏我們在消費者服務和提供者服務裏都加入如下依賴

....
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的地址是硬編碼的,目前還沒發現怎麼從服務註冊中心eureka上動態獲取,以後有解決方案,會更新帖子
sleuth這個是配置提取率,可以配置也可以不配置

spring:
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    sampler:
      percentage: 1.0

啓動服務,然後訪問消費者服務的接口,這時候訪問zipkin的控制檯http://localhost:9411

查看服務列表

點擊依賴分析,可以看到調用服務鏈,因爲這塊只涉及到兩個服務,所以只有兩個,在實際生產環境中,這塊可能有很多,到時候看起來就特別直觀了。

這裏寫圖片描述

關注

如果有問題,請在下方評論,或者加羣討論 200909980

關注下方微信公衆號,可以及時獲取到各種技術的乾貨哦,如果你有想推薦的帖子,也可以聯繫我們的。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章