服務器系統(tǒng)總崩潰比搭?來試試分布式部署

喜歡我文章的同學們可以關注我的今日頭條百家號来吩、簡書敢辩、個人博客CSDN

前言

1.之前有人給我留言說想要了解一下分布式弟疆,今天呢戚长,我們就來簡單的說一下SpringCloud分布式并且實現(xiàn)一個簡單的demo。

2.最近更新變少了怠苔,因為工作中也沒有遇到什么有意思的知識點同廉,希望大家可以提供一些想要了解的知識,私信或者評論都可以柑司。

我理解的SpringCloud

1.首先迫肖,我們的分布式系統(tǒng)都需要有一個服務注冊中心,來將所有提供服務的系統(tǒng)都注冊到系統(tǒng)中攒驰。在我了解的兩種分布式框架:Double(阿里)蟆湖、SpringCloud(Spring),在這兩種里面玻粪,我選擇了Spring隅津。我認為SpringCloud更加簡捷方便一些。

2.其次劲室,有了注冊中心伦仍,那我們就需要有服務的提供者,也就是我們所說的微服務很洋,只需要在項目中加入幾個簡單的配置充蓝,就可以將服務注冊到注冊中心,供其他客戶端使用。

3.最后呢谓苟,我們還需要注冊消費者官脓,通過消費者來消費注冊中心中的服務接口。

SpringCloud代碼實現(xiàn)

一娜谊、SpringCloud服務注冊中心

1.使用IntelliJ IDEA或者是其他的Java IDE創(chuàng)建一個Springboot項目确买,命名為eureka-server,當然這個自由選擇哈纱皆。

2.等待MAVEN構建好項目之后湾趾,打開pom.xml進行配置,并添加如下依賴派草。

    <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>Finchley.SR1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-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>

3.打開主類搀缠,也就是啟動類,添加如下注解近迁,將該項目注冊為服務注冊中心艺普。

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

4.打開項目中的application.properties我會將其重命名為application.yml,其實兩種格式并沒有什么分別鉴竭,只是個人喜好而已歧譬。

5.修改application.yml配置,如下搏存。

# 端口號
server:
  port: 8768
# 注冊中心配置
eureka:
  instance:
    hostname: 你的IP地址或者主機名或者是localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

spring:
  application:
    name: eurka-server

6.它的配置還有很多瑰步,比如

eureka.server.enable-self-preservation          # 設為false,關閉自我保護
eureka.server.eviction-interval-timer-in-ms     # 清理間隔(單位毫秒璧眠,默認是60*1000)

配置有很多缩焦,大家可以去官方文檔查看一下,按需配置责静。

7.自此注冊中心算是配置完善袁滥,啟動項目后,訪問對應端口即可看到如下頁面灾螃。

屏幕快照 2018-11-30 上午11.38.01
二题翻、SpringCloud服務提供者

1.同上創(chuàng)建Springboot項目,選擇創(chuàng)建為WEB項目腰鬼,名為service-test可以選擇常用的持久化框架mybatis藐握、JAP等等,選擇數(shù)據(jù)庫驅動垃喊。當然持久化框架可以不選,待MAVEN構建好項目之后可以手動加入自己的持久化袜炕,比如我常用的mybatis-plus或者hibernate本谜、JDBC等等。

屏幕快照 2018-11-30 下午1.54.02

2.打開pom.xml添加依賴

    <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>Finchley.SR1</spring-cloud.version>
    </properties>
    <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>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

3.打開啟動類偎窘,添加注釋@EnableEurekaClient注冊成為服務提供者乌助。

4.配置application.yml

server:
  port: 8888

spring:
  application:
    name: service-test
eureka:
  client:
    serviceUrl:
      defaultZone: http://你的服務注冊中心地址:端口/eureka/
  instance:
    hostname: 服務提供者地址溜在,及當前項目service-test所在ip

5.啟動項目后,可以在服務注冊中心的日志中看到如下結果:

屏幕快照 2018-11-30 下午2.05.00
Registered instance SERVICE-TEST/192.168.12.18:service-test:8888 with status UP (replication=false)

也可以在瀏覽器打開服務注冊中心查看服務是否注冊成功:

屏幕快照 2018-11-30 下午2.06.34

6.如上即為可提供服務他托,接下來就可以編寫我們的服務代碼掖肋,這里我們簡單的以返回字符串為例子。TestController

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/testOne")
    public String testOne() {
        return "成功進入";
    }
}
三赏参、SpringCloud服務消費

1.由上面的Java代碼可以看出志笼,我們的service-test服務者提供了一個/test/testOne的服務,那我們接下來就來創(chuàng)建一個消費者來消費該服務把篓。

2.依舊創(chuàng)建Springboot項目纫溃,命名為consumer添加同上依賴,在application.yml中添加如下配置

eureka:
  client:
    serviceUrl:
      defaultZone: http://注冊中心地址:端口/eureka/
  instance:
    hostname: 當前IP
server:
  port: 端口
spring:
  application:
    name: consumer

