1. 程式人生 > >乾貨實操:微服務Spring Cloud 系列(二) Eureka服務發現與服務註冊(strand alone)

乾貨實操:微服務Spring Cloud 系列(二) Eureka服務發現與服務註冊(strand alone)

此篇主要實操Eureka 服務端的服務註冊,以及服務發現,並需要認證才能訪問控制中心。

分五個部分說明:

一.  認識 Eureka 

二.  Eureka  服務端開發

三.  Eureka 客戶端開發

四.  多客戶端情況檢視

五.  下節預告(多個服務提供後,怎麼消費)

(一) 認識 Eureka   

   1. 怎麼讀

Eureka英文讀音[juə'ri:kə], 中文讀音:尤里古希臘詞語,詞性為感嘆詞,意思是“我找到了!我發現了!”

   2. what is Eureka?

尤里是一個基於REST服務,主要是用於做服務註冊與服務發現的。

3. Eureka 架構

圖分析下: 有2個角色,Eureka Server和Eureka Client。可以理解成,服務都註冊在哪裡,哪裡就可稱為Eureka Server,註冊中心的意思 。

註冊在註冊中心可以是服務的提供者(Applicaton Service)或者服務的消費者(Application Client),這兩類都被稱為Eureka client

每個區域有一個Eureka叢集,並且每個區域至少有一個eureka伺服器可以處理區域故障,以防伺服器癱瘓。

Eureka Client向Eureka Server註冊,並將自己的一些客戶端資訊傳送Eureka Server。

然後,Eureka Client(application service)通過向Eureka Serve傳送心跳(每30秒)來續約服務的。

如果客戶端持續不能續約,那麼,它將在大約90秒內從伺服器登錄檔中刪除。 註冊資訊和續訂被複制到叢集中的Eureka Serve所有節點。

來自任何區域的Eureka Client(Application Client)都可以查詢登錄檔資訊(每30秒發生一次)。根據這些登錄檔資訊,Application Client可以遠端呼叫Applicaton Service來消費服務。

二.  Eureka  服務端開發

1. 服務端程式碼結構

2. gradle 構建原始碼:

import java.text.SimpleDateFormat

group 'com.angus'
version '1.0-SNAPSHOT'

buildscript {
    ext {
        springBootVersion = '1.5.2.RELEASE'
    }
    repositories {
        jcenter {url 'http://jcenter.bintray.com/'}
//        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public'}
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion"
        classpath 'org.springframework:springloaded:1.2.4.RELEASE'
        classpath 'org.hidetake:gradle-ssh-plugin:2.0.0'
        classpath "io.spring.gradle:dependency-management-plugin:0.5.6.RELEASE"
    }
}


apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'
apply plugin: 'application'
apply plugin: 'org.hidetake.ssh'
apply plugin: "io.spring.dependency-management"

def env = System.getProperty("env") ?: "prd"


sourceSets {
    main {
        resources {
            srcDirs = ["src/main/resources","src/main/profile/$env"]
        }
    }
}

def date = new SimpleDateFormat("yyyy-MM-dd").format(new Date())
jar {
    baseName = "eureka-$env"
    version = '1.0-RELEASE'

}
war {
    baseName = "eureka-$env"
    version = '1.0-RELEASE'
}



repositories {
    maven{ url 'http://maven.aliyun.com/nexus/content/groups/public'}
    mavenLocal()
    mavenCentral()
}

distZip {
    archiveName "$baseName-$version-$date-$env-RELEASE.zip"
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:Camden.SR5"
    }
}
dependencies {
    compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
    compile 'org.springframework.cloud:spring-cloud-starter-eureka-server'
    compile 'org.springframework.boot:spring-boot-starter-security'

}


springBoot {
    mainClass = "com.angus.eureka.BaseApplication"
}


3. Eureka 配置說明(application.properties)

server.port = 8001
server.sessionTimeout=15
server.tomcat.max-threads = 800
server.tomcat.uri-encoding = UTF-8

