隨着業務的發展,微服務應用也隨之增長,這些服務的管理和治理會愈來愈難,而且集羣規模、服務位置、服務命名都會發生變化,手動維護的方式極易發生錯誤或是命名衝突等問題。而服務治理正是爲了解決這個問題,服務治理是微服務架構中最爲核心和基礎的模塊,它主要實現各個微服務實例的 自動化註冊和發現。
在服務治理框架中,都會構建一個或多個服務註冊中心。每一個服務模塊向註冊中心登記本身所提供的服務,將主機host、端口號、版本號、通訊協議等一些附加信息告知註冊中心,註冊中心按服務名分類組織服務清單。java
服務註冊中心還須要以心跳的方式去監測清單中的服務是否可用,若不可用須要從服務清單中剔除,達到排除故障服務的效果。node
服務間調用再也不經過指定具體實例地址來實現,而是經過向服務名發起請求調用實現。服務調用方須要先從服務註冊中心獲取全部服務的實例清單,才能實現對具體服務實例的訪問。git
服務調用方在發起調用時,會以某種策略取出一個具體的服務實例進行服務調用(客戶端負載均衡)。github
在生產環境中爲了考慮性能等因素,不會採用每次都向服務註冊中心獲取服務的方式,而且不一樣的應用場景在緩存和服務剔除等機制上也會採用不一樣的實現策略。spring
Spring Cloud Eureka 是基於 Netflix Eureka 來實現服務註冊和發現的。它主要包括兩個組件:windows
Eureka 基礎架構緩存
基礎架構圖
架構
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version> </properties> <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> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
@SpringBootApplication @EnableEurekaServer public class SpringCloudEurekaServerApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudEurekaServerApplication.class, args); } }
server.port=9999 #eureka eureka.instance.hostname=127.0.0.1 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
能夠看到 Eureka 的信息面板,其中 Instances currently registered with Eureka 中列表顯示 No instances available,說明該註冊中心尚未註冊任何服務。
app
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
@SpringBootApplication //@EnableEurekaClient 該註解在採用eureka做爲註冊中心時使用,場景較爲單一 @EnableDiscoveryClient //場景更爲普遍 public class SpringCloudEurekaServiceApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudEurekaServiceApplication.class, args); } }
@EnableEurekaClient
和 @EnableDiscoveryClient
在當前示例中使用效果好是同樣的,@EnableEurekaClient
註解在採用eureka做爲註冊中心時使用,場景較爲單一,@EnableDiscoveryClient
場景更爲普遍。負載均衡
server.port=8888 spring.application.name=spring-cloud-eureka-service #info 應用信息 info.app.name=spring-cloud-eureka-service info.app.version=v1.0.0 info.app.description=spring-cloud-eureka-service #eureka eureka.instance.hostname=127.0.0.1 #每隔5s心跳一次,證實本服務還活着 eureka.instance.lease-renewal-interval-in-seconds=5 #本服務10s內沒有心跳,就將該服務從服務端剔除 eureka.instance.lease-expiration-duration-in-seconds=10 eureka.client.serviceUrl.defaultZone=http://127.0.0.1:9999/eureka/
在服務註冊中心的控制檯中咱們能夠看到以下輸出,說明服務被註冊成功了。
c.n.e.registry.AbstractInstanceRegistry : Registered instance SPRING-CLOUD-EUREKA-SERVICE/192.168.101.201:spring-cloud-eureka-service:8888 with status UP (replication=false)
而在 Eureka 的信息面板上,在 Instances currently registered with Eureka 列表中一樣能夠看到服務的註冊信息。以下圖:
上面介紹了單節點模式的服務註冊中心,不過在實際生產環境中,一般不會採用這種模式。在分佈式系統中,服務註冊中心是很是重要的組成部分,若是是單節點模式,發生故障的話將會是毀滅性的災害。因此爲了維護服務的高可用性,一般採用集羣的解決方案。
Eureka 的服務治理設計中,全部的節點既是服務提供方,也是服務消費方,服務註冊中心也不例外。Eureka 經過互相註冊服務的方式,以實現服務清單的互相同步,達到高可用的效果。
server.port=9991 spring.application.name=eureka-server spring.profiles.active=nodea #eureka eureka.instance.hostname=nodea #設置微服務調用地址爲IP優先(缺省爲false) #eureka.instance.prefer-ip-address=true eureka.client.serviceUrl.defaultZone=http://nodeb:9992/eureka/
server.port=9992 spring.application.name=eureka-server spring.profiles.active=nodeb #eureka eureka.instance.hostname=nodeb #設置微服務調用地址爲IP優先(缺省爲false) #eureka.instance.prefer-ip-address=true eureka.client.serviceUrl.defaultZone=http://nodea:9991/eureka/
127.0.0.1 nodea 127.0.0.1 nodeb
http://nodea:9991/
和http://nodeb:9992/
,咱們能夠看到兩個節點都已經被註冊,以下圖所示:
eureka.client.serviceUrl.defaultZone=http://nodea:9991/eureka/,http://nodeb:9992/eureka/
啓動項目後,訪問兩個服務註冊中心,咱們看到服務被註冊到這兩個節點內。
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
spring.application.name=spring-cloud-ribbon-consumer server.port=8081 eureka.client.serviceUrl.defaultZone=http://nodea:9991/eureka/,http://nodeb:9992/eureka/
經過 @EnableDiscoveryClient
註解將應用註冊爲 Eureka 客戶端,得到服務發現能力。
建立 RestTemplate 的 Spring Bean 實例用來調用服務。
經過 @LoadBalanced
註解來開啓客戶端的負載均衡。
@SpringBootApplication @EnableDiscoveryClient public class SpringCloudRibbonConsumerApplication { @Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(SpringCloudRibbonConsumerApplication.class, args); } }
@RestController public class ConsumerController { @Autowired RestTemplate restTemplate; @RequestMapping("/test") public String test() { return restTemplate.getForEntity("http://spring-cloud-eureka-service/test", String.class).getBody(); } }
spring-cloud-eureka-service 爲服務註冊中心的應用名稱,大小寫都可。
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
spring.application.name=spring-cloud-feign-consumer server.port=8080 eureka.client.serviceUrl.defaultZone=http://nodea:9991/eureka/,http://nodeb:9992/eureka/
經過 @EnableDiscoveryClient
註解將應用註冊爲 Eureka 客戶端,得到服務發現能力。
經過 @EnableFeignClients
註解來啓用feign進行遠程調用。
@SpringBootApplication @EnableDiscoveryClient//啓用服務註冊與發現 @EnableFeignClients//啓用feign進行遠程調用 public class SpringCloudFeignConsumerApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudFeignConsumerApplication.class, args); } }
@FeignClient(name = "spring-cloud-eureka-service") public interface TestService { @RequestMapping("/test") public String test(); }
spring-cloud-eureka-service 爲服務註冊中心的應用名稱,大小寫都可。
此接口中的方法和遠程服務中contoller中的方法名和參數需保持一致。
@RestController public class ConsumerController { @Autowired private TestService testService; @RequestMapping("/test") public String test() { return testService.test(); } }
非特殊說明,本文版權歸 朝霧輕寒 全部,轉載請註明出處.原文標題:Spring Cloud(二):Eureka 服務註冊中心
若是文章有不足的地方,歡迎提點建議,後續會完善~
若是文章對您有幫助,請給我點個贊哦~
關注下個人公衆號,文章持續更新中...