一.服務(wù)注冊(cè)和發(fā)現(xiàn)

Spring Cloud簡(jiǎn)介

Spring Cloud是一個(gè)基于Spring Boot實(shí)現(xiàn)的云應(yīng)用開(kāi)發(fā)工具擒贸,它為基于JVM的云應(yīng)用開(kāi)發(fā)中的配置管理干旁、服務(wù)發(fā)現(xiàn)盖喷、斷路器、智能路由雷绢、微代理臂拓、控制總線、全局鎖习寸、決策競(jìng)選胶惰、分布式會(huì)話和集群狀態(tài)管理等操作提供了一種簡(jiǎn)單的開(kāi)發(fā)方式。

Spring Cloud包含了多個(gè)子項(xiàng)目(針對(duì)分布式系統(tǒng)中涉及的多個(gè)不同開(kāi)源產(chǎn)品)霞溪,比如:Spring Cloud Config孵滞、Spring Cloud Netflix、Spring Cloud CloudFoundry鸯匹、Spring Cloud AWS坊饶、Spring Cloud Security、Spring Cloud Commons殴蓬、Spring Cloud Zookeeper匿级、Spring Cloud CLI等項(xiàng)目。

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

“微服務(wù)架構(gòu)”在這幾年非常的火熱染厅,以至于關(guān)于微服務(wù)架構(gòu)相關(guān)的產(chǎn)品社區(qū)也變得越來(lái)越活躍(比如:netflix痘绎、dubbo),Spring Cloud也因Spring社區(qū)的強(qiáng)大知名度和影響力也被廣大架構(gòu)師與開(kāi)發(fā)者備受關(guān)注肖粮。
那么什么是“微服務(wù)架構(gòu)”呢孤页?簡(jiǎn)單的說(shuō),微服務(wù)架構(gòu)就是將一個(gè)完整的應(yīng)用從數(shù)據(jù)存儲(chǔ)開(kāi)始垂直拆分成多個(gè)不同的服務(wù)涩馆,每個(gè)服務(wù)都能獨(dú)立部署行施、獨(dú)立維護(hù)允坚、獨(dú)立擴(kuò)展,服務(wù)與服務(wù)間通過(guò)諸如RESTful API的方式互相調(diào)用蛾号。
對(duì)于“微服務(wù)架構(gòu)”稠项,大家在互聯(lián)網(wǎng)可以搜索到很多相關(guān)的介紹和研究文章來(lái)進(jìn)行學(xué)習(xí)和了解。也可以閱讀始祖Martin Fowler的《Microservices》鲜结,本文不做更多的介紹和描述皿渗。

服務(wù)注冊(cè)與發(fā)現(xiàn)

在簡(jiǎn)單介紹了Spring Cloud和微服務(wù)架構(gòu)之后,下面回歸本文的主旨內(nèi)容轻腺,如何使用Spring Cloud搭建服務(wù)注冊(cè)與發(fā)現(xiàn)模塊。
這里我們會(huì)用到Spring Cloud Netflix划乖,該項(xiàng)目是Spring Cloud的子項(xiàng)目之一贬养,主要內(nèi)容是對(duì)Netflix公司一系列開(kāi)源產(chǎn)品的包裝,它為Spring Boot應(yīng)用提供了自配置的Netflix OSS整合琴庵。通過(guò)一些簡(jiǎn)單的注解误算,開(kāi)發(fā)者就可以快速的在應(yīng)用中配置一下常用模塊并構(gòu)建龐大的分布式系統(tǒng)。它主要提供的模塊包括:服務(wù)發(fā)現(xiàn)(Eureka)迷殿,斷路器(Hystrix)儿礼,智能路有(Zuul),客戶端負(fù)載均衡(Ribbon)等庆寺。
所以蚊夫,我們這里的核心內(nèi)容就是服務(wù)發(fā)現(xiàn)模塊:Eureka。下面我們動(dòng)手來(lái)做一些嘗試懦尝。

