天天看點

SpringCloud服務的注冊與發現(一)

一、什麼是服務注冊與發現

Spring Cloud Eureka 子產品提供的功能是被動式的服務發現。

服務注冊:每個使用者去聊天室伺服器上注冊。

服務發現:這樣他的好友們就能看到你,你同時也将擷取好友的上線清單.

微服務中,服務就相當于聊天室的使用者,而服務注冊中心就像聊天室伺服器一樣。

目前服務發現的解決方案有Eureka,Consul,Zookeeper等等。SpringCloud預設使用eureka作為服務注冊中心。

二、Eureka使用過程

SpringCloud服務的注冊與發現(一)

簡單一點就是:

SpringCloud服務的注冊與發現(一)

上圖簡要描述了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 如下圖:

SpringCloud服務的注冊與發現(一)

下一步->選擇cloud discovery->eureka server ,然後一直下一步就行了。

SpringCloud服務的注冊與發現(一)

建立完後的工程,其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,界面如下:

SpringCloud服務的注冊與發現(一)

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 的網址:

SpringCloud服務的注冊與發現(一)

你會發現一個服務已經注冊在服務中了,服務名為SERVICE-HI ,端口為8762

這時打開 http://localhost:8762/hi?name=forezp ,你會在浏覽器上看到 :

SpringCloud服務的注冊與發現(一)

四、參考資料

原文連結: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

繼續閱讀