微服務(wù)入門這一篇就夠了

開篇

剛開始進(jìn)入軟件行業(yè)時(shí)還是單體應(yīng)用的時(shí)代柬姚,前后端分離的概念都還沒普及屁倔,開發(fā)的時(shí)候需要花大量的時(shí)間在“強(qiáng)大”的JSP上面卵凑,那時(shí)候SOA已經(jīng)算是新技術(shù)了。現(xiàn)在貌虾,微服務(wù)已經(jīng)大行其道吞加,有哪個(gè)互聯(lián)網(wǎng)產(chǎn)品不說自己是微服務(wù)架構(gòu)呢?

但是,對(duì)于微服務(wù)的理解每個(gè)人都不太一樣衔憨,這篇文章主要是聊一聊我對(duì)微服務(wù)的理解以及如何搭建經(jīng)典的微服務(wù)架構(gòu)叶圃,目的是梳理一下自己的一些想法,如果存在不同看法的歡迎指正践图!

什么是微服務(wù)

首先掺冠,什么是微服務(wù)呢?

單體應(yīng)用

相對(duì)的码党,要理解什么是微服務(wù)德崭,那么可以先理解什么是單體應(yīng)用,在沒有提出微服務(wù)的概念的“遠(yuǎn)古”年代揖盘,一個(gè)軟件應(yīng)用眉厨,往往會(huì)將應(yīng)用所有功能都開發(fā)和打包在一起,那時(shí)候的一個(gè)B/S應(yīng)用架構(gòu)往往是這樣的:


B/S

但是扣讼,當(dāng)用戶訪問量變大導(dǎo)致一臺(tái)服務(wù)器無法支撐時(shí)怎么辦呢缺猛?加服務(wù)器加負(fù)載均衡,架構(gòu)就變成這樣了:


B/S+負(fù)載均衡

后面發(fā)現(xiàn)把靜態(tài)文件獨(dú)立出來椭符,通過CDN等手段進(jìn)行加速,可以提升應(yīng)用的整體相應(yīng)耻姥,單體應(yīng)用的架構(gòu)就變成:


B/S+前后端分離

上面3中架構(gòu)都還是單體應(yīng)用销钝,只是在部署方面進(jìn)行了優(yōu)化,所以避免不了單體應(yīng)用的根本的缺點(diǎn):

  • 代碼臃腫琐簇,應(yīng)用啟動(dòng)時(shí)間長(zhǎng)蒸健;(代碼超過1G的項(xiàng)目都有!)
  • 回歸測(cè)試周期長(zhǎng)婉商,修復(fù)一個(gè)小小bug可能都需要對(duì)所有關(guān)鍵業(yè)務(wù)進(jìn)行回歸測(cè)試似忧。
  • 應(yīng)用容錯(cuò)性差,某個(gè)小小功能的程序錯(cuò)誤可能導(dǎo)致整個(gè)系統(tǒng)宕機(jī)丈秩;
  • 伸縮困難盯捌,單體應(yīng)用擴(kuò)展性能時(shí)只能整個(gè)應(yīng)用進(jìn)行擴(kuò)展,造成計(jì)算資源浪費(fèi)蘑秽。
  • 開發(fā)協(xié)作困難饺著,一個(gè)大型應(yīng)用系統(tǒng),可能幾十個(gè)甚至上百個(gè)開發(fā)人員肠牲,大家都在維護(hù)一套代碼的話幼衰,代碼merge復(fù)雜度急劇增加。

微服務(wù)

我認(rèn)為任何技術(shù)的演進(jìn)都是有跡可循的缀雳,任何新技術(shù)的出現(xiàn)都是為了解決原有技術(shù)無法解決的需求渡嚣,所以,微服務(wù)的出現(xiàn)就是因?yàn)樵瓉韱误w應(yīng)用架構(gòu)已經(jīng)無法滿足當(dāng)前互聯(lián)網(wǎng)產(chǎn)品的技術(shù)需求。

