- 概述
最近研究了一下springCloud的微服務集群,主要用到了SpringCloud的服務發現和服務器端負載均衡,所有的項目都是用的springboot,
可以和springCloud無縫對接。 - 技術選型
服務發現:eureka
負載均衡:zuul - 實現
Eureka集群(eurekaServer):8001、8002、8003
服務提供方(eurekaClient):9001、9002
服務端負載均衡服務:9100
1、新建工程eureka服務器,用idea創建springboot項目,引入eureka依賴
下面是三台服務器的配置文件
//第一台 server: port: 8001 spring: application: name: eureka-server eureka: server: use-read-only-response-cache: false #禁用readOnlyMap,分為ReadWriteMap和ReadOnlyMap eviction-interval-timer-in-ms: 3000 #主動失效檢測時間 instance: hostname: server8001 client: # register-with-eureka: false #false表示不將自己也作為服務注冊到eureka # fetch-registry: false service-url: #集群設置,搭建eureka集群,用逗號分隔 defaultZone: http://localhost:8002/eureka/,http://localhost:8003/eureka/ //第二台 server: port: 8002 spring: application: name: eureka-server eureka: server: use-read-only-response-cache: false eviction-interval-timer-in-ms: 3000 instance: hostname: server8002 client: # register-with-eureka: false #表示不將自己作為服務注冊進eureka # fetch-registry: false service-url: #集群設置,搭建eureka集群,用逗號分隔,defaultZone是map類型,所以沒有提示 defaultZone: http://localhost:8001/eureka/,http://localhost:8003/eureka/ //第三台 server: port: 8003 spring: application: name: eureka-server eureka: server: use-read-only-response-cache: false eviction-interval-timer-in-ms: 3000 instance: hostname: server8003 client: # register-with-eureka: false #表示不將自己作為服務注冊進eureka # fetch-registry: false service-url: #集群設置,搭建eureka集群,用逗號分隔,defaultZone是map類型,所以沒有提示 defaultZone: http://localhost:8001/eureka/,http://localhost:8002/eureka/
2、服務提供者
//第一台 server: port: 9001 spring: application: name: eureka-client eureka: client: service-url: # 指定集群服務器列表 defaultZone: http://localhost:8001/eureka/,http://localhost:8002/eureka/,http://localhost:8003/eureka/ instance: instance-id: client9001.com prefer-ip-address: true lease-renewal-interval-in-seconds: 5 #發送心跳包服務刷新時間 lease-expiration-duration-in-seconds: 15 #服務過期時間 //第二台 server: port: 9002 spring: application: name: eureka-client eureka: client: service-url: # 指定集群服務器列表 defaultZone: http://localhost:8001/eureka/ instance: instance-id: client9002.com prefer-ip-address: true lease-renewal-interval-in-seconds: 5 #發送心跳包服務刷新時間 lease-expiration-duration-in-seconds: 15 #服務過期時間
添加EnableEurekaClient注解,並添加api業務測試接口
3、zuul負載均衡服務server: port: 9100 spring: application: name: zuul-gateway eureka: client: service-url: defaultZone: http://localhost:8001/eureka,http://localhost:8002/eureka,http://localhost:8003/eureka registry-fetch-interval-seconds: 5 #拉取服務列表時間 instance: instance-id: gateway-9100.com prefer-ip-address: true zuul: prefix: /gateway ignored-services: eureka-client routes: eureka-client.serviceId: eureka-client eureka-client.path: /client/**
依次啟動Eureka服務器、服務提供者client,zull服務,訪問其中一台Eureka服務器的控制台顯示如下
問題:
1)、在配置eureka時,defaultZone是個map類型,不提供檢測,所以會發現在配置時沒有提示,直接寫就行;
2)、eurekaServer的hostname起的作用暫不明確,在控制台顯示的都是application的name,三台eureka集群和兩台服務提供客戶端的application.name分別是一樣的;
3)、eureka服務器的服務清單分為ReadWriteMap和ReadOnlyMap,其他服務讀取時是從ReadOnlyMap讀取的,當有服務注冊時,寫入的是ReadWriteMap,然后會同步到
ReadOnlyMap,這是為了解決讀寫鎖的問題。當一台服務提供應用宕機之后會發現控制台還是有這台服務器的信息,表示沒有將服務下線,服務清單列表沒有刪除這台
服務器的信息,導致zuul在負載均衡時,有時會調用到宕機的那台應用導致返回異常,解決方法是禁用掉eureka服務器的ReadOnlyMap,設置主動失效檢測時間,讓服務器定時
去檢測服務,服務提供者設置服務失效時間和發送心跳包的時間,zuul設置拉取服務清單的時間間隔
4)、zuul路由設置,設置路徑前綴和服務的匹配關系 - 測試
不停刷新頁面,會在9001和9002之間切換,證明配置成功,關閉9002應用,刷新頁面,剛開始還會出現訪問失敗,過了一段時間后就穩定了,
會有一個時間差,也可以給zuul配置熔斷器來進行服務降級或者轉發請求到其他正常服務。