spring cloud(一) 從一個(gè)簡(jiǎn)單的springboot服務(wù)開(kāi)始

目錄

一勿璃、 為什么要使用微服務(wù)呢擒抛?它相比傳統(tǒng)的單體應(yīng)用有什么優(yōu)缺點(diǎn)呢?

從單體應(yīng)用和微服務(wù)的區(qū)別開(kāi)始說(shuō)起吧补疑。簡(jiǎn)單來(lái)說(shuō)歧沪,傳統(tǒng)的單體應(yīng)用就是把項(xiàng)目所需的全部文件打包在一起,而微服務(wù)指的是將功能拆分成可以獨(dú)立運(yùn)行的服務(wù)莲组,分開(kāi)部署诊胞,服務(wù)之間通過(guò)一些輕量級(jí)的通信機(jī)制進(jìn)行通信,這些服務(wù)一起構(gòu)建器整個(gè)系統(tǒng)锹杈。單從介紹來(lái)看微服務(wù)似乎有故意把簡(jiǎn)單的問(wèn)題復(fù)雜化的嫌疑撵孤,但是經(jīng)手過(guò)傳統(tǒng)的單體應(yīng)用的小伙伴肯定都深有體會(huì),隨著項(xiàng)目的不斷開(kāi)發(fā)竭望,項(xiàng)目的維護(hù)成本越來(lái)越高邪码,很多功能相互調(diào)用,牽一發(fā)而動(dòng)全身咬清。不僅如此闭专,編譯調(diào)試的過(guò)程也越來(lái)越慢。對(duì)于新的需求想用全新的技術(shù)棧提高開(kāi)發(fā)效率也是非常困難旧烧。那么微服務(wù)的出現(xiàn)正是為了解決日益復(fù)雜龐大的單體應(yīng)用所導(dǎo)致的項(xiàng)目維護(hù)難影钉,升級(jí)難的問(wèn)題。
那么列舉一下微服務(wù)的優(yōu)點(diǎn)吧:

  1. 易于開(kāi)發(fā)和維護(hù):因?yàn)橐粋€(gè)微服務(wù)通常只專(zhuān)注一個(gè)特定的業(yè)務(wù)功能掘剪,所以它的業(yè)務(wù)比較清晰平委,代碼量相對(duì)較少,開(kāi)發(fā)和維護(hù)單個(gè)微服務(wù)相對(duì)簡(jiǎn)單夺谁。
  2. 技術(shù)棧不受限:多個(gè)微服務(wù)之間通過(guò)輕量級(jí)的通信機(jī)制進(jìn)行通信廉赔,每個(gè)微服務(wù)完全可以選擇更適合此項(xiàng)業(yè)務(wù)的技術(shù)棧。
  3. 更合理利用資源:多個(gè)微服務(wù)分開(kāi)部署予权,可以針對(duì)io密集型的服務(wù)昂勉,和cpu密集型的服務(wù)部署在特定的服務(wù)器上∩ㄏ伲可針對(duì)某個(gè)特定的服務(wù)升級(jí)內(nèi)存或增加節(jié)點(diǎn)岗照。
  4. 復(fù)用性強(qiáng): 就像堆積木一樣,通用性強(qiáng)的服務(wù)可以用在多個(gè)項(xiàng)目中。

微服務(wù)的確定:

  1. 運(yùn)維困難: 更多的服務(wù)意味著需要投入更多的精力去維護(hù)項(xiàng)目攒至,與傳統(tǒng)的只需要保證一個(gè)服務(wù)正常運(yùn)行相比厚者,保證成噸的服務(wù)正常運(yùn)行顯然要更費(fèi)勁。
  2. 分布式固有的復(fù)雜性:在分布式系統(tǒng)中迫吐,網(wǎng)絡(luò)延遲库菲,分布式事務(wù),服務(wù)之間的容錯(cuò)等都是技術(shù)挑戰(zhàn)志膀。
  3. 接口的維護(hù)成本高: 微服務(wù)之間通過(guò)api進(jìn)行通信熙宇,如果修改某個(gè)服務(wù)的api將導(dǎo)致其他使用此api的服務(wù)做出相應(yīng)的調(diào)整。
  4. 重復(fù)的工作: 一些功能有可能多個(gè)服務(wù)都需要溉浙,此時(shí)可能會(huì)多個(gè)服務(wù)都實(shí)現(xiàn)同樣的功能烫止。

