springcloud

服務(wù)調(diào)用方式

常見(jiàn)的遠(yuǎn)程調(diào)用方式有RPC和HTTP

RPC:Remote Produce Call遠(yuǎn)程過(guò)程調(diào)用,類似的還有RMI苔咪。自定義數(shù)據(jù)格式,基于原生TCP通信柳骄,速度快团赏,效率高舔清。早期的webservice曲初,現(xiàn)在熱門的dubbo,都是RPC的典型代表抒痒。
HTTP:http其實(shí)是一種網(wǎng)絡(luò)傳輸協(xié)議目锭,基于TCP痢虹,規(guī)定了數(shù)據(jù)傳輸?shù)母袷健主儡,F(xiàn)在客戶端瀏覽器與服務(wù)端通信基本都是采用http協(xié)議糜值,也可以用來(lái)進(jìn)行遠(yuǎn)程服務(wù)調(diào)用坯墨。缺點(diǎn)是消息封裝臃腫捣染,優(yōu)勢(shì)是對(duì)服務(wù)的提供和調(diào)用方?jīng)]有任何技術(shù)限定停巷,自由靈活,更符合微服務(wù)理念蕾各。

RestTemplate的使用

跨服務(wù)調(diào)用:restTemplate的getForObject(地址式曲,結(jié)果)

@Autowired
private RestTemplate restTemplate;
@Test
public void httpGet(){
  User user = restTemplate.getForObject("http://localhost:80/user/2", User.class);
  System.out.println("user = " + user);
}

初始SpringCloud

dependencyManagement和dependencies區(qū)別:dependencies:自動(dòng)引入聲明在dependencies里的所有依賴吝羞,并默認(rèn)被所有的子項(xiàng)目繼承内颗。如果項(xiàng)目中不寫(xiě)依賴項(xiàng),則會(huì)從父項(xiàng)目繼承(屬性全部繼承)聲明在父項(xiàng)目dependencies里的依賴項(xiàng)卖氨。dependencyManagement里只是聲明依賴筒捺,并不實(shí)現(xiàn)引入纸厉,因此子項(xiàng)目需要顯示的聲明需要的依賴颗品。
可以給大家看下我搭好的微服務(wù)調(diào)用場(chǎng)景

項(xiàng)目框架

user-service對(duì)外提供了查詢用戶的接口躯枢;consumer-demo通過(guò)RestTemplate訪問(wèn)http://localhost:8081/user/{id}接口,查詢用戶數(shù)據(jù)氓仲。
哈哈哈哈敬扛,yang嗯嗯邁出了萬(wàn)里長(zhǎng)征第一步。
但是這個(gè)遠(yuǎn)程服務(wù)調(diào)用案例存在問(wèn)題:在consumer中谍珊,把url地址硬編碼到了代碼中抬驴,不方便后期維護(hù)缆巧;consumer需要記憶user-service的地址陕悬,如果出現(xiàn)變更,可能得不到通知胧卤,地址將失效枝誊;consumer不清楚user-service的狀態(tài)惜纸,服務(wù)宕機(jī)也不知道耐版;user-service只有一臺(tái)服務(wù),不具備高可用性古瓤;即便user-service形成集群落君,consumer還需自己實(shí)現(xiàn)負(fù)載均衡亭引。
注冊(cè)中心原理圖如下
心跳(續(xù)約):提供者定期通過(guò)http方式向Eureka刷新自己的狀態(tài)痛侍。
基本架構(gòu)

(1)引入依賴

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

(2)在啟動(dòng)類上加@EnableEurekaServer

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

(3)改端口

server:
  port: 10086

設(shè)置應(yīng)用名主届;將自己注冊(cè)到自己

spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka

OK君丁,此時(shí)eureka-server啟動(dòng)起來(lái)了。
user-service服務(wù)要注冊(cè)到eureka-server橡庞,改造user-service

<!--eureka客戶端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-client</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

