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

什么是服務(wù)注冊(cè)中心

服務(wù)注冊(cè)中心是服務(wù)實(shí)現(xiàn)服務(wù)化管理的核心組件,類似于目錄服務(wù)的作用,主要用來(lái)存儲(chǔ)服務(wù)信息,譬如提供者 url 串猴伶、路由信息等挽绩。服務(wù)注冊(cè)中心是 SOA 架構(gòu)中最基礎(chǔ)的設(shè)施之一。

服務(wù)注冊(cè)中心的作用

1稳其,服務(wù)的注冊(cè)
2扩氢,服務(wù)的發(fā)現(xiàn)

常見(jiàn)的注冊(cè)中心有哪些

1耕驰,Dubbo 的注冊(cè)中心 Zookeeper
2,Sringcloud 的注冊(cè)中心 Eureka

服務(wù)注冊(cè)中心解決了什么問(wèn)題

  1. 服務(wù)管理
  2. 服務(wù)的依賴關(guān)系管理

什么是 Eureka 注冊(cè)中心

Eureka 是 Netflix 開(kāi)發(fā)的服務(wù)發(fā)現(xiàn)組件录豺,本身是一個(gè)基于 REST 的服務(wù)朦肘。Spring Cloud將它集成在其子項(xiàng)目 spring-cloud-netflix 中,以實(shí)現(xiàn) Spring Cloud 的服務(wù)注冊(cè)于發(fā)現(xiàn)双饥,同時(shí)還提供了負(fù)載均衡厚骗、故障轉(zhuǎn)移等能力。

Eureka 注冊(cè)中心三種角色

1.Eureka Server
通過(guò) Register兢哭、Get领舰、Renew 等接口提供服務(wù)的注冊(cè)和發(fā)現(xiàn)。

2.Application Service (Service Provider)
服務(wù)提供方迟螺,把自身的服務(wù)實(shí)例注冊(cè)到 Eureka Server 中冲秽。

3.Application Client (Service Consumer)
服務(wù)調(diào)用方,通過(guò) Eureka Server 獲取服務(wù)列表矩父,消費(fèi)服務(wù)锉桑。

Eureka 單機(jī)服務(wù)端配置

添加啟動(dòng)器:Eureka Server

啟動(dòng)類中添加@EnableEurekaServer注解

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

application文件配置

#當(dāng)前服務(wù)名稱
spring.application.name=MyEureka
#服務(wù)端口
server.port=8761

#是否將服務(wù)本身自己注冊(cè)到eureka
eureka.client.register-with-eureka=false

#是否從eureka服務(wù)中獲取獲取注冊(cè)信息
eureka.client.fetch-registry=false

啟動(dòng)啟動(dòng)類,訪問(wèn)本機(jī)IP+服務(wù)端口窍株,看到如下頁(yè)面民轴,表示服務(wù)已經(jīng)啟動(dòng)成功

Eureka 服務(wù)器集群的搭建

啟動(dòng)器和啟動(dòng)類跟單機(jī)版一樣

額外的加入logback.xml日志配置文件進(jìn)行更詳盡的記錄日志

application配置文件需要更改

集群服務(wù)器1的配置

spring.application.name=MyEureka
server.port=8761

#設(shè)置eureka實(shí)例名稱
eureka.instance.hostname=eureka1

#eureka集群中其他服務(wù)器的連接地址
eureka.client.serviceUrl.defaultZone=http://eureka2:8761/eureka/

集群服務(wù)器2的配置

spring.application.name=MyEureka
server.port=8761

#設(shè)置eureka實(shí)例名稱
eureka.instance.hostname=eureka2

#eureka集群中其他服務(wù)器的連接地址
eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/

本次集群是通過(guò)多臺(tái)Linux虛擬機(jī)進(jìn)行架設(shè)

將項(xiàng)目打包為jar文件攻柠,在Linux中部署,部署方法后裸,通過(guò)java -jar xxx.jar 運(yùn)行jar文件即可瑰钮,如需要指定配置文件,
通過(guò)--spring.profiles.active={profile} 指定配置文件后綴即可微驶,
如果想后臺(tái)運(yùn)行浪谴,可以通過(guò)腳本文件運(yùn)行,腳本文件如下:

#!/bin/bash
 
cd `dirname $0`
 
CUR_SHELL_DIR=`pwd`
CUR_SHELL_NAME=`basename ${BASH_SOURCE}`
 
JAR_NAME="項(xiàng)目名稱(jar包的全名含.jar后綴)"
JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME
 
#JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m"
JAVA_MEM_OPTS=""
 
SPRING_PROFILES_ACTIV="-Dspring.profiles.active=配置文件變量名稱"
#SPRING_PROFILES_ACTIV=""
LOG_DIR=$CUR_SHELL_DIR/logs
LOG_PATH=$LOG_DIR/${JAR_NAME%..log
 
echo_help()
{
    echo -e "syntax: sh $CUR_SHELL_NAME start|stop"
}
 
if [ -z $1 ];then
    echo_help
    exit 1
fi
 
if [ ! -d "$LOG_DIR" ];then
    mkdir "$LOG_DIR"
fi
 
if [ ! -f "$LOG_PATH" ];then
    touch "$LOG_DIR"
fi
 
if [ "$1" == "start" ];then
 
    # check server
    PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
    if [ -n "$PIDS" ]; then
        echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}."
        exit 1
    fi
 
    echo "Starting the $JAR_NAME..."
 
    # start
    nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 &
 
    COUNT=0
    while [ $COUNT -lt 1 ]; do
        sleep 1
        COUNT=`ps  --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}' | wc -l`
        if [ $COUNT -gt 0 ]; then
            break
        fi
    done
    PIDS=`ps  --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}'`
    echo "${JAR_NAME} Started and the PID is ${PIDS}."
    echo "You can check the log file in ${LOG_PATH} for details."
 
elif [ "$1" == "stop" ];then
 
    PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
    if [ -z "$PIDS" ]; then
        echo "ERROR:The $JAR_NAME does not started!"
        exit 1
    fi
 
    echo -e "Stopping the $JAR_NAME..."
 
    for PID in $PIDS; do
        kill $PID > /dev/null 2>&1
    done
 
    COUNT=0
    while [ $COUNT -lt 1 ]; do
        sleep 1
        COUNT=1
        for PID in $PIDS ; do
            PID_EXIST=`ps --no-heading -p $PID`
            if [ -n "$PID_EXIST" ]; then
                COUNT=0
                break
            fi
        done
    done
 
    echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}."
else
    echo_help
    exit 1
fi

然后設(shè)置腳本文件執(zhí)行限權(quán): chmod 755 腳本文件名
然后通過(guò) 腳本文件名 start 啟動(dòng)服務(wù)因苹,腳本文件名 stop 停止服務(wù)

待集群服務(wù)都啟動(dòng)完成后苟耻,可以通過(guò)瀏覽器訪問(wèn)集群中任何一個(gè)服務(wù),看到如下頁(yè)面扶檐,表示集群搭建成功

測(cè)試Eureka集群注冊(cè)中心

創(chuàng)建provider項(xiàng)目

項(xiàng)目創(chuàng)建:

provider依賴于web啟動(dòng)器和Eureka Client啟動(dòng)器

application配置文件
#配置程序名稱凶杖,通過(guò)Eureka注冊(cè)時(shí),顯示的是此名稱
#配置應(yīng)用名稱款筑,通過(guò)Eureka注冊(cè)時(shí)官卡,顯示的是此名稱
spring.application.name=MyEureka.provider
#配置應(yīng)用端口
server.port=9090

#配置eureka集群的連接地址
eureka.client.serviceUrl.defaultZone=http://eureka2:8761/eureka/,http://eureka1:8761/eureka/

實(shí)體類

public class User {
    private int id;
    private String name;
    private int age;