二、 微服務(wù)帶來(lái)了曙光戳稽,也帶來(lái)了挑戰(zhàn)馆蠕,那么應(yīng)對(duì)這些挑戰(zhàn)我們需要一些設(shè)計(jì)原則

  1. 單一職責(zé)原則
    一個(gè)服務(wù)只干一件事了。
  2. 服務(wù)自治原則
    每個(gè)服務(wù)得有基本的自理能力吧惊奇。開(kāi)發(fā)互躬、測(cè)試、部署颂郎、運(yùn)行都應(yīng)該可以獨(dú)立完成吼渡。
  3. 輕量級(jí)通信原則
    一定要輕啊,帶寬很重要祖秒。也要滿(mǎn)足跨平臺(tái)的特性诞吱,常用的協(xié)議有:REST,AMQP,STOMP,MQTT
  4. 微服務(wù)的粒度
    如何確定服務(wù)的邊界這是嘗嘗爭(zhēng)論的焦點(diǎn)。需要考慮的因素很多,如業(yè)務(wù)本身,團(tuán)隊(duì)的情況等等毁兆。

三维苔、本系列實(shí)現(xiàn)微服務(wù)的技術(shù)選擇

  1. spring-cloud 可以很好的和springboot一起工作,屬于主流的解決方案,文檔豐富社區(qū)活躍。
  2. docker 出于方便,快捷以及易用性考慮選擇docker作為微服務(wù)的運(yùn)行平臺(tái)阿趁。

四、 先從springboot開(kāi)始實(shí)現(xiàn)一個(gè)簡(jiǎn)單的服務(wù)間調(diào)用吧

場(chǎng)景介紹: 我們實(shí)現(xiàn)兩個(gè)服務(wù)坛猪,一個(gè)生產(chǎn)者服務(wù)脖阵,一個(gè)消費(fèi)者服務(wù)。消費(fèi)者調(diào)用生產(chǎn)者并獲取一個(gè)用戶(hù)信息墅茉。
技術(shù)選擇:java版本:1.8,springboot版本:2.0.5.RELEASE命黔,ORM:JPA,數(shù)據(jù)庫(kù):h2呜呐,依賴(lài)管理工具:maven,開(kāi)發(fā)工具:idea

1. 新建一個(gè)項(xiàng)目product_server

新建空項(xiàng)目product_server

2. 添加pom依賴(là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>

    <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>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3. 在classpath下建立schema.sql建表語(yǔ)句和data.sql數(shù)據(jù)語(yǔ)句悍募,并添加如下內(nèi)容:

// schema.sql
drop table user if exists;
create table user(
  id bigint generated by default as identity,
  name varchar(20),
  age int(3),
  money decimal(10,2),
  primary key(id)
);

//data.sql 
insert into user(id,name,age,money) values (1, 'user1', 18, 233.22);
insert into user(id,name,age,money) values (2, 'user2', 22, 21133.22);
insert into user(id,name,age,money) values (3, 'user3', 34, 23333.22);
insert into user(id,name,age,money) values (4, 'user4', 54, 555233.22);
insert into user(id,name,age,money) values (5, 'user5', 19, 2332313.22);
insert into user(id,name,age,money) values (6, 'user6', 33, 2335522.22);

4. 新建User實(shí)體

package com.yshmsoft.entity;

import javax.persistence.*;
import java.math.BigDecimal;
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column
    private String name;
    @Column
    private Integer age;
    @Column
    private BigDecimal money;
    //getter setter
}

5. 新建UserDao

package com.yshmsoft.dao;

import com.yshmsoft.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserDao extends JpaRepository<User,Long> {
}

6.新建UserController

package com.yshmsoft.controller;

import com.yshmsoft.dao.UserDao;
import com.yshmsoft.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    UserDao userDao;
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userDao.findById(id);
    }
}