添加@EnableDiscoveryClient注解

@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("enen.user.mapper")
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class);
    }
}

要知道注冊(cè)中心的位置及給應(yīng)用命名

server:
  port: 8081
spring:
  application:
    name: user-service
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/eesy
    username: root
    password: 12345678
mybatis:
  type-aliases-package: enen.user.pojo
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

ok 扒最,接下來(lái)改造服務(wù)的調(diào)用方吧趣,同樣引依賴耙厚,加注解薛躬,加配置。

server:
  port: 8088
spring:
  application:
    name: consumer-service
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

接下來(lái)看下高可用的Eureka

server:
  port: 10087
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

user-service向注冊(cè)中心寫(xiě)入時(shí)

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

Eureka客戶端:
服務(wù)提供者要向EurekaServer注冊(cè)服務(wù)八匠,并且完成服務(wù)續(xù)約等工作臀叙。
服務(wù)注冊(cè):
服務(wù)提供者在啟動(dòng)時(shí)劝萤,會(huì)檢測(cè)配置屬性中的:eureka.client.register-with-eureka=true參數(shù)是否正確慎璧,事實(shí)上就是true胸私。如果值為true,則會(huì)向EurekaServer發(fā)起一個(gè)Rest請(qǐng)求阔涉,并攜帶自己的元數(shù)據(jù)信息瑰排,EurekaServer會(huì)把這些信息保存到一個(gè)雙層Map結(jié)構(gòu)中。
服務(wù)續(xù)約:
在注冊(cè)服務(wù)完成以后崇渗,服務(wù)提供者會(huì)維持一個(gè)心跳(定時(shí)向EurekaServer發(fā)起Rest請(qǐng)求)宅广,告訴EurekaServer:“我還或者”些举。這個(gè)稱為服務(wù)的續(xù)約(renew):有兩個(gè)重要的參數(shù)可以修改服務(wù)續(xù)約的行為:

eureka:
  instance:
    lease-renewal-interval-in-seconds: 30
    lease-expiration-duration-in-seconds: 90

lease-renewal-interval-in-seconds服務(wù)續(xù)約的間隔户魏,默認(rèn)30秒绪抛。lease-expiration-duration-in-seconds服務(wù)失效時(shí)間,默認(rèn)90秒笤休。也就是說(shuō)症副,默認(rèn)情況下每隔30秒服務(wù)就會(huì)向注冊(cè)中心發(fā)送一次心跳贞铣,證明自己還活著辕坝。如果超過(guò)90秒沒(méi)有發(fā)送心跳,EurekaServer就會(huì)認(rèn)為該服務(wù)宕機(jī)琳袄,會(huì)從服務(wù)列表中移除窖逗,這兩個(gè)值在生產(chǎn)環(huán)境不要修改餐蔬,默認(rèn)即可。
獲取服務(wù)列表:
當(dāng)服務(wù)消費(fèi)者啟動(dòng)時(shí)音同,會(huì)檢測(cè)eureka.client.fetch-registry=true參數(shù)的值痴鳄,如果為true痪寻,則會(huì)從EurekaServer服務(wù)的列表只讀備份橡类,然后緩存在本地芽唇,并且每隔30秒會(huì)重新獲取更新數(shù)據(jù)匆笤。
失效剔除:有時(shí)我們的服務(wù)可能由于內(nèi)存溢出或網(wǎng)絡(luò)故障等原因使服務(wù)不能正常的工作炮捧,而服務(wù)注冊(cè)中心并未收到“服務(wù)下線”的請(qǐng)求。相對(duì)于服務(wù)提供者的“服務(wù)續(xù)約”操作末誓,服務(wù)注冊(cè)中心在啟動(dòng)時(shí)會(huì)創(chuàng)建一個(gè)定時(shí)服務(wù)喇澡,默認(rèn)每隔一段時(shí)間(默認(rèn)60秒)將當(dāng)前清單中超時(shí)(默認(rèn)90秒)沒(méi)有續(xù)約的服務(wù)剔除殊校∥鳎可以通過(guò)eureka.server.eviction-interval-timer-in-ms參數(shù)對(duì)其進(jìn)行修改艺谆,單位是毫秒。
負(fù)載均衡Ribbon:

       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
   // private DiscoveryClient discoveryClient;
    private RibbonLoadBalancerClient client;

    @GetMapping("{id}")
    public User queryById(@PathVariable("id") int id){
        //根據(jù)服務(wù)id獲取實(shí)例
      //  List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
        //從實(shí)例中取出ip和端口
       // ServiceInstance ins = instances.get(0);

        //使用負(fù)載均衡(默認(rèn)輪詢)
        ServiceInstance ins = client.choose("user-service");
        String url = "http://"+ins.getHost()+":"+ins.getPort()+"/user/" + id;
        User user = restTemplate.getForObject(url, User.class);
        return user;
    }
}

