@Spring Cloud | NO.1 - 服務的註冊與發現 [Eureka]

什麼是Spring Cloud

Spring Cloud爲開發人員提供了快速構建分佈式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線)。分佈式系統的協調致使了樣板模式, 使用Spring Cloud開發人員能夠快速地支持實現這些模式的服務和應用程序。他們將在任何分佈式環境中運行良好,包括開發人員本身的筆記本電腦,裸機數據中心,以及Cloud Foundry等託管平臺。html

以上內容爲官方直譯

版本說明

Spring Boot 2.0.1.RELEASE
Spring Cloud Finchley RC1
SpringCloud項目基於SpringBoot,因此學習SpringCloud以前須要對SpringBoot有必定的瞭解。

服務的註冊與發現

服務發現是基於微服務架構的關鍵原則之一。Spring Cloud Netflix組件上的Eureka是一個服務註冊與發現的模塊(包含客戶端和服務端)。能夠將服務器配置和部署爲高可用性,每一個服務器將註冊服務的狀態複製到其餘服務器。Eureka是一個高可用的組件,它沒有後端緩存,每個實例註冊以後須要向註冊中心發送心跳(所以能夠在內存中完成)。java

Eureka - 服務註冊中心

1. pom.xml中引入相關Maven依賴web

<parent>
    <!-- spring boot -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<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>
        <!-- netflix-eureka-server -->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <!-- spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
注意: Eureka Server引入的Maven依賴中 artifactId有變更, SpringBoot2.0以前的版本爲 spring-cloud-starter-eureka-server

2. SpringBoot啓動器添加註解spring

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

3. application.yml配置後端

spring:
  application:
    name: eureka-server
server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
上述配置文件描述一個單節點註冊中心,默認狀況下Eureka Server也是一個Eureka Client,可經過 eureka.client.registerWithEureka:falsefetchRegistry:false來代表本身是一個Eureka Server。默認這兩個屬性值爲 true

至此Eureka Server服務註冊中心配置完畢。緩存

4. 運行概覽圖安全

啓動工程,訪問 http://localhost:8761

Eureka Server 服務註冊中心

由於沒有服務註冊,因此顯示 No Instances Available

Eureka - 服務提供者

1. pom.xml中引入相關Maven依賴服務器

<parent>
    <!-- spring boot -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<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>
        <!-- netflix-eureka-client-->
        <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>

<dependencyManagement>
    <dependencies>
        <!-- spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
注意: Eureka Client引入的Maven依賴中 artifactId有變更, SpringBoot2.0以前的版本爲 spring-cloud-starter-eureka

2. SpringBoot啓動器添加註解架構

@EnableEurekaClient
@SpringBootApplication
@RestController
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
    
    @Value("${server.port}")
    String port;
    @RequestMapping("/hi")
    public String home(@RequestParam String name) {
        return "hi "+name+",i am from port:" +port;
    }
}
在這個例子中,咱們明確地使用 @EnableEurekaClient,但只有 Eureka可用,你也可使用 @EnableDiscoveryClient

3. application.yml配置app

spring:
  application:
    name: service-hi
server:
  port: 8762
eureka:
  client:
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
management:
  endpoints:
    web:
      exposure:
        include: "*"
Eureka Client提供者只須要註明註冊自身服務的服務註冊中心的地址便可。當客戶端註冊Eureka Server時,它提供關於自身的元數據,例如主機和端口,健康指示符URL,主頁等。Eureka從屬於服務的每一個實例接收心跳消息。若是心跳失敗超過可配置的時間表,則一般將該實例從註冊表中刪除。

其中defaultZone是一個魔術字符串後備值,爲任何不表示首選項的客戶端提供服務URL(即它是有用的默認值)。

須要指明spring.application.name,這個很重要,這在之後的服務與服務之間相互調用通常都是根據這個name 。

注意: SpringBoot2.0以後大部分endpoints不會被暴露,上面咱們暴露了全部endpoints,如應用到生產環境,考慮到安全問題,對於Actuator的Endpoints請根據須要進行配置

至此Eureka Client服務提供者配置完畢。

4. 運行概覽圖

啓動工程,訪問 http://localhost:8761

Eureka Server 服務提供者註冊到服務註冊中心

服務名爲SERVICE-HI已經註冊到註冊中心。

打開 http://localhost:8762/hi?name... ,返回以下結果:

hi forezp,i am from port:8762

附加說明

  1. 本文參考資料
相關文章
相關標籤/搜索