1. 程式人生 > >Spring服務發現、動態路由、斷路器

Spring服務發現、動態路由、斷路器

服務發現

  • 服務發現是Eureka的伺服器,引入這個服務,在Application上加入 @EnableEurekaServer即可,無需任何其他操作。
  • 每個服務配置一個application name,方便區分。
  • 多個可以構建成叢集,相互註冊。
spring:
  application:
    name: eureka1-server
  profiles: first
server:
  port: 9001
eureka:
  instance:
    hostname: eureka1
  client:
    register-with-eureka: true
    fetch-registry
: true service-url: defaultZone: http://eureka2:9002/eureka/,http://eureka3:9003/eureka/

伺服器註冊

  • 註冊只要在Application上加上 @EnableDiscoveryClient即可
  • 同樣需要一個ApplicationName
  • 需要指明有哪些euraka註冊伺服器可用
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:9001/eureka/,http://eureka2:9002/eureka/,http://eureka3:9003/eureka
/

動態路由

  • 使用動態路由,原因是前面呼叫方,並不想知道哪些具體的服務可用,對呼叫方來說最好一個地址就可以。
  • 動態路由類似Nginx的作用,對服務進行反向代理。
  • Zuul可以根據url配置哪些url使用哪些服務,而這些服務可以是eureka上的服務,這樣就實現了動態路由。
  • Application加上@EnableZuulProxy即可
  • 配置路由規則
#route test1
zuul.routes.test1.path=/test1/**
zuul.routes.test1.serviceId=TEST1

也可以用

zuul.routes.test1.url=http://localhost

我傾向於用前者,這樣可以利用eureka的動態服務表
* 使用eureka服務獲取服務列表

eureka.client.service-url.defaultZone=http://eureka1:9001/eureka/,http://eureka2:9002/eureka/,http://eureka3:9003/eureka/
  • 這裡有個小問題,服務註冊到eureka上後,名稱都變成了大寫,在zuul裡面的serviceId也必須大寫,否則找不到

  • 很顯然,zuul可以配置多個實現負載均衡和故障轉移。

  • zuul的可用性也是個問題。如果有高可用的負載均衡器,可以在前面放一個,呼叫方訪問負載均衡器,這樣一個zuul掛了就自動故障遷移了。比如一些雲服務提供的SLB

斷路器

  • 可以在服務不可用或者延遲很大的時候,直接fail,避免系統雪崩。
  • 可以用在遠端呼叫上,也可以用在普通方法上。
  • @FeignClient直接支援斷路器
  • @HystrixCommand 標註一個斷路器

FeignClient

註解式的遠端REST呼叫,把呼叫轉換成一個介面,而不是RestTemplate呼叫。
* 註解式宣告REST呼叫
* 直接和Eureka Server接通,呼叫上面的服務。
* 支援斷路器
* @EnableEurekaClient 從Eureka上獲取服務列表
* @EnableFeignClients 支援FeigeClients
* @FeignClient(value = “test1”,fallback = TestClientFallback.class) 支援Fallback
* Java呼叫REST,首選用FeignClient
* 其他程式比如php,通過zuul呼叫