第二種方式:
在啟動(dòng)類上加注解@LoadBalanced

@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {

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

    public static void main(String[] args){
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
   // private DiscoveryClient discoveryClient;
   // private RibbonLoadBalancerClient client;

    @GetMapping("{id}")
    public User queryById(@PathVariable("id") int id){
        //根據(jù)服務(wù)id獲取實(shí)例
      //  List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
        //從實(shí)例中取出ip和端口
       // ServiceInstance ins = instances.get(0);

        //使用負(fù)載均衡(默認(rèn)輪詢)
       // ServiceInstance ins = client.choose("user-service");
       // String url = "http://"+ins.getHost()+":"+ins.getPort()+"/user/" + id;
        String url = "http://user-service/user/"+id;
        User user = restTemplate.getForObject(url, User.class);
        return user;
    }
}

采用隨機(jī)而不是輪詢

user-service:
  ribbon:
    NFLoadBalancerRulerClassName: com.netflix.loadbalancer.RandomRule

Hystrix:
解決雪崩問(wèn)題的手段有兩個(gè):線程隔離和服務(wù)熔斷。
線程隔離侠碧,服務(wù)降級(jí)
Hystrix為每個(gè)依賴服務(wù)調(diào)用分配一個(gè)小的線程池缠黍,如果線程池已滿調(diào)用將被立即拒絕瓷式,默認(rèn)不采用排隊(duì)贸典,加速失敗判定時(shí)間。
用戶的請(qǐng)求將不再直接訪問(wèn)服務(wù)据过,而是通過(guò)線程池中的空閑線程來(lái)訪問(wèn)服務(wù)绳锅,如果線程池已滿酝掩,或者超時(shí)庸队,則會(huì)進(jìn)行降級(jí)處理彻消。
服務(wù)降級(jí):優(yōu)先保證核心服務(wù),而非核心服務(wù)不可用或弱可用丙笋。
觸發(fā)Hystrix服務(wù)降級(jí)的情況:線程池已滿御板;請(qǐng)求超時(shí)牛郑。
實(shí)踐服務(wù)的消費(fèi)方進(jìn)行降級(jí)處理:
(1)引依賴

       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

(2)開(kāi)啟熔斷淹朋,加注解@EnableCircuitBreaker

@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {

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

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

@SpringCloudApplication=@EnableCircuitBreaker+@EnableDiscoveryClient+@SpringBootApplication
(3)編寫(xiě)降級(jí)邏輯

    @GetMapping("{id}")
    //成功和失敗的方法返回值和參數(shù)列表必須一樣
    @HystrixCommand(fallbackMethod = "queryByIdFallback")
    public String queryById(@PathVariable("id") int id){
        String url = "http://user-service/user/"+id;
        String  user = restTemplate.getForObject(url, String.class);
        return user;
    }
    public String  queryByIdFallback(@PathVariable("id") int id){
        return "不好意思杈抢,服務(wù)器太擁擠了!";
    }

通用的fallback

@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "defaultFallback")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("{id}")
    //成功和失敗的方法返回值和參數(shù)列表必須一樣
    //@HystrixCommand(fallbackMethod = "queryByIdFallback")
    @HystrixCommand
    public String queryById(@PathVariable("id") int id){
        String url = "http://user-service/user/"+id;
        String  user = restTemplate.getForObject(url, String.class);
        return user;
    }
    public String  queryByIdFallback(int id){
        return "不好意思,服務(wù)器太擁擠了歼捐!";
    }
    public String  defaultFallback(){
        return "不好意思窥岩,服務(wù)器太擁擠了颂翼!";
    }

}