    public User() {
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

controller

@RestController
public class UserController {

    @RequestMapping("user")
    public List<User> getUsers(){
        List<User> list = new ArrayList();
        list.add(new User(1,"張三",18));
        list.add(new User(2,"李四",24));
        list.add(new User(3,"王五",25));
        return list;
    }
}

啟動(dòng)類
類上使用@EnableEurekaClient注解,表示是Eureka客戶端醋虏,進(jìn)行Eureka注冊(cè)

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

創(chuàng)建consumer項(xiàng)目

創(chuàng)建項(xiàng)目:

consumer依賴于web啟動(dòng)器和Eureka Client啟動(dòng)器

application配置文件
#配置應(yīng)用名稱,通過(guò)Eureka注冊(cè)時(shí)哮翘,顯示的是此名稱
spring.application.name=MyEureka.consumers
#配置應(yīng)用端口
server.port=8080

#eureka集群的連接地址
eureka.client.serviceUrl.defaultZone=http://eureka2:8761/eureka/,http://eureka1:8761/eureka/

實(shí)體類:

public class User {
    private int id;
    private String name;
    private int age;

    public User() {
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

service

@Service
public class UserService {

    @Autowired
    private LoadBalancerClient loadBalancerClient;//Spring的內(nèi)置對(duì)象ribbon 負(fù)載均衡器

    public List<User> getUsers() {

        //ServiceInstance 封裝了服務(wù)的基本信息颈嚼,如 IP,端口
        ServiceInstance si = loadBalancerClient.choose("MyEureka.provider");//選擇調(diào)用的服務(wù)的名稱

        //拼接訪問(wèn)服務(wù)的 URL
        StringBuilder sb = new StringBuilder();
        sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/user");

        //springMVC RestTemplate
        RestTemplate rt = new RestTemplate();
        ParameterizedTypeReference<List<User>> parameterizedTypeReference = new ParameterizedTypeReference<List<User>>() {};

        //ResponseEntity:封裝了返回值信息
        ResponseEntity<List<User>> exchange = rt.exchange(sb.toString(), HttpMethod.GET, null, parameterizedTypeReference);

        List<User> list = exchange.getBody();
        return list;
    }
}

controller

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("getuser")
    public List<User> getUsers(){
        List<User> users = userService.getUsers();
        return users;
    }
}

測(cè)試

運(yùn)行consumer和provider啟動(dòng)類饭寺。
然后訪問(wèn)集群中任意的web頁(yè)面阻课,可以看到剛剛編寫(xiě)的consumer和provider注冊(cè)成功


然后通過(guò)訪問(wèn)consumer中的controller進(jìn)行測(cè)試,看看能否獲取到provider中提供數(shù)據(jù)

如圖艰匙,已經(jīng)得到provider注冊(cè)到Eureka注冊(cè)中心中的數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末限煞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子员凝,更是在濱河造成了極大的恐慌署驻,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件健霹,死亡現(xiàn)場(chǎng)離奇詭異旺上,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)糖埋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)宣吱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瞳别,你說(shuō)我怎么就攤上這事征候『脊ィ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵疤坝,是天一觀的道長(zhǎng)兆解。 經(jīng)常有香客問(wèn)我,道長(zhǎng)卒煞,這世上最難降的妖魔是什么痪宰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮畔裕,結(jié)果婚禮上衣撬,老公的妹妹穿的比我還像新娘。我一直安慰自己扮饶,他們只是感情好具练,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著甜无,像睡著了一般扛点。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岂丘,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天陵究,我揣著相機(jī)與錄音,去河邊找鬼奥帘。 笑死铜邮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寨蹋。 我是一名探鬼主播松蒜,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼已旧!你這毒婦竟也來(lái)了秸苗?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤运褪,失蹤者是張志新(化名)和其女友劉穎惊楼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秸讹,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胁后,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗦枢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攀芯。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡别凹,死狀恐怖堤器,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤壹堰,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布脐瑰,位于F島的核電站霍掺,受9級(jí)特大地震影響赌蔑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搔确,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一彼棍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膳算,春花似錦座硕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至机隙,卻和暖如春蜘拉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背有鹿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工旭旭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葱跋。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓持寄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親年局。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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