三、Eurake 服务注册与发现「建议收藏」(汉典三字的基本解释)
3、 Eurake 服務注冊與發現
3.1 基于Springboot構建Eurake服務
在第二節中《Springboot項目構建》中的第三步 中選擇如下組件:左側選擇cloud Discovery在其子組件中選擇EurakeServer,我們在這里面還可以看到EurakeDiscovery、ZookeeperDiscovery等組件。 其中EurakeDiscovery就是我們后面,將服務提供方的服務注冊到EurakeServer 中時需要引入的組件。
項目構建成功后我們會在pom.xml發現如下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
說明我們已經成功引入了EurakeServer。 不過我們還需要進行下面配置 雖然我們已經引入了EurakeServer 組件,但我們還需要啟用他(后面很多組件也需要類似的方式去啟用):
@SpringBootApplication
@EnableEurekaServer
public class EurekaserverApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaserverApplication.class, args);
}
}
我們通過@EnableEurekaServer去啟用Eurake
在resources/application.properties中添加如下配置:
server.port=8761
eureka.client.register-with-eureka=false #是否將自己注冊到EurrkeServer,默認為true
eureka.client.fetch-registry=false #表示是否從EurekaServer獲取注冊信息,默認為true,表示需要從其他server同步信息
eureka.client.service-url.defaultZone= http://localhost:8761/eureka/#設置與EurekaServer 交互的地址,查詢服務和注冊服務都依賴這個地址
至此,我們的Eurake已經配置完成了,是不是很簡單。 啟動服務,打開http://localhost:8761/我們看看見如下頁面:
目前還沒有服務注冊進來。
Now that we’ve stood up a service registry, let’s stand up a client that both registers itself with the
registry and uses the Spring Cloud DiscoveryClient abstraction to interrogate the registry for it’s own host and port. The @EnableDiscoveryClient activates the Netflix Eureka DiscoveryClient implementation. There are other implementations for other service registries like Hashicorp’s Consul or Apache Zookeeper.
現在,我們已經注冊了一個服務注冊中心,讓我們再使用注冊表注冊自己的客戶端,并使用Spring Cloud DiscoveryClient抽象來詢問注冊表本身的主機和端口。@EnableDiscoveryClient激活Netflix Eureka DiscoveryClient實現。還有其他服務注冊的實現,比如Hashicorp的領事或Apache Zookeeper。
3.2 基于Springboot 構建服務提供方
在第二節中《Springboot項目構建》中的第三步 中選擇如下組件:
左側選擇cloud Discovery在其子組件中選擇EurakeDiscovery
項目構建成功后我們會在pom.xml發現如下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
其實與構建EurakeServer 的依賴一樣。
啟用服務發現:
@SpringBootApplication
@EnableDiscoveryClient
public class AppApplication {
public static void main(String[] args) {
SpringApplication.run(AppApplication.class, args);
}
}
在resources/application.properties中添加如下配置:
server.port=8802 #應用端口號
spring.application.name=app-8801 #服務名稱
eureka.client.service-url.defalutZone= http://localhost:8761/eureka/ #EurekaServer服務地址
turbine.combine-host-port=true #同一主機上的服務,以不同端口號區分,默認情況下是以host來區分,后面服務監控時是將到
eureka.instance.prefer-ip-address=true #表示將自己的IP注冊到EurekaServer 上,如果不配置或者將其設置為false,則表示將微服務所在系統的hostname注冊到EurekaServer上
啟動服務,我們再次打開http://localhost:8761/我們發現多了一條服務:
我們通過不同端口再次啟動該服務 我們發現有多了一條服務:
我們發現這兩個服務 屬于一個共同的application:APP-8801 ,當服務調用端Client去調用該服務是,只需知道服務名稱 APP-8801 ,Eurake會通過Ribbon進行負載均衡 隨機請求兩個服務中的一個服務,服務在均衡的策略是可以配置的。在《4、Ribbon 客戶端負載均衡》我會具體介紹,如何去設計負載均衡的策略。
3.3 EurakeServer 高可用
單點的Eurake server 在生產環境下并不適用,一旦發生宕機,會造成所有服務之間的調用無法適用,在3.1中配置EurakeServer時 有如下兩個屬性:
eureka.client.register-with-eureka=false #是否將自己注冊到EurrkeServer,默認為true
eureka.client.fetch-registry=false #表示是否從EurekaServer獲取注冊信息,默認為true,表示需要從其他server同步信息
我關閉了 eurakaServer 將自己注冊的功能,和sever之間的同步功能, 他們是默認開啟的。 我們只要將這兩個設置為true,就可以實現Eurake的高可用了。
Eureka自我保護性
默認情況下Eureka 在90內沒有獲取的服務的心跳,將注銷該服務。但是有時候是網絡分區故障的問題導致Eureka無法收到心跳,服務本身是健壯的,如果刪除此服務,這會導致服務不可用。當開啟了Eureka自我保護后,Eureka會保護此服務在注冊表中的信息,使其不會被刪除,等網絡恢復后,Eureka節點會自動退出自我保護模式。 Eureka 的自我保護模式默認是允許開啟的,如要禁用可在application.properties 中添加如下配置:
eureka.server.enable-self-preservation=false
3.4 EurakeSever 認證
在生產環境下,我們不可能允許什么服務都能注冊到Eurake 中,為此需要添加EurakeServer的身份認證。
我們需要在EurakeSever中添加如下依賴:org.springframework.bootspring-boot-starter-security
并在application.properties 中添加如下信息:
#添加basic認證
security.basic.enabled=true
security.user.name=user
security.user.password=password
此時我們已經為EurakeSever 開啟了Basic 認證
為此,我們也修改服務端,我們只需要將服務提供端application.properties 中原來的
eureka.client.service-url.defalutZone= http://localhost:8761/eureka/
變為: eureka.client.service-url.defalutZone= http://user:password@localhost:8761/eureka/
3.5 Eureka Server Rest 端點
非java編寫的服務可以利用這些Rest端點去操作Eureka。
| 操作 | HTTP | action | 描述 |
|---|---|---|---|
| 注冊新的應用實例 | POST | /eureka/v2/apps/appID | 接受JSON/XML格式請求,返回204響應碼表示成功 |
| 發送應用實例心跳 | PUT | /eureka/v2/apps/appID/instanceID | 返回響應碼200表示成功,404表示instanceID不存在 |
| 查詢所有實例 | GET | /eureka/v2/apps | 返回響應碼200表示成功,響應內容格式JSON/XML |
| 為所有appID實例做查詢(Query for all appID instances) | GET | /eureka/v2/apps/appID | 返回響應碼200表示成功,響應內容格式JSON/XML |
| 為特定的appID/instanceID做查詢 | GET | /eureka/v2/apps/appID/instanceID | 返回響應碼200表示成功,響應內容格式JSON/XML |
| 為特定的instanceID做查詢 | GET | /eureka/v2/instances/instanceID | 返回響應碼200表示成功,響應內容格式JSON/XML |
| 停止服務實例(Take instance out of service) | PUT | /eureka/v2/apps/appID/instanceID/status?value=OUT_OF_SERVICE | 返回響應碼200表示成功,500失敗。 |
| 將實例恢復到服務(移除覆蓋) | DELETE | /eureka/v2/apps/appID/instanceID/status?value=UP | (value=UP是可選的,它被建議用于fallback狀態,由于取消了覆蓋) 返回響應碼200表示成功,500失敗。 |
| 更新元數據 | PUT | /eureka/v2/apps/appID/instanceID/metadata?key=value | 返回響應碼200表示成功,500失敗。 |
| 查詢特定vip address 下的所有實例 | GET | /eureka/v2/vips/vipAddress | 返回響應碼200表示成功,響應內容格式:JSON/XML,返回404表示vipAddress不存在 |
| 查詢特定secure vip address下所有實例 | GET | /eureka/v2/svips/svipAddress | 返回響應碼200表示成功,響應內容格式:JSON/XML,返回404表示svipAddress不存在 |
如我請求查詢所有實例:http://localhost:8761/eureka/apps獲取到如下結果:
對于我們使用java編寫的應用,基于Springcloud EurekaDiscovery 中已經分裝這些功能。下面對源碼進行分析一下。
我們可以發現Springcloud 定義了 DiscoveryClient 接口,來抽象Rest端,其下面有三實現類,我們關注的是基于Eureka實現的EurekaDiscoveryClient。查看此類的實現:此類中引入了com.netflix.discovery包下的EurakeClient 接口。實現此接口的類是com.netflix.discovery包下的DiscovClient 類。
總結
以上是生活随笔為你收集整理的三、Eurake 服务注册与发现「建议收藏」(汉典三字的基本解释)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加扰与加密&解扰与解密
- 下一篇: 对于中小企业而言,建站后想做SEO一定要