自定義超時(shí)時(shí)長(zhǎng)配置

@HystrixCommand(commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "2000")
    })

feign

feign可以把Rest請(qǐng)求進(jìn)行隱藏朦乏,偽裝成類似SpringMVC的controller一樣氧骤,你不用再自己拼接url筹陵,拼接參數(shù)等操作,一切都交給feign去做并思。
引依賴宋彼,加注解输涕,寫(xiě)接口

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

在啟動(dòng)類上慨畸,添加注解寸士,開(kāi)啟feign功能

@EnableFeignClient
@FeignClient("user-service")
public interface UserClient {
    @GetMapping("user/{id}")
    User queryById(@PathVariable("id") int id);
}

在遠(yuǎn)程調(diào)用時(shí),直接注入U(xiǎn)serClient

@Autowird
private UserClient userClient;

@GetMapping("{id}")
public User queryById(@PathVariable("id") int id){
      return userClient.queryById(id);
}

feign開(kāi)啟熔斷:
在application.yml中開(kāi)啟hystrix

feign:
  hystrix:
    enabled: true

feign中的Fallback配置不像Ribbon中那樣簡(jiǎn)單了螟深。

zuul

zuul加入后的架構(gòu)

不管是來(lái)自客戶端的請(qǐng)求界弧,還是服務(wù)內(nèi)部調(diào)用垢箕,一切對(duì)服務(wù)的請(qǐng)求都會(huì)經(jīng)過(guò)Zuul這個(gè)網(wǎng)關(guān)兑巾,然后再由網(wǎng)關(guān)來(lái)實(shí)現(xiàn)鑒權(quán)蒋歌、動(dòng)態(tài)路由等等操作堂油。Zuul就是我們服務(wù)的統(tǒng)一入口。
快速入門:
引依賴

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>

加注解

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

配置

server:
  port: 10010