#服務Eureka Server的身份驗證
security.basic.enabled=true
security.user.name=root
security.user.password=angus

#是否將eureka自身作為應用註冊到eureka註冊中心
eureka.client.registerWithEureka=false
#為true時,可以啟動,但報異常:Cannot execute request on any known server
eureka.client.fetchRegistry=false

eureka.client.serviceUrl.defaultZone=http://root:[email protected]:8001/eureka/

4. 應用啟動
package com.angus.eureka;

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

/**
 * Created by Angus on 2017-5-31.
 */
@EnableEurekaServer
@SpringBootApplication
public class BaseApplication {

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

}
啟動:bootRun -Denv=test


5. 啟動效果:

開啟瀏覽器: http://localhost:8001


三.  Eureka 客戶端開發

 1. Eureka Client(Application Server)程式碼結構

2. gradle 構建原始碼:

eureka client:

import java.text.SimpleDateFormat

group 'com.angus'
version '1.0-SNAPSHOT'

buildscript {
    ext {
        springBootVersion = '1.5.2.RELEASE'
    }
    repositories {
        jcenter {url 'http://jcenter.bintray.com/'}
//        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public'}
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion"
        classpath 'org.springframework:springloaded:1.2.4.RELEASE'
        classpath 'org.hidetake:gradle-ssh-plugin:2.0.0'
        classpath "io.spring.gradle:dependency-management-plugin:0.5.6.RELEASE"
    }
}


apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'
apply plugin: 'application'
apply plugin: 'org.hidetake.ssh'
apply plugin: "io.spring.dependency-management"

def env = System.getProperty("env") ?: "prd"



sourceSets {
    main {
        resources {
            srcDirs = ["src/main/resources","src/main/profile/$env"]
        }
    }
}

def date = new SimpleDateFormat("yyyy-MM-dd").format(new Date())
jar {
    baseName = "eureka-client-$env"
    version = '1.0-RELEASE'

}
war {
    baseName = "eureka-client-$env"
    version = '1.0-RELEASE'
}



repositories {
//    maven{ url 'http://maven.aliyun.com/nexus/content/groups/public'}
    mavenLocal()
    mavenCentral()
}

distZip {
    archiveName "$baseName-$version-$date-$env-RELEASE.zip"
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:Camden.SR5"
    }
}
dependencies {
    compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
    compile 'org.springframework.cloud:spring-cloud-starter-eureka'
    compile 'org.springframework.boot:spring-boot-starter-actuator'

}


springBoot {
    mainClass = "com.angus.BaseApplication"
}

3. Eureka client 配置說明

server.port = 8888
server.sessionTimeout=15
server.tomcat.max-threads = 800
server.tomcat.uri-encoding = UTF-8


spring.application.name=sayHelloServer
#為true時,可以啟動,但報異常:Cannot execute request on any known server
eureka.client.fetchRegistry=false
 # 指定服務註冊中心的地址
eureka.client.serviceUrl.defaultZone=http://root:[email protected]:8001/eureka/
4. 應用啟動
package com.angus;

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

/**
 * Created by Angus on 2017-5-31.
 */
@EnableEurekaClient
@SpringBootApplication
public class BaseApplication {

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

}
區別: @EnableEurekaClient  && @EnableDiscoveryClient 

SpringCloud中的“Discovery Service”有多種實現,比如:eureka, consul, zookeeper。@EnableDiscoveryClient註解是基於spring-cloud-commons依賴,並且在classpath中實現; @EnableEurekaClient註解是基於spring-cloud-netflix依賴,只能為eureka作用;

5. 服務提供程式碼:

package com.angus.web;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created with eureka-client.
 * User: anguszhu
 * Date: Jun,22 2017
 * Time: 16:25
 * description:
 */
@RestController
public class HelloController {

    @RequestMapping("/name/{who}")
    public String sayHello(@PathVariable String who){
        return "Hey "+who+", what's up man!";
    }
}

一個簡單的 http請求服務

6. 啟動:


修改application.properties 的server.port 為8889 ,再啟動一個,然後到控制檯檢視。

7. 啟動一個服務,啟動兩個服務後,效果分別是:


兩個服務如下:


四.  多客戶端情況檢視

上圖可以看到,同一個應用,有兩個服務提供者,分別是8889 埠與8888 埠

五.  下節預告(多個服務提供後,怎麼消費)

        這節實操了Eureka 服務註冊,但是沒有描述怎麼玩服務消費,下節再寫吧,通過Spring Cloud Ribbon 負載調動不同的服務提供者。

相關推薦

乾貨服務Spring Cloud 系列 Eureka服務發現服務註冊(strand alone)

此篇主要實操Eureka 服務端的服務註冊,以及服務發現,並需要認證才能訪問控制中心。 分五個部分說明: 一.  認識 Eureka  二.  Eureka  服務端開發 三.  Eureka 客戶端開發 四.  多客戶端情況檢視 五.  下節預告(多個服務提供後,怎麼

Spring Cloud系列Eureka應用詳解

一、註冊中心   1、註冊中心演變過程    2、註冊中心必備功能   ① 服務的上線   ② 服務的下線   ③ 服務的剔除   ④ 服務的查詢   ⑤ 註冊中心HA   ⑥ 註冊中心節點資料同步   ⑦ 服務資訊的儲存,比如mysql,redis,zookeeper,記憶體

Spring Cloud 實戰- Eureka 高可用註冊中心

Eureka 高可用註冊中心 點餐系統中的產品服務、訂單服務已寫了大半,但是註冊中心高可用一直還沒解決,今兒就把我遇到的坑塵現出來,避免以後再遇到此問題無章可循了。 Eureka Server1 配置

Spring Cloud系列 應用監控管理Actuator

前言:要想使用Spring Cloud ,Spring Boot 提供的spring-boot-starter-actuator模組是必須瞭解的,這篇文章就先介紹一下actuator的使用。        由於我們把一個複雜高耦合的單體系統拆分成了多個小型服務,所以部署應用

Spring Cloud系列Eureka原始碼解析之服務

一、自動裝配   1、根據自動裝配原理(詳見:Spring Boot系列(二):Spring Boot自動裝配原理解析),找到spring-cloud-starter-netflix-eureka-server.jar的spring.factories,檢視spring.factories如下:   2、進

Spring Cloud Config基於Git搭建配置中心

1、簡述 本文選用Git作為配置倉庫,新建兩個環境的配置資料夾,dev 和 test,資料夾中分別存放 Config Client 端的配置檔案,目錄結構如下: ├ ─ ─ dev └ ─ ─ config-client-dev.properties ├ ─ ─ test

Spring Cloud系列十三 API閘道器服務Spring Cloud ZuulFinchley.RC2版本

為什麼使用Spring Cloud Zuul? 通過前幾章的介紹,我們對於Spring Cloud Netflix 下的核心元件已經瞭解了大半,利用這些元件我們已經可以構建一個簡單的微服務架構系統,比如通過使用Spring Cloud Eureka實現高可用的服務註冊中

spring cloud 入門【 客戶端往註冊中心Eureka 註冊服務

客戶端 往Eureka 註冊服務,註冊成功之後,其他的服務,才可以對本服務進行呼叫 程式碼結構如下:   UserApplication 程式碼如下: package com.study.user; import org.springframework.boot.

Spring Cloud OAuth2 擴充套件登陸方式賬戶密碼登陸、 手機驗證

概要 基於上文講解的spring cloud 授權服務的搭建,本文擴充套件了spring security 的登陸方式,增加手機驗證碼登陸、二維碼登陸。 主要實現方式為使用自定義filter、 AuthenticationProvider、 AbstractAuthenti

Spring Cloud系列3Spring Cloud Eureka

Spring Cloud Eureka 服務註冊與發現。在Spring Cloud體系中,Eureka角色是服務的註冊與發現。在裡面涉及到三個關鍵的角色:服務註冊中心,服務呼叫者,服務提供者。Eureka Servereureka server 是服務註冊中心,所有的服務都應

Spring Cloud系列十八 Config服務端詳解—Finchley版本

在上一篇文章實現了基本結構的配置管理服務端和客戶端,同時講解了一些配置的基本原理。現在總結一下它是如何運作起來的。其中主要包含下面幾個要素。 遠端Git倉庫:用來儲存配置檔案,上一篇文章我儲存了應用名為repo的多環境配置檔案:repo-{profile}.properti

Docker Swarm執行Spring Cloud應用Eureka高可用

基礎服務獨立部署 把所有服務一次性部署好非常方便,但是在生產環境中使用的時候需要考慮這樣一些因素: 在生產環境中的基礎服務,如Eureka由於更新不頻繁,應該和頻繁更新應用服務分開部署作為基礎服務的Eureka需要考慮高可用 我們可以把部署描述檔案分成兩部分,eurek

Spring Cloud系列2Spring Cloud Config

Spring Cloud Config 分散式配置管理系統我們在實現微服務架構時,每個微服務都有自己的配置檔案,配置諸如埠,服務名稱,資料庫連線等。在微服務數量比較多時,維護就會變得很困難,因此我們需要一箇中心配置服務。Spring Cloud Config 主要由兩部分組成

容器開啟數據服務之旅系列Kubernetes如何助力Spark大數據分析

容器 控制臺 摘要: 容器開啟數據服務之旅系列(二):Kubernetes如何助力Spark大數據分析 (二):Kubernetes如何助力Spark大數據分析 概述 本文為大家介紹一種容器化的數據服務Spark + OSS on ACK,允許Spark分布式計算節點對阿裏雲OSS對象存儲的直接訪問。

Spring Cloud系列十四 路由詳解Finchley.RC2版本

傳統路由配置 傳統路由配置就是不需要依賴服務發現機制,通過在配置檔案中具體指定每個路由表示式與服務例項的對映關係來實現API閘道器對外請求的路由。 單例項配置 通過zuul.routes.<route>.path與zuul.routes.<route&

Spring Cloud系列十六 Zuul過濾器詳解Finchley.RC2版本

Zuul核心過濾器 通過前兩篇對Zuul的介紹,我們對於Zuul的有了一個大概的印象:它包含了對請求的路由和過濾兩個功能,其中路由功能負責將外部請求轉發到具體的微服務例項上,是實現外部訪問統一入口的基礎;而過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗、服務聚

spring cloud 入門【負載均衡 FeignClient 容錯機制一通過類容錯

一 負載均衡 spring cloud 負載均衡非常簡單,現在服務提供者 menu,重新copy 一份munu ,命名 menu2 ,將埠 修改為 8764 ,其他配置都不變 這個時候 如何 再次呼叫 user/getMenu 介面, 檢視 menu 和 menu2 的日誌,我們可以看出來,

Spring Cloud系列十七 分散式配置中心Spring Cloud Config——Finchley版本

Spring Cloud Config是Spring Cloud團隊建立的一個全新專案,用來為分散式系統中的基礎設施和微服務應用提供集中化的外部配置支援,它分為服務端與客戶端兩個部分。其中服務端也稱為分散式配置中心,它是一個獨立的微服務應用,用來連線配置倉庫併為客戶端提供獲取

Spring Cloud系列十九高可用配置中心—Finchley版本

傳統作法 通常在生產環境,Config Server與服務註冊中心一樣,我們也需要將其擴充套件為高可用的叢集。在之前實現的config-server基礎上來實現高可用非常簡單,不需要我們為這些服務端做任何額外的配置,只需要遵守一個配置規則:將所有的Config Serv

Spring Cloud學習Ribbon簡單使用

Ribbon簡介 Ribbon是一個負載均衡客戶端,可以很好的控制http和tcp的一些行為。Feign預設集成了Ribbon。 示例: @SpringBootApplication @EnableDiscoveryClient //向服務中心註冊 publ