在微服務(wù)架構(gòu)之前還有一個(gè)概念:SOA(Service-Oriented Architecture)-面向服務(wù)的體系架構(gòu)识椰。我認(rèn)為的SOA只是一個(gè)架構(gòu)模型的方法論扬绪,并不是一個(gè)明確而嚴(yán)謹(jǐn)?shù)募軜?gòu)標(biāo)準(zhǔn),只是后面很多人將SOA與The Open Group的SOA參考模型等同了裤唠,認(rèn)為嚴(yán)格按照TOG-SOA標(biāo)準(zhǔn)的才算真正的SOA架構(gòu)挤牛。SOA就已經(jīng)提出的面向服務(wù)的架構(gòu)思想,所以微服務(wù)應(yīng)該算是SOA的一種演進(jìn)吧种蘸。

撇開架構(gòu)先不說墓赴,什么樣的服務(wù)才算微服務(wù)呢?

  • 單一職責(zé)的航瞭。一個(gè)微服務(wù)應(yīng)該都是單一職責(zé)的诫硕,這才是“微”的體現(xiàn),一個(gè)微服務(wù)解決一個(gè)業(yè)務(wù)問題(注意是一個(gè)業(yè)務(wù)問題而不是一個(gè)接口)刊侯。
  • 面向服務(wù)的章办。將自己的業(yè)務(wù)能力封裝并對(duì)外提供服務(wù),這是繼承SOA的核心思想滨彻,一個(gè)微服務(wù)本身也可能使用到其它微服務(wù)的能力藕届。
    我覺得滿足以上兩點(diǎn)就可以認(rèn)為典型的微服務(wù)。

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

微服務(wù)架構(gòu)亭饵,核心是為了解決應(yīng)用微服務(wù)化之后的服務(wù)治理問題休偶。

應(yīng)用微服務(wù)化之后,首先遇到的第一個(gè)問題就是服務(wù)發(fā)現(xiàn)問題辜羊,一個(gè)微服務(wù)如何發(fā)現(xiàn)其他微服務(wù)呢踏兜?最簡(jiǎn)單的方式就是每個(gè)微服務(wù)里面配置其他微服務(wù)的地址,但是當(dāng)微服務(wù)數(shù)量眾多的時(shí)候八秃,這樣做明顯不現(xiàn)實(shí)碱妆。所以需要使用到微服務(wù)架構(gòu)中的一個(gè)最重要的組件:服務(wù)注冊(cè)中心,所有服務(wù)都注冊(cè)到服務(wù)注冊(cè)中心昔驱,同時(shí)也可以從服務(wù)注冊(cè)中心獲取當(dāng)前可用的服務(wù)清單:

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

解決服務(wù)發(fā)現(xiàn)問題后疹尾,接著需要解決微服務(wù)分布式部署帶來的第二個(gè)問題:服務(wù)配置管理的問題。當(dāng)服務(wù)數(shù)量超過一定程度之后舍悯,如果需要在每個(gè)服務(wù)里面分別維護(hù)每一個(gè)服務(wù)的配置文件航棱,運(yùn)維人員估計(jì)要哭了。那么萌衬,就需要用到微服務(wù)架構(gòu)里面第二個(gè)重要的組件:配置中心饮醇,微服務(wù)架構(gòu)就變成下面這樣了:

配置中心

以上應(yīng)用內(nèi)部的服務(wù)治理,當(dāng)客戶端或外部應(yīng)用調(diào)用服務(wù)的時(shí)候怎么處理呢秕豫?服務(wù)A可能有多個(gè)節(jié)點(diǎn)朴艰,服務(wù)A观蓄、服務(wù)B和服務(wù)C的服務(wù)地址都不同,服務(wù)授權(quán)驗(yàn)證在哪里做祠墅?這時(shí)侮穿,就需要使用到服務(wù)網(wǎng)關(guān)提供統(tǒng)一的服務(wù)入口,最終形成典型微服務(wù)架構(gòu):


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