3.在啟動類中添加如下注解韧掩,注冊為消費者紊浩。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {

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

4.編寫ConsumerService.java接口,以此消費我們service-test中提供的服務疗锐。代碼如下:


import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Service
// 從服務注冊中心中通過名稱查找服務
@FeignClient(value = "service-test")
public interface ConsumerService {
    // 消費該服務提供者提供的“/test/testOne”服務
    @RequestMapping(value = "/test/testOne", method = RequestMethod.GET)
    String testOne();
}

5.編寫ConsumerController.java

@RestController
public class ConsumerController {
    @Autowired
    private TestService testService;
    @GetMapping("/test")
    public String test() {
        return testService.testOne();
    }
}

6.啟動項目后同樣可以在服務注冊中心的控制臺以及頁面查看注冊信息坊谁。

7.查看到服務注冊成功之后,我們正常訪問滑臊,localhost:端口/test口芍。就可以看到頁面會返回成功進入的字樣,即代表我們的服務消費成功简珠。

屏幕快照 2018-11-30 下午2.32.30
四阶界、SpringCloud分布式服務器部署測試

1.正好手頭有不少服務器,我們來部署測試一下聋庵,是否實現(xiàn)了簡單的分布式膘融。

2.首先將我們的三個項目打包為jar文件上傳至服務器當中。具體操作如下

屏幕快照 2018-11-30 下午2.36.53

3.待命令執(zhí)行完后祭玉,可以在項目的target目錄中看到生成的jar文件氧映。

4.通過scp命令將jar包上傳至服務器目錄

scp -r 文件本地路徑 服務器用戶名@服務器ip:/home/用戶名

5.接下來就是啟動jar包

# nohup 為后臺執(zhí)行,如果不使用該命令脱货,當關閉終端或者斷開鏈接時岛都,jar也會停止運行,導致項目無法訪問
nohup java -Dserver.port=部署端口 -jar 文件名

6.待項目全部部署完畢振峻,我們先來看一下服務注冊中心臼疫。

屏幕快照 2018-11-30 下午2.44.29

可以看到兩個服務均注冊成功,我們運行看一下扣孟。

屏幕快照 2018-11-30 下午2.45.30

與本地運行相同烫堤,但我們的三個項目時部署到不同的服務器當中的,以此也就實現(xiàn)了簡單的分布式部署。

五鸽斟、SpringCloud拔创、Ribbon開啟負載均衡

1.我們需要啟動同一個服務兩次,在不同的端口或者是服務器富蓄。

2.項目啟動后可以在注冊中心看到同名為service-test的服務有兩個剩燥。

3.在消費者的主類中添加如下代碼開啟負載均衡。

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

4.這樣立倍,他會根據(jù)訪問的次序灭红,自動的將用戶分配到不同的服務器或者端口。

最后說幾句

1.當然這只是最基礎的一部分帐萎。我也還在不斷的學習和深入了解當中比伏。

2.至于這樣部署的好處嘛,不僅減輕了服務器的負擔疆导,同樣降低了耦合赁项,如果我們只是下線一部分功能或者對功能進行升級,不會對整體造成影響澈段。

3.感謝大家的關注和支持悠菜,希望大家多多提出意見。

4.我在自己的服務器當中搭建了GitLab服務器败富,使用后感覺也是非常不錯悔醋,如果有想要嘗試自己搭建或者使用我搭建好的可以私信或者評論告訴我。

5.謝謝大家??????

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末兽叮,一起剝皮案震驚了整個濱河市芬骄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹦聪,老刑警劉巖账阻,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泽本,居然都是意外死亡淘太,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門规丽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒲牧,“玉大人,你說我怎么就攤上這事赌莺”溃” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵艘狭,是天一觀的道長晒屎。 經(jīng)常有香客問我喘蟆,道長,這世上最難降的妖魔是什么鼓鲁? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮港谊,結果婚禮上骇吭,老公的妹妹穿的比我還像新娘。我一直安慰自己歧寺,他們只是感情好燥狰,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斜筐,像睡著了一般龙致。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顷链,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天目代,我揣著相機與錄音,去河邊找鬼嗤练。 笑死榛了,一個胖子當著我的面吹牛,可吹牛的內容都是我干的煞抬。 我是一名探鬼主播霜大,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼革答!你這毒婦竟也來了战坤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤残拐,失蹤者是張志新(化名)和其女友劉穎途茫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹦骑,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡慈省,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眠菇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片边败。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捎废,靈堂內的尸體忽然破棺而出笑窜,到底是詐尸還是另有隱情,我是刑警寧澤登疗,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布排截,位于F島的核電站嫌蚤,受9級特大地震影響,放射性物質發(fā)生泄漏断傲。R本人自食惡果不足惜脱吱,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望认罩。 院中可真熱鬧箱蝠,春花似錦、人聲如沸垦垂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劫拗。三九已至间校,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間页慷,已是汗流浹背憔足。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留差购,地道東北人四瘫。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像欲逃,于是被迫代替她去往敵國和親找蜜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容