【Spring Cloud】分佈式必學springcloud(二)——註冊中心Eureka

一、前言

      在上一篇博客中,小編簡單的向大家介紹了springcloud的一些概念,大家可能對那些還是不太的瞭解,不過沒有問題,盲人摸象嘛,慢慢的摸,你會了解的越來越多的。所以不用擔心。在下面的博客,小編依次介紹,依次實現。

      在這篇博客中,小編介紹一下注冊中心——Eureka。

二、註冊中心Eureka

      想必做過Dubbo的老鐵們一定使用過Zookeeper吧。這裏的zookeeper就起到了一個註冊中心的作用。Dubbo架構中分成了提供者和消費者,提供者需要把自己的服務註冊到註冊中心,消費者訂閱註冊中心,註冊中心有提供者後,會通知消費者。ZK起到了一個服務協調的作用。

      在springcloud中,自己提供了一個註冊中心——Eureka。

      Eureka是一個基於REST(Representational State Transfer)的服務,主要用於AWS cloud, 提供服務定位(locating services)、負載均衡(load balancing)、故障轉移(failover of middle-tier servers)。我們把它叫做Eureka Server. Eureka也提供了基於Java的客戶端組件,Eureka Client,內置的負載均衡器可以實現基本的round-robin負載均衡能力。在Netflix,一個基於Eureka的更復雜的負載均衡器針對多種因素(如流量、資源利用率、錯誤狀態等)提供加權負載均衡,以實現高可用(superior resiliency).

三、服務註冊中心

3.1 建立Maven項目

      小編使用springboot的快速生產項目的網站 http://start.spring.io/,來生產項目:

這裏寫圖片描述

      導入idea:

這裏寫圖片描述

3.2 導入Eureka依賴和springcloud依賴

      在maven的pom文件中,添加Eureka依賴:spring-cloud-starter-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>eurekaserver</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
<name>eurekaserver</name>
    <description>Demo project for Spring Boot</description>
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.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>
        <spring-cloud.version>Edgware.SR2</spring-cloud.version>
    </properties>
<dependencies>
        <!--eureka server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
<!-- spring boot test-->
        <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>
<repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

      添加完成的時候,如果要建立父子pom,需要把${spring-cloud.version}提取出來。這樣子pom中跟springcloud相關的就不用設置版本號了。

3.3 代碼編寫

      springboot有一個application的啓動類,我們這裏就修改這個啓動類:添加@EnableEurekaServer。通過這個註解,啓動一個服務註冊中心提供給其他應用進行對話。

package com.wl.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;


@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

3.4 修改配置文件

      在默認情況下,註冊中心會將自己作爲客戶端來嘗試註冊自己,所以我們需要禁用它的客戶端註冊行爲。需要在application.properties文件或application.yml中添加配置。

      注意:生成的maven項目默認是application.properties,沒有application.yml,對比一下,官方很多的demo中使用的是application.yml,另外application.yml天然的形成了樹結構。代碼寫的也少。

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

      代碼說明:

  • eureka.client.registerWithEureka:false ,由於應用爲註冊中心, 來表明自己是一個eureka server. 不會把自己註冊到自己上。

  • eureka.client.fetchRegistry:由於註冊中心的職責是維護服務實例,不需要去檢索服務,所以也設置爲false

3.5 運行

      運行後,輸入http://localhost:8761/,打開註冊中心監控頁面:

這裏寫圖片描述

3.6 Eureka配置用戶名密碼登錄

      pom文件中添加:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

      修改配置文件:

server:
  port: 8761

security:
  basic:
    enabled: true
  user:
    name: admin
    password: admin

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${security.user.name}:${security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/

      再次登錄的時候,會出現輸入賬戶和密碼的彈窗:

這裏寫圖片描述

四、服務提供者

      建立如下的結構:

這裏寫圖片描述

      當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.wl</groupId>
    <artifactId>client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>client</name>
    <description>Demo project for Spring Boot</description>


    <parent>
        <groupId>com.wl</groupId>
        <artifactId>scf</artifactId>
        <version>0.0.1-SNAPSHOT</version>
</parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

    </dependencies>

</project>

      創建controller:

package com.wl.client.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by Ares on 2018/4/11.
 */
@RestController
public class User {

    @GetMapping("/user/findById")
    public String findById(@RequestParam("id")String id){
        return "這個是springcloud的客戶端"+id;
    }


}

      配置啓動類:

package com.wl.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }
}

      類中@EnableEurekaClient或@EnableDiscoveryClient註解,激活EurekaDiscoveryClient實現,自動化配置,創建DiscoveryClient接口針對Eureka客戶端的EnableDiscoveryClient實例。

      修改配置文件:

server:
  port: 9001
eureka:
  client:
    serviceUrl:
      defaultZone: http://${security.user.name}:${security.user.password}@localhost:8761/eureka/
spring:
  application:
    name: client1
security:
  basic:
    enabled: true
  user:
    name: admin
    password: admin

      在配置文件中,使用spring.application.name配置服務名,如命名爲client1;通過eureka.serviceUrl.defaultZone指定服務註冊中心的地址,這裏小編指定的是之前建立的註冊中心地址。

      依次啓動註冊中心http://localhost:8761/和提供者

這裏寫圖片描述

      我們可以通過訪問 http://localhost:9001//user/findById?id=1來訪問提供者:

這裏寫圖片描述

五、小結

      Eureka服務註冊發現,容錯管理、失效剔除、自我保護、安全驗證。功能真是很強大,使用也非常好用,多多用吧。

發佈了353 篇原創文章 · 獲贊 367 · 訪問量 143萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章