上面是一個(gè)典型的微服務(wù)架構(gòu)毁嗦,當(dāng)然微服務(wù)的服務(wù)治理還涉及很多內(nèi)容亲茅,比如:

  • 通過熔斷、限流等機(jī)制保證高可用狗准;
  • 微服務(wù)之間調(diào)用的負(fù)載均衡克锣;
  • 分布式事務(wù)(2PC、3PC腔长、TCC袭祟、LCN等);
  • 服務(wù)調(diào)用鏈跟蹤等等捞附。

微服務(wù)框架

目前國(guó)內(nèi)企業(yè)使用的微服務(wù)框架主要是Spring Cloud和Dubbo(或者DubboX)巾乳,但是Dubbo那兩年的停更嚴(yán)重打擊了開發(fā)人員對(duì)它的信心,Spring Cloud已經(jīng)逐漸成為主流鸟召,比較兩個(gè)框架的優(yōu)劣勢(shì)的文章在網(wǎng)上有很多胆绊,這里就不重復(fù)了,選擇什么框架還是按業(yè)務(wù)需求來吧药版,業(yè)務(wù)框架決定技術(shù)框架辑舷。
Spring Cloud全家桶提供了各種各樣的組件,基本可以覆蓋微服務(wù)的服務(wù)治理的方方面面槽片,以下列出了Spring Cloud一些常用組件:


Spring Cloud常用組件

搭建典型微服務(wù)架構(gòu)

本章節(jié)主要介紹如何基于Spring Cloud相關(guān)組件搭建一個(gè)典型的微服務(wù)架構(gòu)。
首先肢础,創(chuàng)建一個(gè)Maven父項(xiàng)目spring-cloud-examples还栓,用于管理項(xiàng)目依賴包版本。由于Spring Cloud組件很多传轰,為保證不同組件之間的兼容性剩盒,一般通過spring-cloud-dependencies統(tǒng)一管理Spring Cloud組件版本,而非每個(gè)組件單獨(dú)引入慨蛙。

pom.xml配置如下:

    <!-- 繼承SpringBoot父項(xiàng)目辽聊,注意與SpringCloud版本的匹配 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>

    <properties>
        <spring.boot.version>2.1.4.RELEASE</spring.boot.version>
        <spring.cloud.version>Greenwich.SR1</spring.cloud.version>
        <lombok.version>1.18.8</lombok.version>
        <maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version>
    </properties>


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

搭建服務(wù)配置中心

  • spring-cloud-examples項(xiàng)目下創(chuàng)建一個(gè)子項(xiàng)目spring-cloud-example-config,添加Spring Cloud Config Server端的相關(guān)依賴包:
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>
  • 添加Spring Boot配置文件application.yml期贫,配置如下:
spring:
  application:
    name: spring-cloud-example-config
  profiles:
    active: native #啟用本地配置文件
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/configs/ #配置文件掃描目錄

server:
  port: 8000 #服務(wù)端口
  • 啟動(dòng)類添加注解@EnableConfigServer通過啟用Config Server服務(wù)跟匆。
@SpringBootApplication
@EnableConfigServer
public class Application {

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

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

  • spring-cloud-examples項(xiàng)目下創(chuàng)建一個(gè)子項(xiàng)目spring-cloud-example-registry,在pom.xml中添加Eureka Server相關(guān)依賴包:
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>
  • spring-cloud-example-config配置中心項(xiàng)目的src/main/resource/configs目錄下添加一個(gè)服務(wù)配置文件spring-cloud-example-registry.yml通砍,配置如下:
spring:
  application:
    name: spring-cloud-example-registry

# Eureka相關(guān)配置
eureka:
  client:
    register-with-eureka: false #不注冊(cè)服務(wù)
    fetch-registry: false #不拉去服務(wù)清單
    serviceUrl:
      defaultZone: http://localhost:${server.port}/eureka/ #多個(gè)通過英文逗號(hào)分隔

server:
  port: 8001
  • spring-cloud-example-registry項(xiàng)目的src/main/resource/目錄添加bootstrap.yml配置文件玛臂,配置如下:
spring:
  cloud:
    config:
      name: spring-cloud-example-registry #配置文件名稱烤蜕,多個(gè)通過逗號(hào)分隔
      uri: http://localhost:8000 #Config Server服務(wù)地址
  • 啟動(dòng)類添加注解@EnableEurekaServer通過啟用Eureka Server服務(wù)。
@SpringBootApplication
@EnableEurekaServer
public class Application {

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

搭建業(yè)務(wù)服務(wù)A

