spring cloud(二) 起步,集成Eureka服務(wù)發(fā)現(xiàn)

目錄

一略吨、 Eureka介紹

上一篇我們使用spring boot編寫了兩個(gè)簡(jiǎn)單的服務(wù)集币,并讓consume_server通過(guò)硬編碼的方式調(diào)用了product_server考阱。我們發(fā)現(xiàn)這樣的方式實(shí)現(xiàn)起來(lái)過(guò)于復(fù)雜,每次都要手工配置服務(wù)地址鞠苟,如果服務(wù)地址有變動(dòng)又需要重新改一遍乞榨。這樣的方式過(guò)于繁瑣,而且容易出錯(cuò)当娱。如果這一切可以自動(dòng)就好了吃既。
這時(shí)我們需要一個(gè)服務(wù)發(fā)現(xiàn),服務(wù)發(fā)現(xiàn)是基于微服務(wù)架構(gòu)的關(guān)鍵原則之一跨细。嘗試配置每個(gè)客戶端或某種形式的約定可能非常困難鹦倚,非常脆弱。Netflix服務(wù)發(fā)現(xiàn)服務(wù)器和客戶端是Eureka冀惭≌鹦穑可以將服務(wù)器配置和部署為高可用性掀鹅,每個(gè)服務(wù)器將注冊(cè)服務(wù)的狀態(tài)復(fù)制到其他服務(wù)器。
我們需要用服務(wù)發(fā)現(xiàn)框架實(shí)現(xiàn)什么功能呢媒楼?

  • 需要有一個(gè)服務(wù)注冊(cè)器乐尊,可以將提供服務(wù)的微服務(wù)注冊(cè)到注冊(cè)器里面。
  • 需要有服務(wù)發(fā)現(xiàn)機(jī)制划址,我們可以通過(guò)客戶端方便的找到我們需要的服務(wù)扔嵌。
  • 容災(zāi)能力,當(dāng)服務(wù)注冊(cè)器掛掉之后還能保證服務(wù)之間交互正常夺颤。

Eureka為我們提供了以上的解決方案痢缎,它分為Eureka-server和Eureka-client兩個(gè)部分,Eureka提供服務(wù)注冊(cè)服務(wù)發(fā)現(xiàn)功能拂共,可以部署為Eureka-server集群牺弄。Eureka-client的主要功能是將服務(wù)注冊(cè)到Eureka-server,通過(guò)Eureka-server發(fā)現(xiàn)服務(wù)。接下來(lái)讓我們基于上篇文章介紹的兩個(gè)微服務(wù)一步步配置Eureka-server和Eureka-client宜狐,實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)功能势告。

二、 EurekaServer配置

spring cloud為我們提供了開(kāi)箱即用的工具抚恒,我們只需要簡(jiǎn)單的配置就可以啟動(dòng)一個(gè)EurekaServer咱台。

1. 創(chuàng)建一個(gè)eureka_server項(xiàng)目

創(chuàng)建新的Module

2. 配置依賴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.yshmsoft</groupId>
    <artifactId>eureka_server</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</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>

引入spring-cloud-starter-netflix-eureka-server依賴,并配置dependencyManagement俭驮。spring cloud使用的版本是當(dāng)前最新的Finchley.RELEASE版回溺。

3. 創(chuàng)建啟動(dòng)類

package com.yshmsoft;

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);
    }
}

@EnableEurekaServer,開(kāi)啟eureka-server自動(dòng)配置混萝。

4. 配置application.yml

spring:
  application:
    name: eureka-server
server:
  port: 8761
eureka:
  client:
    fetch-registry: false # 是否獲取注冊(cè)信息, 目前只有自己一個(gè)eureka-server遗遵,無(wú)需同步注冊(cè)信息
    register-with-eureka: false # 是否注冊(cè)到eureka, 因?yàn)樽约壕褪莈ureka-server所以無(wú)需注冊(cè)
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  instance:
    hostname: localhost

4 . 啟動(dòng)項(xiàng)目訪問(wèn)http://localhost:8761

EurekaServerHome

現(xiàn)在我們可以看到在Instances currently registered with Eureka中并沒(méi)有服務(wù)注冊(cè)逸嘀,接下來(lái)车要,讓我們修改一下上篇文章中的兩個(gè)示例,將他們作為服務(wù)注冊(cè)到Eureka-server中崭倘。

三翼岁、 將服務(wù)注冊(cè)到Eureka-Server中

1. 打開(kāi)product_server項(xiàng)目,修改pom.xml為如下內(nèi)容

<?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.yshmsoft</groupId>
    <artifactId>product_server</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

引入spring-cloud-starter-netflix-eureka-client依賴司光。并配置dependencyManagement琅坡。

2. 在啟動(dòng)類加上EnableDiscoveryClient注解

package com.yshmsoft;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

EnableDiscoveryClient注解在spring cloud commons包下,它是一個(gè)抽象程度比較高的注解残家,在本項(xiàng)目中也可以使用EnableEurekaClient注解專門針對(duì)Eureka提供的注解榆俺。

3. 編輯application.yml

server:
  port: 8080
spring:
  datasource:
    platform: h2
    schema: classpath:schema.sql
    data: classpath:data.sql
  jpa:
    generate-ddl: false
    show-sql: true
    hibernate:
      ddl-auto: none
  application:
    name: product-server # 在eureka中此值作為vipaddress,在發(fā)現(xiàn)服務(wù)時(shí)使用
