一、什麼是服務注冊與發現
Spring Cloud Eureka 子產品提供的功能是被動式的服務發現。
服務注冊:每個使用者去聊天室伺服器上注冊。
服務發現:這樣他的好友們就能看到你,你同時也将擷取好友的上線清單.
微服務中,服務就相當于聊天室的使用者,而服務注冊中心就像聊天室伺服器一樣。
目前服務發現的解決方案有Eureka,Consul,Zookeeper等等。SpringCloud預設使用eureka作為服務注冊中心。
二、Eureka使用過程

簡單一點就是:
上圖簡要描述了Eureka的基本架構,由3個角色組成
1、Eureka Server
提供服務注冊和發現
2、Service Provider
服務提供方
将自身服務注冊到Eureka,進而使服務消費方能夠找到
3、Service Consumer
服務消費方
從Eureka擷取注冊服務清單,進而能夠消費服務
二、建立服務注冊中心
在這裡,我還是采用Eureka作為服務注冊與發現的元件,至于Consul 之後會出文章詳細介紹。
2.1 首先建立一個maven主工程。
首先建立一個主Maven工程,在其pom檔案引入依賴,spring Boot版本為2.0.3.RELEASE,Spring Cloud版本為Finchley.RELEASE。這個pom檔案作為父pom檔案,起到依賴版本控制的作用,其他module工程繼承該pom。這一系列文章全部采用這種模式,其他文章的pom跟這個pom一樣。再次說明一下,以後不再重複引入。代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.forezp</groupId>
<artifactId>spring-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>spring-cloud</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modules>
<module>eureka-server</module>
<module>service-hi</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</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>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2 然後建立2個model工程:一個model工程作為服務注冊中心,即Eureka Server,另一個作為Eureka Client。
下面以建立server為例子,詳細說明建立過程:
右鍵工程->建立model-> 選擇spring initialir 如下圖:
下一步->選擇cloud discovery->eureka server ,然後一直下一步就行了。
建立完後的工程,其pom.xml繼承了父pom檔案,并引入spring-cloud-starter-netflix-eureka-server的依賴,代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.forezp</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.forezp</groupId>
<artifactId>spring-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
2.3 啟動一個服務注冊中心,隻需要一個注解@EnableEurekaServer,這個注解需要在springboot工程的啟動application類上加:
package com.forezp.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
**2.4 **eureka是一個高可用的元件,它沒有後端緩存,每一個執行個體注冊之後需要向注冊中心發送心跳(是以可以在記憶體中完成),在預設情況下erureka server也是一個eureka client ,必須要指定一個 server。eureka server的配置檔案application.properties:
## 該注冊伺服器的端口
server.port=8761
## 應用啟動名稱
spring.application.name=eureka-server
## eureka配置
## 注冊伺服器的名稱
eureka.instance.hostname=localhost
## 在預設設定下,該服務注冊中心也會将自己作為用戶端來嘗試注冊它自己,是以我們需要禁用它的用戶端注冊行為
## 是否從eureka伺服器擷取注冊資訊,是以這裡是false
eureka.client.fetch-registry=false
## 是否注冊自身到eureka伺服器,因為目前這個應用就是eureka伺服器,沒必要注冊自身,是以這裡是false
eureka.client.register-with-eureka=false
## 服務釋出的位址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
通過eureka.client.registerWithEureka:false和fetchRegistry:false來表明自己是一個eureka server.
2.5 eureka server 是有界面的,啟動工程,打開浏覽器通路:
http://localhost:8761,界面如下:
No application available 沒有服務被發現 ……^_^
因為沒有注冊服務當然不可能有服務被發現了。
三、建立一個服務提供者 (eureka client)
當client向server注冊時,它會提供一些中繼資料,例如主機和端口,URL,首頁等。Eureka server 從每個client執行個體接收心跳消息。 如果心跳逾時,則通常将該執行個體從注冊server中删除。
建立過程同server類似,建立完pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.forezp</groupId>
<artifactId>service-hi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service-hi</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.forezp</groupId>
<artifactId>spring-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<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-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
通過注解@EnableEurekaClient 表明自己是一個eurekaclient.
package com.forezp.servicehi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceHiApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceHiApplication.class, args);
}
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String home(@RequestParam(value = "name", defaultValue = "forezp") String name) {
return "hi " + name + " ,i am from port:" + port;
}
}
僅僅@EnableEurekaClient是不夠的,還需要在配置檔案中注明自己的服務注冊中心的位址,application.properties配置檔案如下:
## 該服務釋出的端口
server.port=8762
## 注意這裡是作為服務注冊名稱,在eureka注冊中心注冊這個名稱,自動轉化為全大寫,之後調用服務用服務名調用
spring.application.name=service-hi
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
## 注冊服務中心的配置
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
需要指明spring.application.name,這個很重要,這在以後的服務與服務之間互相調用一般都是根據這個name 。
啟動工程,打開http://localhost:8761,即eureka server 的網址:
你會發現一個服務已經注冊在服務中了,服務名為SERVICE-HI ,端口為8762
這時打開 http://localhost:8762/hi?name=forezp ,你會在浏覽器上看到 :
四、參考資料
原文連結:https://blog.csdn.net/forezp/article/details/81040925
原文連結:https://blog.csdn.net/saytime/article/details/80570279
http://blog.csdn.net/forezp/article/details/69696915
http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html