  • spring-cloud-examples項(xiàng)目下創(chuàng)建一個(gè)業(yè)務(wù)服務(wù)A的子項(xiàng)目spring-cloud-example-biz-a迹冤,在pom.xml中添加以下依賴包:
    <dependencies>
        <!-- Spring Boot Web Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- feign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!-- Eureka Client Starter -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- Config Client Starter -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>
  • spring-cloud-example-config配置中心項(xiàng)目的src/main/resource/configs目錄下添加一個(gè)服務(wù)配置文件spring-cloud-example-biz-a.yml讽营,配置如下:
spring:
  application:
    name: spring-cloud-example-biz-a

server:
  port: 8010

# Eureka相關(guān)配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8001/eureka/
  instance:
    lease-renewal-interval-in-seconds: 10      # 心跳時(shí)間,即服務(wù)續(xù)約間隔時(shí)間(缺省為30s)
    lease-expiration-duration-in-seconds: 60  # 發(fā)呆時(shí)間泡徙,即服務(wù)續(xù)約到期時(shí)間(缺省為90s)
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
  • spring-cloud-example-biz-a項(xiàng)目的src/main/resource/目錄添加bootstrap.yml配置文件橱鹏,配置如下:
spring:
  cloud:
    config:
      name: spring-cloud-example-biz-a #配置文件名稱,多個(gè)通過逗號(hào)分隔
      uri: http://localhost:8000 #Config Server服務(wù)地址
  • 添加一個(gè)示例接口堪藐,代碼參考:
@RestController
@RequestMapping("/hello")
public class HelloController {
    /**
     * 示例方法
     *
     * @return
     */
    @GetMapping
    public String sayHello() {
        return "Hello,This is Biz-A Service.";
    }
}

搭建業(yè)務(wù)服務(wù)B

參考上面業(yè)務(wù)服務(wù)A搭建另外一個(gè)業(yè)務(wù)服務(wù)B莉兰。

搭建服務(wù)網(wǎng)關(guān)

  • spring-cloud-examples項(xiàng)目下創(chuàng)建一個(gè)業(yè)務(wù)服務(wù)A的子項(xiàng)目spring-cloud-example-gateway,在pom.xml中添加以下依賴包:
    <dependencies>
        <!-- zuul -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>

        <!-- Eureka Client Starter -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- Config Client Starter -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>
  • spring-cloud-example-config配置中心項(xiàng)目的src/main/resource/configs目錄下添加一個(gè)服務(wù)配置文件spring-cloud-example-gateway.yml庶橱,配置如下:
spring:
  application:
    name: spring-cloud-example-gateway

server:
  port: 8002

# Eureka相關(guān)配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8001/eureka/
  instance:
    lease-renewal-interval-in-seconds: 10      # 心跳時(shí)間贮勃,即服務(wù)續(xù)約間隔時(shí)間(缺省為30s)
    lease-expiration-duration-in-seconds: 60  # 發(fā)呆時(shí)間,即服務(wù)續(xù)約到期時(shí)間(缺省為90s)
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
  • spring-cloud-example-gateway項(xiàng)目的src/main/resource/目錄添加bootstrap.yml配置文件苏章,配置如下:
spring:
  cloud:
    config:
      name: spring-cloud-example-gateway #配置文件名稱寂嘉,多個(gè)通過逗號(hào)分隔
      uri: http://localhost:8000 #Config Server服務(wù)地址
  • 啟動(dòng)類添加注解@EnableZuulProxy通過啟用網(wǎng)關(guān)代理服務(wù)。
@SpringBootApplication
@EnableZuulProxy
public class Application {

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

啟動(dòng)示例