1.創(chuàng)建服務(wù)注冊(cè)中心

1) 創(chuàng)建一個(gè)基礎(chǔ)的Spring Boot工程知纷,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.shijie</groupId>
    <artifactId>springcloudserver</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

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

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.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>Dalston.SR2</spring-cloud.version>
    </properties>

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

        <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>


</project>

2)在application.yml文件中添加以下內(nèi)容

server:
  port: 8761

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

3)在默認(rèn)的${projectName}Application.java文件中添加@EnableEurekaServer注解

@EnableEurekaServer
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

在瀏覽器輸入localhost:8761

2.創(chuàng)建提供服務(wù)的客戶端

1) 創(chuàng)建一個(gè)基礎(chǔ)的Spring Boot工程,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.shijie</groupId>
    <artifactId>springcloudclient</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

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

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.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>Dalston.SR2</spring-cloud.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-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>


</project>

2)在application.yml文件中添加以下內(nèi)容(指定服務(wù)為service-hi)

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8763
spring:
  application:
    name: service-hi

3)在默認(rèn)的${projectName}Application.java文件中添加以下內(nèi)容的注解

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient //這里可以打印log
@RestController
public class SpringCloudClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudClientApplication.class, args);
    }
}

4)一個(gè)帶日志的demo之controller
新建ComputerContrller類陵霉,內(nèi)容如下:

package com.shijie.controller;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


/**
 * Created by shijie on 2017/8/24 0024.
 */
@RestController
public class ComputerController {

    private final Logger logger  = Logger.getLogger(getClass());

    @Autowired
    private DiscoveryClient client;

    @RequestMapping(value = "/add" ,method = RequestMethod.GET)
    public Integer add(@RequestParam Integer a, @RequestParam Integer b) {
        ServiceInstance instance = client.getLocalServiceInstance();
        Integer r = a + b;
        logger.info("/add, host:" + instance.getHost() + ", service_id:" + instance.getServiceId() + ", result:" + r);
        return r;
    }

}

在瀏覽器輸入localhost:8763,然后訪問(wèn)或刷新之前的localhost:8761可以看到有一個(gè)新的服務(wù)service-hi
訪問(wèn)localhost:8763/add
可以在console控制臺(tái)可以看到日志琅轧,在瀏覽器可以看到打印3

以下是效果圖:

Paste_Image.png
Paste_Image.png
Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市踊挠,隨后出現(xiàn)的幾起案子乍桂,更是在濱河造成了極大的恐慌,老刑警劉巖效床,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睹酌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡剩檀,警方通過(guò)查閱死者的電腦和手機(jī)忍疾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谨朝,“玉大人卤妒,你說(shuō)我怎么就攤上這事甥绿。” “怎么了则披?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵共缕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我士复,道長(zhǎng)图谷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任阱洪,我火速辦了婚禮便贵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冗荸。我一直安慰自己承璃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布蚌本。 她就那樣靜靜地躺著盔粹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪程癌。 梳的紋絲不亂的頭發(fā)上舷嗡,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音嵌莉,去河邊找鬼进萄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锐峭,可吹牛的內(nèi)容都是我干的垮斯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼只祠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼兜蠕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起抛寝,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熊杨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后盗舰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體晶府,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年钻趋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了川陆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛮位,死狀恐怖较沪,靈堂內(nèi)的尸體忽然破棺而出鳞绕,到底是詐尸還是另有隱情,我是刑警寧澤尸曼,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布们何,位于F島的核電站,受9級(jí)特大地震影響控轿,放射性物質(zhì)發(fā)生泄漏冤竹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一茬射、第九天 我趴在偏房一處隱蔽的房頂上張望鹦蠕。 院中可真熱鬧,春花似錦在抛、人聲如沸钟病。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至廊鸥,卻和暖如春望浩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惰说。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工磨德, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吆视。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓典挑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親啦吧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子您觉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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