logging:
  level:
    root: info
    org.hibernate: info
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

新增 cureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

4. 啟動(dòng)項(xiàng)目查看http://localhost:8761/eureka/是否注冊(cè)成功

服務(wù)注冊(cè)成功

5. 同樣的步驟配置consume_server并查看http://localhost:8761/eureka/是否注冊(cè)成功

所有服務(wù)注冊(cè)成功

我們看到所有服務(wù)都已注冊(cè)成功了。

三、 在consume_server使用EurekaClient發(fā)現(xiàn)服務(wù)并使用服務(wù)

分為四個(gè)步驟:

  1. 依賴注入EurekaClient茴晋。
  2. 調(diào)用EurekaClient的getNextServerFromEureka方法傳入迂求。vipaddress(application.yml中的spring.application.name的值)獲取服務(wù)。
  3. 將之前硬編碼的url替換成服務(wù)發(fā)現(xiàn)的url晃跺。
  4. 訪問(wèn)http://localhost:8000/user/1看是否成功
package com.yshmsoft.controller;

import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.yshmsoft.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@RestController
public class UserController {
    @Autowired
    RestTemplate restTemplate;
    @Qualifier("eurekaClient")
    @Autowired
    EurekaClient eurekaClient;
    @GetMapping("/user/{id}")
    User getUserById(@PathVariable Long id) {
        InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("product-server", false);
        Map urlVariables = new HashMap();
        urlVariables.put("hostName", instanceInfo.getHostName());
        urlVariables.put("port", instanceInfo.getPort());
        User user = restTemplate.getForObject("http://{hostName}:{port}/" + id, User.class,urlVariables);
        return user;
    }
}
配置成功

到此通過(guò)spring-cloud配置Eureka服務(wù)發(fā)現(xiàn)完成揩局。

通過(guò)spring-cloud集成Eureka服務(wù)發(fā)現(xiàn)框架完成,想想還有什么不足掀虎?
服務(wù)發(fā)現(xiàn)依賴于Eureka-server,如果Eureka-server掛點(diǎn)怎么辦凌盯,是否可以將Eureka-server集群化?
拼接url太過(guò)繁瑣有沒(méi)有更好的方案烹玉?
那么請(qǐng)繼續(xù)關(guān)注驰怎,下次再說(shuō)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末二打,一起剝皮案震驚了整個(gè)濱河市县忌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌继效,老刑警劉巖症杏,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瑞信,居然都是意外死亡厉颤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門凡简,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逼友,“玉大人,你說(shuō)我怎么就攤上這事秤涩≈钠颍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵筐眷,是天一觀的道長(zhǎng)黎烈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)浊竟,這世上最難降的妖魔是什么怨喘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任津畸,我火速辦了婚禮振定,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肉拓。我一直安慰自己后频,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著卑惜,像睡著了一般膏执。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上露久,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天更米,我揣著相機(jī)與錄音,去河邊找鬼毫痕。 笑死征峦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的消请。 我是一名探鬼主播栏笆,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼臊泰!你這毒婦竟也來(lái)了蛉加?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缸逃,失蹤者是張志新(化名)和其女友劉穎针饥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體需频,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡打厘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贺辰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片户盯。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饲化,靈堂內(nèi)的尸體忽然破棺而出莽鸭,到底是詐尸還是另有隱情,我是刑警寧澤吃靠,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布硫眨,位于F島的核電站,受9級(jí)特大地震影響巢块,放射性物質(zhì)發(fā)生泄漏礁阁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一族奢、第九天 我趴在偏房一處隱蔽的房頂上張望姥闭。 院中可真熱鬧,春花似錦越走、人聲如沸棚品。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铜跑。三九已至门怪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锅纺,已是汗流浹背掷空。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留囤锉,地道東北人拣帽。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嚼锄,于是被迫代替她去往敵國(guó)和親减拭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理区丑,服務(wù)發(fā)現(xiàn)拧粪,斷路器,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • Spring Cloud學(xué)習(xí)02-服務(wù)注冊(cè)與發(fā)現(xiàn) Spring Cloud簡(jiǎn)介 Spring Cloud是一個(gè)基于...
    it_zzy閱讀 4,621評(píng)論 2 20
  • Demo 源碼下載 本案例為源碼分支的 eureka 分支 服務(wù)發(fā)現(xiàn)概述 服務(wù)發(fā)現(xiàn)機(jī)制是為了解決硬網(wǎng)絡(luò)編碼問(wèn)題沧侥,服...
    聰明的奇瑞閱讀 5,179評(píng)論 0 13
  • 悼金庸 李鱷淚 王圖霸業(yè)病無(wú)藥可霎,始有江湖龍虎嘯。 彤管云光化古今宴杀,荊軻郭解寓魔道癣朗。 家國(guó)兒女匹夫心,刀劍恩仇肝膽傲...
    雷純閱讀 446評(píng)論 1 7
  • 1.無(wú)意中看到銀泰城青檸影咖的老板發(fā)的微信旺罢,說(shuō)升級(jí)改造后旷余,原有的洋娃娃、抱枕等可以免費(fèi)贈(zèng)送給會(huì)員扁达。臨睡時(shí)正卧,向女兒提...
    六一節(jié)_3928閱讀 186評(píng)論 0 0