Spring服務發現、動態路由、斷路器
阿新 • • 發佈:2019-02-07
服務發現
- 服務發現是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呼叫