Spring Cloud Eureka 服務(wù)注冊(cè)中心搭建

Spring Cloud簡(jiǎn)介

Spring Cloud是一個(gè)基于Spring Boot實(shí)現(xiàn)的云應(yīng)用開發(fā)工具古徒,它為基于JVM的云應(yīng)用開發(fā)中涉及的配置管理勿决、服務(wù)發(fā)現(xiàn)麦撵、斷路器澡谭、智能路由、微代理西剥、控制總線痹栖、全局鎖、決策競(jìng)選瞭空、分布式會(huì)話和集群狀態(tài)管理等操作提供了一種簡(jiǎn)單的開發(fā)方式揪阿。

微服務(wù)架構(gòu)

微服務(wù)架構(gòu)就是將一個(gè)完整的應(yīng)用從數(shù)據(jù)存儲(chǔ)開始垂直拆分成多個(gè)不同的服務(wù),每個(gè)服務(wù)都能獨(dú)立部署咆畏、獨(dú)立維護(hù)南捂、獨(dú)立擴(kuò)展,服務(wù)與服務(wù)間通過諸如RESTful API的方式互相調(diào)用鳖眼。

服務(wù)治理

由于Spring Cloud為服務(wù)治理做了一層抽象接口黑毅,所以在Spring Cloud應(yīng)用中可以支持多種不同的服務(wù)治理框架,比如:Netflix Eureka钦讳、Consul矿瘦、Zookeeper。在Spring Cloud服務(wù)治理抽象層的作用下愿卒,我們可以無縫地切換服務(wù)治理實(shí)現(xiàn)缚去,并且不影響任何其他的服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)琼开、服務(wù)調(diào)用等邏輯易结。

Spring Cloud Eureka
Spring Cloud Eureka是Spring Cloud Netflix項(xiàng)目下的服務(wù)治理模塊。而Spring Cloud Netflix項(xiàng)目是Spring Cloud的子項(xiàng)目之一柜候,主要內(nèi)容是對(duì)Netflix公司一系列開源產(chǎn)品的包裝搞动,它為Spring Boot應(yīng)用提供了自配置的Netflix OSS整合。通過一些簡(jiǎn)單的注解渣刷,開發(fā)者就可以快速的在應(yīng)用中配置一下常用模塊并構(gòu)建龐大的分布式系統(tǒng)鹦肿。它主要提供的模塊包括:服務(wù)發(fā)現(xiàn)(Eureka),斷路器(Hystrix)辅柴,智能路由(Zuul)箩溃,客戶端負(fù)載均衡(Ribbon)等瞭吃。

1、創(chuàng)建 服務(wù)注冊(cè)中心
創(chuàng)建一個(gè)基礎(chǔ)的Spring Boot工程涣旨,命名為eureka-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>chanzj</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-server</name>
    <description>eureka-server</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath/>
    </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>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</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>

通過@EnableEurekaServer注解啟動(dòng)一個(gè)服務(wù)注冊(cè)中心提供給其他應(yīng)用進(jìn)行對(duì)話。

package chanzj.eurekaserver;

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

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

修改application.properties的配置霹陡,因?yàn)樵谀J(rèn)設(shè)置下和蚪,該服務(wù)注冊(cè)中心也會(huì)將自己作為客戶端來嘗試注冊(cè)它自己,所以我們需要禁用它的客戶端注冊(cè)行為烹棉。

spring.application.name=eureka-server
server.port=1002

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

啟動(dòng)工程惠呼,訪問http://localhost:1002/÷驮牛可以看到下面的頁面,其中還沒有發(fā)現(xiàn)任何服務(wù)旅薄。

微信圖片_20180424155826.png

2辅髓、創(chuàng)建 服務(wù)提供方
下面我們創(chuàng)建提供服務(wù)的客戶端,并向服務(wù)注冊(cè)中心注冊(cè)自己少梁。
首先洛口,創(chuàng)建一個(gè)基本的Spring Boot應(yīng)用。命名為eureka-client凯沪,修改pom.xml文件第焰,添加相關(guān)依賴

<?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>chanzj</groupId>
    <artifactId>eureka-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

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

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.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>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</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>

編寫controller,實(shí)現(xiàn)/test接口訪問妨马。

package chanzj.eurekaclient.web;

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

@RestController
public class eurekaController {

    @RequestMapping("/test")
    public String test(){
        return "這是一個(gè)神奇的eureka";
    }
}

最后在應(yīng)用主類中通過加上@EnableDiscoveryClient注解挺举,該注解能激活Eureka中的DiscoveryClient實(shí)現(xiàn),這樣才能實(shí)現(xiàn)Controller中對(duì)服務(wù)信息的輸出烘跺。