  • 啟動(dòng)順序
    spring-cloud-example-config>>spring-cloud-example-eureka>>spring-cloud-example-biz-a/spring-cloud-example-biz-b/spring-cloud-example-gateway

  • 通過網(wǎng)關(guān)訪問服務(wù)A接口


    服務(wù)A調(diào)用
  • 通過網(wǎng)關(guān)訪問服務(wù)B接口


    服務(wù)B調(diào)用

服務(wù)之間調(diào)用

  • 在業(yè)務(wù)服務(wù)A中添加一個(gè)Feign Client Bean枫绅,參考代碼如下:
@FeignClient(name = "spring-cloud-example-biz-b") # 指定服務(wù)名稱
public interface RemoteService {

    /**
     * 調(diào)用服務(wù)B的hello方法
     *
     * @return
     */
    @GetMapping("/hello") #指定請(qǐng)求地址
    String sayHello();
}
  • 業(yè)務(wù)服務(wù)A示例接口類增加call2b接口泉孩,代碼如下:
@RestController
@RequestMapping("/hello")
public class HelloController {

    @Autowired
    private RemoteService remoteService;

    /**
     * 示例方法
     *
     * @return
     */
    @GetMapping
    public String sayHello() {
        return "Hello,This is Biz-A Service.";
    }

    /**
     * 示例方法:調(diào)用服務(wù)B
     *
     * @return
     */
    @GetMapping(path = "/call2b")
    public String sayHello2B() {
        return remoteService.sayHello();
    }
}
  • 重啟業(yè)務(wù)服務(wù)A,通過調(diào)用/hello/call2b接口:
    服務(wù)之間調(diào)用

示例代碼

下一代微服務(wù)

目前網(wǎng)上很多說是下一代微服務(wù)架構(gòu)就是Service Mesh并淋,Service Mesh主流框架有Linkerd和Istio寓搬,其中Istio有大廠加持所以呼聲更高。Service Mesh我接觸還不多县耽,但是個(gè)人感覺并不一定能稱為下一代微服務(wù)架構(gòu)句喷,可能認(rèn)為是服務(wù)治理的另外一種解決方案更合適,是否能夠取代當(dāng)前的微服務(wù)架構(gòu)還需要持續(xù)觀察兔毙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唾琼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子澎剥,更是在濱河造成了極大的恐慌锡溯,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哑姚,死亡現(xiàn)場(chǎng)離奇詭異祭饭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叙量,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門倡蝙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宛乃,你說我怎么就攤上這事悠咱≌袅荆” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵析既,是天一觀的道長(zhǎng)躬贡。 經(jīng)常有香客問我,道長(zhǎng)眼坏,這世上最難降的妖魔是什么拂玻? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮宰译,結(jié)果婚禮上檐蚜,老公的妹妹穿的比我還像新娘。我一直安慰自己沿侈,他們只是感情好闯第,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缀拭,像睡著了一般咳短。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛛淋,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天咙好,我揣著相機(jī)與錄音,去河邊找鬼褐荷。 笑死勾效,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叛甫。 我是一名探鬼主播层宫,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼其监!你這毒婦竟也來了卒密?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤棠赛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后膛腐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睛约,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年哲身,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辩涝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勘天,死狀恐怖怔揩,靈堂內(nèi)的尸體忽然破棺而出捉邢,到底是詐尸還是另有隱情,我是刑警寧澤商膊,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布伏伐,位于F島的核電站,受9級(jí)特大地震影響晕拆,放射性物質(zhì)發(fā)生泄漏藐翎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一实幕、第九天 我趴在偏房一處隱蔽的房頂上張望吝镣。 院中可真熱鬧,春花似錦昆庇、人聲如沸末贾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拱撵。三九已至,卻和暖如春掂为,著一層夾襖步出監(jiān)牢的瞬間裕膀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工勇哗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昼扛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓欲诺,卻偏偏與公主長(zhǎng)得像抄谐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扰法,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355