1. 程式人生 > >spring cloud學習筆記4(請求合併處理)

spring cloud學習筆記4(請求合併處理)

微服務架構中的依賴通過遠端呼叫實現,而遠端呼叫中最常見的問題就是通訊消耗與連線數佔用。在高併發的情況下,因通訊次數的增加,總的通訊時間消耗將會變得不那麼理想。同時,因為依賴服務的執行緒池資源有限,將出現排隊等待與相應延遲的情況,為了優化這個兩個問題,Hystrix提供啦HystrixCollapser來實現請求的合併,以減少通訊消耗和執行緒數的佔用。

 HystrixCollapser實現了在HystrixCommand之前放置一個合併處理器,將處於一個很短的時間窗(預設10毫秒)內對同一依賴服務

多個請求合併處理。

修改eureka-consume中pom檔案,新增依賴

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.29</version>
        </dependency>
建立user類
package com.study.cloud.consumer.services;

import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private long id;
    private String name;
    private String address;

    public User(){

    }
    public User(String name, String address,long id) {
        this.name = name;
        this.id = id;
        this.address = address;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
建立userservice
package com.study.cloud.consumer.controllers;

import com.study.cloud.consumer.services.User;
import com.study.cloud.consumer.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
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;

@RestController
public class UserController {


    @Autowired
    private UserService userService;


    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public User finduser(@RequestParam(name = "id") Long id){
        System.out.println("id:"+id);
        return userService.find(id);
    }
}
增加usercontroller
package com.study.cloud.consumer.controllers;

import com.study.cloud.consumer.services.User;
import com.study.cloud.consumer.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
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;

@RestController
public class UserController {


    @Autowired
    private UserService userService;


    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public User finduser(@RequestParam(name = "id") Long id){
        System.out.println("id:"+id);
        return userService.find(id);
    }
}
在HI-SERVICE增加user
package com.study.cloud.client.controllers;

import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private long id;
    private String name;
    private String address;

    public User(){

    }
    public User(String name, String address,long id) {
        this.name = name;
        this.id = id;
        this.address = address;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

修改controller
package com.study.cloud.client.controllers;

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

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@RestController
public class HelloController {

    private List<User> users = new ArrayList<>();

    {
        users.add(new User("caohui1", "caohui1", 1L));
        users.add(new User("caohui2", "caohui2", 2L));
        users.add(new User("caohui3", "caohui3", 3L));
        users.add(new User("caohui4", "caohui4", 4L));
        users.add(new User("caohui5", "caohui5", 5L));
        users.add(new User("caohui6", "caohui6", 6L));
    }

    @Autowired
    private DiscoveryClient client;

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String sayHi(@RequestParam(value = "name") String name) {
        String host = client.getLocalServiceInstance().getHost();
        String serviceId = client.getLocalServiceInstance().getServiceId();
        int port = client.getLocalServiceInstance().getPort();
        return serviceId + ",host:" + host + ",port:" + port + " say hello " + name;
    }


    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public List<User> users(@RequestParam(value = "ids") String ids) {
        System.out.println("ids:" + ids);
        List<User> collect = users.parallelStream().filter((item) -> ids.contains(String.valueOf(item.getId()))).collect(Collectors.toList());
        System.out.println("collect:" + collect);
        return collect;
    }

}

重新啟動

呼叫 http://localhost:9002/user?id=1,出現如下則表示成功


相關推薦

spring cloud學習筆記4(請求合併處理)

微服務架構中的依賴通過遠端呼叫實現,而遠端呼叫中最常見的問題就是通訊消耗與連線數佔用。在高併發的情況下,因通訊次數的增加,總的通訊時間消耗將會變得不那麼理想。同時,因為依賴服務的執行緒池資源有限,將出現排隊等待與相應延遲的情況,為了優化這個兩個問題,Hystrix提供啦Hy

Spring Cloud學習筆記5——天氣預報系統(4)為天氣預報製作

開發環境 JDK8+ Gradle4+ Redis 3.2.100 Apache HttpClient 4.5.3 Spring Boot Web Starter Spring Boot Data Redis Starter Spring Boot Quart

spring框架學習筆記4:SpringAOP實現原理

odin 就是 sets 使用 point 攔截 ceo oca ssl AOP AOP(Aspect Oriented Programming),即面向切面編程,可以說是OOP(Object Oriented Programming,面向對象編程)的補充和完善。OOP引入

Spring Cloud學習筆記 【篇一:分布式配置中心 Spring Colud Config】

16px gin war imp web項目 tps conf name request 一、簡介 Spring Cloud Config提供了在分布式系統的外部配置的客戶端支持。通過配置服務(Config Server)來為所有的環境和應用提供外部配置的集中管理。這些概念

Spring Cloud學習筆記-003

開發 spring pre 學習筆記 bubuko lse 參數 穩定 觸發 Spring Cloud學習筆記-003 服務提供者:向註冊中心註冊服務 1. 新建maven工程,骨架選擇quickstart,工程名稱:demo-member 2. 加入相關依賴

Spring Cloud學習筆記-004

服務 微服務架構 裏的 url 文件 啟動 spa 實現 ron 高可用註冊中心   在微服務架構這樣的分布式環境中,需要充分考慮發生故障的情況,所以在生產環境中必須對各個組件進行高可用部署,對於微服務如此,對於服務註冊中心也一樣。如果一直使用單節點的服務註冊中心

Spring Cloud學習筆記-007

通過 cati tar source 復雜 members quest 項目 ati 聲明式服務調用:Spring Cloud Feign   Feign基於Netflix Feign實現,整合了Spring Cloud Ribbon和Spring Cloud H

Spring Cloud學習筆記-011

設備 配置文件 enable 環境 共享 app 啟用 .config localhost 分布式配置中心:安全保護   由於配置中心存儲的內容比較敏感,做一定的安全處理是必需的。為配置中心實現安全保護的方式有很多,比如物理網絡限制、OAuth2授權等。由於微服務

Spring Cloud學習筆記-012

目錄 註冊中心 image yml 接口 面向 基礎 collect 16px 分布式服務跟蹤:Spring Cloud Sleuth   隨著業務的發展,系統規模也會變得越來越大,各微服務間的調用關系也變得越來越錯綜復雜。通常一個由客戶端發起的請求在後端系統中會

Spring Cloud學習筆記之Eureka Server註冊中心

Eureka Server提供服務註冊服務,各個節點啟動後,會在Eureka Server中進行註冊,這樣EurekaServer中的服務登錄檔中將會儲存所有可用服務節點的資訊,服務節點的資訊可以在介面中直觀的看到。我們簡單實現一下Eureka Server。 1.新建一個Maven專案

Spring Cloud學習筆記之Eureka框架的原理

Eureka 服務發現與註冊:我們在呼叫微服務的時候,如果我們的微服務部署了多份,我們應該如何去呼叫?這裡就涉及到了服務發現與註冊。服務發現就是程式如何通過一個標誌來獲取服務列表,並且這個服務列表是能夠隨著服務的狀態而動態變更的。 Spring Cloud提供了多種註冊中心的支援:如Eur

Spring Cloud學習筆記之微服務實現(一)(Spring Boot+IDEA)

我們先使用Spring Boot實現一個微服務,業務非常簡單: 1.商品微服務,通過商品id查詢商品的微服務 2.訂單微服務,通過訂單id查詢訂單資料,同時需要呼叫商品微服務查詢出訂單詳情資料對應的商品資料。 說明: 1.對於商品微服務而言,商品微服務是服務的提供者,訂單微服務是服務的消費

Spring Cloud學習筆記之微服務實現(二)(Spring Boot+Spring Cloud+IDEA)

在【Spring Cloud學習筆記之微服務實現(一)】中,我們實現了微服務,但是在實際的專案中,我們需要實現動態訪問微服務,在此之前,已經介紹了Spring Cloud和Eureka,並且實現了eureka註冊中心。現在我們實現一下動態呼叫。 注:註冊中心的服務在此期間保持啟動狀態。

Spring Cloud學習筆記25——自動擴充套件

垂直擴充套件 水平擴充套件 自我註冊和自我發現 服務登錄檔 客戶端 微服務例項 按需擴充套件 自動擴充套件的意義 好處: 提高了高可用性和容錯能力 增加了可伸縮性 具有最佳使用率,並節約成本

Spring Cloud學習筆記24——天氣預報系統微服務實現熔斷機制

建立專案 以之前的msa-weather-report-eureka-feign-gateway為藍本,建立msa-weather-report-eureka-feign-gateway-hystrix專案 修改build.gradle配置,新增Hystrix依賴: //依賴關係

Spring Cloud學習筆記19——如何整合 Zuul

Zuul的功能 整合Zuul 開發環境 JDK8+ Gradle4+ Redis 3.2.100 Spring Boot 2.0.0.M3 Spring Cloud Starter Netflix Eureka Client Finchley

Spring Cloud學習筆記18——API 閘道器

API 閘道器是一套主要用於統一API入口的應用元件,可以管理所有的API,形成一個API的入口 API閘道器的意義 集合多個API 統一API入口 API閘道器所帶來的好處 避免將內部資訊洩露給外部 為微服務新增額外的安全層 支

Spring Cloud學習筆記17——天氣預報系統微服務使用 Feign

回顧遺留的三個TODO 資料採集微服務在天氣資料同步任務中,依賴於城市資料API微服務 天氣預報微服務查詢天氣資訊,依賴於天氣資料API微服務 天氣預報微服務提供的城市列表,依賴於城市資料API微服務 天氣預報系統微服務使用Feign msa-we

Spring Cloud學習筆記16——微服務的消費

微服務的消費模式 基於http的客戶端經常被用作微服務的消費者,因為http本身是平臺無關的、語言無關的,所以基於http的客戶端往往會被廣大的社群支援 服務直連模式 特點: 簡潔明瞭,只要傳入一個URL,就能直接連過去,獲取到資源 平臺語言無關性,非常直白,不

spring cloud學習筆記(3)-- ribbon和feign

1.ribbon客戶端負載均衡介紹及基本使用 負載均衡想必都是比較清除的,在伺服器端的負載均衡主要是通過Nginx實現: 那麼客戶端的負載均衡呢 Ribbon是一個實現了客戶端負載均衡的元件,Netflix開源的,其主要功能是提供客戶端側負載均衡 Ribbon客戶