package chanzj.eurekaclient;

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

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

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

增加application.properties的配置信息

spring.application.name=eureka-client
server.port=2001
eureka.client.serviceUrl.defaultZone=http://localhost:1002/eureka/

通過spring.application.name屬性湘纵,我們可以指定微服務(wù)的名稱后續(xù)在調(diào)用的時(shí)候只需要使用該名稱就可以進(jìn)行服務(wù)的訪問。eureka.client.serviceUrl.defaultZone屬性對(duì)應(yīng)服務(wù)注冊(cè)中心的配置內(nèi)容滤淳,指定服務(wù)注冊(cè)中心的位置梧喷。為了在本機(jī)上測(cè)試區(qū)分服務(wù)提供方和服務(wù)注冊(cè)中心,使用server.port屬性設(shè)置不同的端口脖咐。

啟動(dòng)項(xiàng)目铺敌。
訪問http://localhost:1002/

czj01.png

服務(wù)注冊(cè)到了注冊(cè)中心!

訪問http://localhost:2001/test

image.png

使用LoadBalancerClient消費(fèi)服務(wù)

我們先來創(chuàng)建一個(gè)服務(wù)消費(fèi)者工程屁擅,命名為:eureka-consumer
修改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>chanzj</groupId>
    <artifactId>eureka-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-consumer</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.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>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</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>

創(chuàng)建應(yīng)用主類偿凭。初始化RestTemplate,用來真正發(fā)起REST請(qǐng)求煤蹭。@EnableDiscoveryClient注解用來將當(dāng)前應(yīng)用加入到服務(wù)治理體系中笔喉。

package chanzj.eurekaconsumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaConsumerApplication {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

創(chuàng)建一個(gè)接口用來消費(fèi)eureka-client提供的接口:

package chanzj.eurekaconsumer.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {

    @Autowired
    LoadBalancerClient loadBalancerClient;
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/consumer")
    public String test() {
        ServiceInstance serviceInstance = loadBalancerClient.choose("eureka-client");
        String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/test";
        System.out.println(url);
        return restTemplate.getForObject(url, String.class);
    }
}

可以看到這里取视,我們注入了LoadBalancerClient和RestTemplate,并在/consumer接口的實(shí)現(xiàn)中常挚,先通過loadBalancerClient的choose函數(shù)來負(fù)載均衡的選出一個(gè)eureka-client的服務(wù)實(shí)例作谭,這個(gè)服務(wù)實(shí)例的基本信息存儲(chǔ)在ServiceInstance中,然后通過這些對(duì)象中的信息拼接出訪問/test接口的詳細(xì)地址奄毡,最后再利用RestTemplate對(duì)象實(shí)現(xiàn)對(duì)服務(wù)提供者接口的調(diào)用折欠。

添加application.properties配置文件,指定eureka注冊(cè)中心的地址:

spring.application.name=eureka-consumer
server.port=2101

eureka.client.serviceUrl.defaultZone=http://localhost:1002/eureka/

啟動(dòng)項(xiàng)目吼过。
訪問http://localhost:2101/consumer
如圖

image.png

構(gòu)建成功锐秦!

以上完成了一個(gè)demo。接下來會(huì)繼續(xù)與大家探討盗忱。`

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酱床,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趟佃,更是在濱河造成了極大的恐慌扇谣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闲昭,死亡現(xiàn)場(chǎng)離奇詭異罐寨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)序矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門鸯绿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人簸淀,你說我怎么就攤上這事瓶蝴。” “怎么了租幕?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵囊蓝,是天一觀的道長。 經(jīng)常有香客問我令蛉,道長聚霜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任珠叔,我火速辦了婚禮蝎宇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祷安。我一直安慰自己姥芥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布汇鞭。 她就那樣靜靜地躺著凉唐,像睡著了一般庸追。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上台囱,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天淡溯,我揣著相機(jī)與錄音,去河邊找鬼簿训。 笑死咱娶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的强品。 我是一名探鬼主播膘侮,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼的榛!你這毒婦竟也來了琼了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤夫晌,失蹤者是張志新(化名)和其女友劉穎表伦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慷丽,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鳄哭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了要糊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妆丘,死狀恐怖锄俄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勺拣,我是刑警寧澤奶赠,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站药有,受9級(jí)特大地震影響毅戈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愤惰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一苇经、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宦言,春花似錦扇单、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽施流。三九已至,卻和暖如春鄙信,著一層夾襖步出監(jiān)牢的瞬間瞪醋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工扮碧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趟章,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓慎王,卻偏偏與公主長得像蚓土,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赖淤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348