7.編寫(xiě)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
logging:
  level:
    root: info
    org.hibernate: info

8.添加啟動(dòng)類(lèi)

  package com.yshmsoft;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

9. 運(yùn)行項(xiàng)目并訪(fǎng)問(wèn)http://localhost:8080/1

訪(fǎng)問(wèn)結(jié)果

10. 新建一個(gè)comsume_server模塊

新建模塊

comsume_server模塊

11. 同上一個(gè)項(xiàng)目一樣配置pom

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

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

12. 新建User類(lèi)

package com.yshmsoft.entity;

import java.math.BigDecimal;

public class User {
    private Long id;
    private String name;
    private Integer age;
    private BigDecimal money;
    // getter setter
}

13.創(chuàng)建消費(fèi)者Controller

package com.yshmsoft.controller;

import com.yshmsoft.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
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;

@RestController
public class UserController {
    @Autowired
    RestTemplate restTemplate; //spring 提供的RestTemplate,方便調(diào)用Rest接口
    @GetMapping("/user/{id}")
    User getUserById(@PathVariable Long id) {
        User user = restTemplate.getForObject("http://localhost:8080/" + id, User.class);
        return user;
    }
}

14. 創(chuàng)建配置文件application.yml

server:
  port: 8000
logging:
  level:
    root: info

15. 創(chuàng)建啟動(dòng)類(lèi)

package com.yshmsoft;

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

@SpringBootApplication
public class ConsumeApplication {

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

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

16 啟動(dòng)項(xiàng)目并訪(fǎng)問(wèn)http://localhost:8000/user/1

訪(fǎng)問(wèn)成功示例

到此完成第一個(gè)示例的編寫(xiě)蘑辑。

五、 談一談上面的示例

完成了一個(gè)簡(jiǎn)單的微服務(wù)之間調(diào)用坠宴,上面這種微服務(wù)的實(shí)現(xiàn)方式會(huì)面臨什么問(wèn)題呢洋魂?

  1. 上面的例子中生產(chǎn)者的api是寫(xiě)死的,當(dāng)生產(chǎn)者的api地址改變時(shí)消費(fèi)者要跟著改變喜鼓。
  2. 這種方式服務(wù)的伸縮性比較差副砍,服務(wù)對(duì)單個(gè)服務(wù)的依賴(lài)性較強(qiáng)
  3. 每次新建一個(gè)服務(wù)都要配置api地址心累。

接下來(lái)我們開(kāi)始spring cloud的學(xué)習(xí)吧颠通,看看spring cloud為我們提供的解決方案址晕。敬請(qǐng)期待膀懈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顿锰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子启搂,更是在濱河造成了極大的恐慌硼控,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胳赌,死亡現(xiàn)場(chǎng)離奇詭異牢撼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疑苫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)熏版,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捍掺,你說(shuō)我怎么就攤上這事撼短。” “怎么了挺勿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵曲横,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我不瓶,道長(zhǎng)禾嫉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任蚊丐,我火速辦了婚禮熙参,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘麦备。我一直安慰自己孽椰,他們只是感情好讲竿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著弄屡,像睡著了一般题禀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膀捷,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天迈嘹,我揣著相機(jī)與錄音,去河邊找鬼全庸。 笑死秀仲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的壶笼。 我是一名探鬼主播神僵,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼覆劈!你這毒婦竟也來(lái)了保礼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤责语,失蹤者是張志新(化名)和其女友劉穎炮障,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坤候,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胁赢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了白筹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片智末。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徒河,靈堂內(nèi)的尸體忽然破棺而出系馆,到底是詐尸還是另有隱情,我是刑警寧澤虚青,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布它呀,位于F島的核電站,受9級(jí)特大地震影響棒厘,放射性物質(zhì)發(fā)生泄漏纵穿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一奢人、第九天 我趴在偏房一處隱蔽的房頂上張望谓媒。 院中可真熱鬧,春花似錦何乎、人聲如沸句惯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抢野。三九已至拷淘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間指孤,已是汗流浹背启涯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恃轩,地道東北人结洼。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叉跛,于是被迫代替她去往敵國(guó)和親松忍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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