springcloud服務註冊與發現
使用Eureka實現服務治理
作用:實現服務治理(服務註冊與發現)
簡介:
Spring Cloud Eureka是Spring Cloud Netflix項目下的服務治理模塊。而Spring Cloud Netflix項目是Spring Cloud的子項目之一,主要內容是對Netflix公司一系列開源產品的包裝,它爲Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的註解,開發者就可以快速的在應用中配置一下常用模塊並構建龐大的分佈式系統。它主要提供的模塊包括:服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負載均衡(Ribbon)等。
項目實戰:
服務註冊中心 :eureka-server
作用:服務註冊中心提供服務註冊功能
服務提供方:eureka-client
作用:註冊服務到服務註冊中心
服務註冊中心 :eureka-server
新建一個springboot項目:eureka-server,其pom.xml配置如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
想要實現一個服務註冊中心的功能非常簡單,只需要在項目的啓動類EurekaServerApplication上使用@EnableEurekaServer註解即可
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication{
public static void main(String[] args) {
new SpringApplicationBuilder(EurekaServerApplication.class)
.web(true).run(args);
}
}
默認情況下,該服務註冊中心也會將自己作爲客戶端來嘗試註冊它自己,所以我們需要禁用它的客戶端註冊行爲,只需要在application.yml配置文件中增加如下信息:
spring:
application:
name:eureka-server
server:
port:1001
eureka:
instance:
hostname:localhost
client:
register-with-eureka:false
fetch-registry:false
啓動EurekaServerApplication,訪問 http://localhost:9001/可以看到Eureka的頁面,從紅框的位置可以看到沒有任務服務實例註冊到當前的服務註冊中心
服務提供方 :eureka-client
每一個實例註冊之後需要向註冊中心發送心跳,當client向server註冊時,它會提供一些元數據,例如主機和端口,URL,主頁等。Eureka server 從每個client實例接收心跳消息。 如果心跳超時,則通常將該實例從註冊server中刪除。
新建一個springboot項目:eureka-client,其pom.xml配置如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
想要實現一個服務提供方也很簡單,只要在項目的啓動類EurekaClientApplication上使用@EnableEurekaClient註解即可
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在application.yml中進行如下配置
spring:
application:
name:eureka-client
server:
port:9002
eureka:
client:
serviceUrl.defaultZone:http://localhost:9001/eureka/
通過spring.application.name
屬性,我們可以指定微服務的名稱後續在調用的時候只需要使用該名稱就可以進行服務的訪問。
eureka.client.serviceUrl.defaultZone
屬性對應服務註冊中心的配置內容,指定服務註冊中心的位置。
使用server.port
屬性設置不同的端口。
啓動EurekaClientApplication類
刷新 http://localhost:9001/,可以看到咱們的服務提供方已經註冊到了服務註冊中心
在新建一個DiscoveryController
使用discoveryClient.getServices()獲取已經註冊的服務名,使用@value將配置文件中的信息賦值到ip
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(
EurekaClientApplication.class)
.web(true).run(args);
}
}
訪問:http://localhost:9002/client
最後說明一下@EnableEurekaClient 與@EnableDiscoveryClient這兩個註解
首先這個兩個註解都可以實現服務發現的功能,在spring cloud中discovery service有許多種實現(eureka、consul、zookeeper等等)
@EnableEurekaClient基於spring-cloud-netflix。服務採用eureka作爲註冊中心,使用場景較爲單一。
@EnableDiscoveryClient基於spring-cloud-commons。服務採用其他註冊中心。