zuul:
  routes:
    hehe:
      path: /user-service/**
      url: http://127.0.0.1:8081

訪問(wèn)http://127.0.0.1:10010/user-service/user/1
ok了。
這里地址是固定的不好院峡,需要從eureka中拉取服務(wù)系宜。
引依賴

      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

最終配置為:

server:
  port: 10010
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
zuul:
  routes:
    hehe:
      path: /user-service/**
      serviceId: user-service

http://127.0.0.1:10010/user-service
成功映射到/user-service/**实抡,然后轉(zhuǎn)發(fā)至serviceId: user-service這個(gè)服務(wù)欢策,從eureka中去查找到8081踩寇,然后訪問(wèn)8081。
OK辣卒,以上就是面向服務(wù)的路由荣茫。
簡(jiǎn)化配置方案:
服務(wù)ID:服務(wù)路徑

zuul:
  routes:
    user-service: /user-service/**

默認(rèn)情況下啡莉,一切服務(wù)的映射路徑就是服務(wù)名本身咧欣。例如服務(wù)名為:user-service,則默認(rèn)的映射路徑就是:/user-service/**衩椒。也就是說(shuō)毛萌,剛才的映射規(guī)則不用配置也是ok的朝聋。
如果想禁用某個(gè)路由規(guī)則囤躁,可以:

server:
  port: 10010
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
spring:
  application:
    name: gateway
zuul:
  routes:
    user-service: /user/**
  ignored-services:
    -consumer-service

過(guò)濾器

zuul作為網(wǎng)關(guān)的其中一個(gè)重要功能狸演,就是實(shí)現(xiàn)請(qǐng)求的鑒權(quán)宵距。而這個(gè)動(dòng)作我們往往是通過(guò)Zuul提供的過(guò)濾器來(lái)實(shí)現(xiàn)的满哪。
filterType()//過(guò)濾器類型劝篷;filterOrder()//過(guò)濾器順序(數(shù)字越小優(yōu)先級(jí)越高)娇妓;shouldFilter()//要不要過(guò)濾哈恰;run()//過(guò)濾邏輯
過(guò)濾器執(zhí)行生命周期
正常流程:請(qǐng)求到達(dá)首先會(huì)經(jīng)過(guò)pre類型過(guò)濾器,而后到達(dá)routing類型蛔钙,進(jìn)行路由吁脱,請(qǐng)求就到達(dá)真正的服務(wù)提供者豫喧,執(zhí)行請(qǐng)求,返回結(jié)果后讲衫,會(huì)達(dá)到post過(guò)濾器涉兽,而后返回響應(yīng)枷畏。
異常流程:整個(gè)過(guò)程中拥诡,pre或routing過(guò)濾器出現(xiàn)異常氮发,都會(huì)直接進(jìn)入error過(guò)濾器渴肉,在error處理完畢后,會(huì)將請(qǐng)求交給post過(guò)濾器爽冕,最后返回給用戶仇祭;如果是error過(guò)濾器自己出現(xiàn)異常,最終也會(huì)進(jìn)入post過(guò)濾器颈畸,而后返回乌奇;如果是post過(guò)濾器出現(xiàn)異常,會(huì)跳轉(zhuǎn)到error過(guò)濾器眯娱,但是與pre和touting不同的是請(qǐng)求不會(huì)再到達(dá)post過(guò)濾器了。
自定義一個(gè)過(guò)濾器困乒,模擬登陸校驗(yàn)寂屏。基本邏輯:如果請(qǐng)求中有access-token參數(shù),則認(rèn)為請(qǐng)求有效迁霎,放行吱抚。

@Component//自動(dòng)加入到spring中
public class LoginFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {

        return FilterConstants.PRE_DECORATION_FILTER_ORDER-1;
    }

    @Override
    public boolean shouldFilter() {

        return true;
    }

    @Override
    public Object run() throws ZuulException {
        //獲取請(qǐng)求上下文
        RequestContext ctx = RequestContext.getCurrentContext();
       // 獲取request
        HttpServletRequest request = ctx.getRequest();
        //獲取請(qǐng)求參數(shù)access-token
        String token = request.getParameter("access-token");
        //判斷是否存在
        if(StringUtils.isBlank(token)){
            //不存在,未登錄考廉,則攔截
            ctx.setSendZuulResponse(false);
            //返回403
            ctx.setResponseStatusCode(HttpStatus.SC_FORBIDDEN);
        }

        return null;
    }
}

負(fù)載均衡和熔斷:
zuul中默認(rèn)就已經(jīng)集成了Ribbon負(fù)載均衡和Hystix熔斷機(jī)制秘豹,但是所有的超時(shí)策略都是走的默認(rèn)值,比如熔斷超時(shí)時(shí)間只有1s昌粤,很容易就觸發(fā)了既绕。因此建議手動(dòng)進(jìn)行配置:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000
ribbon:
  ConnectionTimeout: 500
  ReadTimeOut: 2000

ribbon的超時(shí)時(shí)長(zhǎng),真實(shí)值是(read+connect)*2涮坐,必須小于hystrix時(shí)長(zhǎng)凄贩。
zuul的高可用:
啟動(dòng)多個(gè)Zuul服務(wù),自動(dòng)注冊(cè)到Eureka袱讹,形成集群疲扎。如果是服務(wù)內(nèi)部訪問(wèn),你訪問(wèn)Zuul捷雕,自動(dòng)負(fù)載均衡椒丧,沒(méi)問(wèn)題。但是救巷,Zuul更多是外部訪問(wèn)壶熏,PC端愕宋、移動(dòng)端等翰意。他們無(wú)法通過(guò)Eureka進(jìn)行負(fù)載均衡,那么該怎么辦烂瘫?此時(shí)管怠,使用其他的服務(wù)網(wǎng)關(guān)淆衷,來(lái)對(duì)Zuul進(jìn)行代理,比如Nginx渤弛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甚带,隨后出現(xiàn)的幾起案子她肯,更是在濱河造成了極大的恐慌,老刑警劉巖鹰贵,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴氨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡碉输,警方通過(guò)查閱死者的電腦和手機(jī)籽前,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人枝哄,你說(shuō)我怎么就攤上這事肄梨。” “怎么了挠锥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵众羡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蓖租,道長(zhǎng)粱侣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任蓖宦,我火速辦了婚禮齐婴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘稠茂。我一直安慰自己柠偶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布主慰。 她就那樣靜靜地躺著嚣州,像睡著了一般。 火紅的嫁衣襯著肌膚如雪共螺。 梳的紋絲不亂的頭發(fā)上该肴,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音藐不,去河邊找鬼匀哄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雏蛮,可吹牛的內(nèi)容都是我干的涎嚼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼挑秉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼法梯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起犀概,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤立哑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后姻灶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體铛绰,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年产喉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捂掰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敢会。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖这嚣,靈堂內(nèi)的尸體忽然破棺而出鸥昏,到底是詐尸還是另有隱情,我是刑警寧澤疤苹,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布互广,位于F島的核電站,受9級(jí)特大地震影響卧土,放射性物質(zhì)發(fā)生泄漏惫皱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一尤莺、第九天 我趴在偏房一處隱蔽的房頂上張望旅敷。 院中可真熱鬧,春花似錦颤霎、人聲如沸媳谁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晴音。三九已至,卻和暖如春缔杉,著一層夾襖步出監(jiān)牢的瞬間锤躁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工或详, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留系羞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓霸琴,卻偏偏與公主長(zhǎng)得像椒振,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梧乘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • 一澎迎、簡(jiǎn)介 Eureka 是 Netflix 開(kāi)發(fā)的服務(wù)發(fā)現(xiàn)框架,本身是一個(gè)基于 REST 的服務(wù)选调,主要用于定位運(yùn)行...
    Gojo99閱讀 461評(píng)論 0 0
  • 服務(wù)治理之Spring Cloud Eureka 1.服務(wù)治理嗡善。可以說(shuō)是微服務(wù)架構(gòu)中最為核心和基礎(chǔ)的模塊学歧,主要用來(lái)...
    LUOERD閱讀 388評(píng)論 0 1
  • 內(nèi)部類的分類 內(nèi)部類,顧名思義就是在-個(gè)類的內(nèi)部聲明一個(gè)類。內(nèi)部類主要分為: ■靜態(tài)內(nèi)部類. ■匿名內(nèi)部類 ■成員...
    一見(jiàn)你就抱閱讀 184評(píng)論 0 0
  • 墻角的電線桿 嘰嘰喳喳三兩只的麻雀 嘲笑著窗下墊腳的男孩 空地的小秋千 天真無(wú)邪兩三對(duì)的孩童 隨風(fēng)揚(yáng)起驕傲的頭 街...
    喬霂之閱讀 241評(píng)論 0 4
  • 我是一個(gè)不容易被感動(dòng)的人各吨,但在讀關(guān)家良一的《跑步教我的王者風(fēng)范》時(shí)卻幾次淚濕眼眶枝笨,每一次都是在他堅(jiān)持的時(shí)候袁铐,在他反...
    勤行樂(lè)道閱讀 867評(píng)論 0 1