(一)服務的注冊於發現(eureka);
Eureka Server: 服務注冊中心,負責服務列表的注冊、維護和查詢等功能
在Idea里,新建項目,選擇Spring initializer.
下面的pom
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
配置properties文件參數;
server.port=8882 #域名 eureka.instance.hostname=localhost #禁用 Eureka的客戶端注冊行為 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false #eureka注冊中心服務地址 eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
在啟動類上添加注解@EnableEurekaServer
// @EnableEurekaServer 代表啟動注冊服務中心 @EnableEurekaServer @SpringBootApplication public class SpringCloundEurekaDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringCloundEurekaDemoApplication.class, args); } }
啟動項目,打開連接 http://localhost:8882
二.創建一個服務提供者(Eureka-client)
服務提供方,同時也是一個Eureka Client
,負責將所提供的服務向Eureka Server
進行注冊、續約和注銷等操作。注冊時所提供的主要數據包括服務名、機器ip、端口號、域名等,從而能夠使服務消費方能夠找到
Eureka服務器我們已經編寫好了,接下來我們就可以編寫一個Eureka的客戶端了。這個客戶端可能是一個服務提供者,也可能是一個服務消費者,甚至兩者都是。
我們先編寫一個簡單的Eureka Client
在Idea里,新建項目,選擇Spring initializ.
下面的pom
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>1.4.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
配置yml文件參數;(換下配置方式)
eureka: client: serviceUrl: defaultZone: http://localhost:8882/eureka/ server: port: 8883 spring: application: name: service-hello
在啟動類上添加注解@EnableEurekaClient
// @ EnableEurekaClient 表示申明自己是一個發服務提供者; @EnableEurekaClient @SpringBootApplication public class SpringCloundEurekaClientExampleApplication { public static void main(String[] args) { SpringApplication.run(SpringCloundEurekaClientExampleApplication.class, args); } }
創建conroller
@RestController public class HelloController { @Value("${server.port}") String port; @Value("${spring.application.name}") String name; @RequestMapping("/index") public String index() { return "服務提供者client:" + name + "服務端口:" + port; } }
啟動項目
然后我們再來看一下服務注冊中心;就會看到,已經注冊了一個服務提供者;
為了接下來測試Ribbon負載
我們將client的配置文件屬性注冊的端口改為8884;;然后在IDEA把該服務再啟動一個實例
(把single instance only勾選去掉)
回到服務中心,已經有兩個client了
此外
Spring Cloud實現心跳監測,在服務注冊和停止時,注冊中心能得到通知,並更新服務實例列表
(一)Spring Cloud注冊中心添加配置:
eureka.server.enable-self-preservation=false
eureka.server.enable-self-preservation
默認情況下,如果Eureka Server在一定時間內沒有接收到某個微服務實例的心跳,Eureka Server將會注銷該實例(默認90秒)。但是當網絡分區故障發生時,微服務與Eureka Server之間無法正常通信,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該注銷這個微服務。
Eureka通過“自我保護模式”來解決這個問題——當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網絡分區故障),那么這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務注冊表中的信息,不再刪除服務注冊表中的數據(也就是不會注銷任何微服務)。當網絡故障恢復后,該Eureka Server節點會自動退出自我保護模式。
綜上,自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目注銷任何健康的微服務。使用自我保護模式,可以讓Eureka集群更加的健壯、穩定。
eureka.server.eviction-interval-timer-in-ms
eureka server清理無效節點的時間間隔,默認60000毫秒,即60秒
(二)Spring Cloud服務提供者添加配置:
eureka.instance.lease-renewal-interval-in-seconds=5 eureka.instance.lease-expiration-duration-in-seconds=5
eureka.client.registry-fetch-interval-seconds
表示eureka client間隔多久去拉取服務注冊信息,默認為30秒,對於api-gateway,如果要迅速獲取服務注冊狀態,可以縮小該值,比如5秒
eureka.instance.lease-expiration-duration-in-seconds
leaseExpirationDurationInSeconds,表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超時時間,在這個時間內若沒收到下一次心跳,則將移除該instance。
- 默認為90秒
- 如果該值太大,則很可能將流量轉發過去的時候,該instance已經不存活了。
- 如果該值設置太小了,則instance則很可能因為臨時的網絡抖動而被摘除掉。
- 該值至少應該大於leaseRenewalIntervalInSeconds
eureka.instance.lease-renewal-interval-in-seconds
leaseRenewalIntervalInSeconds,表示eureka client發送心跳給server端的頻率。如果在leaseExpirationDurationInSeconds后,server端沒有收到client的心跳,則將摘除該instance。除此之外,如果該instance實現了HealthCheckCallback,並決定讓自己unavailable的話,則該instance也不會接收到流量。
- 默認30秒
所屬文章參考:https://www.jianshu.com/u/8f959a9cbc66。https://blog.csdn.net/qq_41377914/article/category/7719803