一次簡單的springboot+dubbo+flume+kafka+storm+redis系統


最近無事學習一下,用springboot+dubbo+flume+kafka+storm+redis做了一個簡單的scenic系統

scenicweb:展現層,springboot+dubbo

scenicservice:業務層(向展現層提供數據),dubbo+redis

scenic:數據統計,kafka+storm+redis統計數據

服務器:2台

  192.168.252.110

  1. genLog.sh(產生日志)

  2. flume-1(收集日志,sinkkafka192.168.252.110:9090,192.168.252.111:9090

  3. zookeeper-1-2-3(192.168.252.110:2181,192.168.252.110:2182,192.168.252.110:2183)

  4. kafka-1(192.168.252.110:9090)

  5. redis集群(192.168.252.110:7000,192.168.252.110:7001,192.168.252.110:7002,192.168.252.110:7003,192.168.252.110:7004,192.168.252.110:7005)

  192.168.252.111

 

  1. kafka-1(192.168.252.111:9090)
  2. storm-1(storm只啟動了一個,因為虛擬機真的扛不住)

 

 

1、scenicweb(springboot+dubbo)

  之所以用springboot,是因為覺得每次學習時需要搭建一個系統太麻煩,想學一個簡單的搭建系統的方法,於是此處就用了springboot。

  springboot的核心思想是無XML配置,大部門配置都采用系統的默認配置,這便大大減少了搭建系統步驟。

  • pom.xml

    pom.xml需要引入一個parent,后面,根據自己的需要,導入相應的spring-boot-starter-xx,如web系統只需要引入一個

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

 

  spring-boot-starter-xx里則包含web系統需要的一些jar包,這些jar都有他的默認版本,你可以在properties里修改你想改動的版本。

  • 啟動

    springboot的啟動方法可以放在main函數里執行

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

  springboot的默認掃描Application所在類的同級目錄以及它的子目錄,所以Application類一般放在項目包含所有需要掃描的目錄下。

  • 配置

    springboot的配置文件默認放在resource下application.properties或application.yml,springboot啟動時會自動掃描,這里你可以修改一些默認配置,配置自己的屬性。

  • 無xml配置

    @Configuration 標注該類是一個配置類.類似於我們定義的 applicationContext.xml
    @Bean 類似於我們在之前的 spring 配置文件中配置的<bean id=”” class=””/>

  • 自動化部署

    springboot入庫類上的@SpringBootApplication是springboot的核心注解,他是一個組合注解,包含了@SpringBootConfiguration,類似@Configuration,springboot推薦使用@SpringBootConfiguration。@EnableAutoConfiguration,啟動自動配置。@ComponentScan,默認掃描Application所在類的同級目錄以及它的子目錄

  

2、scenicservice(dubbo+redis)

  dubbo官網已更新,想系統學習的可以移步:http://dubbo.apache.org/#/docs/user/quick-start.md?lang=zh-cn,這里簡單說幾點吧

  • dubbo配置的優先級

    方法級優先,接口次之,全局配置再次之。如果級別一樣,消費者優先,提供方次之

  • dubbo屬性配置

     dubbo可以通過jvm,xml,已經dubbo.properties配置(dubbo會自動加載classpath下的dubbo.properties)。

    覆蓋策略:jvm>xml>properties

  • 集群容錯

    failover(失敗切換其他服務器自動重試,默認重試2次),failfast(快速失敗,失敗后不會重試,通常用於新增等非冪等性操作),failsafe(失敗安全,失敗后直接忽略),failback(失敗后自動恢復,定時重發,通常用於失敗通知)等等

  • 負載均衡

    random等。。。配置負載均衡策略時字母必須都小寫,可配置

  • 服務端線程池

    如果事件處理很快,並且不會發生新的io請求,則直接在io線程上處理更快,減少線程池調度

    如果事件處理很慢,或者需要重新發起io情況,如數據庫查詢,必須派發到線程池,否則io線程阻塞,將導致不能接收其他請求

    如果用 IO 線程處理事件,又在事件處理過程中發起新的 IO 請求,比如在連接事件中發起登錄請求,會報“可能引發死鎖”異常,但不會真死鎖。

<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />

    dispatcher:all(全部請求都派發到線程池,包括請求、響應、連接事件、斷開事件、心跳等),direct(所有時間都不派發都線程池)等

    threadpool:fixed(固定大小線程池)、cached(可緩存線程池,空閑1分鍾刪除)、limited(可伸縮線程池,但線程池只增不漲,避免收縮時突然來了大流量引起性能問題)等

  • dubbo多協議

    不能服務適合不同協議,如大數據適合短協議,小數據適合長協議

  •  結果緩存

    lru(最近最少使用原則)等

  • mock容錯

     本地偽裝通常用於服務降級,當服務方服務關掉后,客戶端不拋出異常,而是返回自定義信息

  •  並發控制

    可以通過設置限制服務端並發執行數:executes="10"

    同理,可限制客戶端並發數:actives="10"

  除了上述配置相關屬性外,dubbo還可以通過SPI,自定義配置策略,具體看參照官網

  

  本次項目再調用redis時發現一個問題,當集群發生故障導致主從發生變化時,redis會報JedisMovedDataException,當前解決的辦法是通過JedisSlotBasedConnectionHandler的renewSlotCache()方法來刷新連接。工具類也沒寫好,也沒想到更好的方法,以后再完善吧

 

3、scenic(kafka+storm+redis)

  kafka整合storm,將數據分析結果保存到redis中,好像也沒啥好寫的

 

4、linux

  通過genLog.sh隨機產生日志,再通過flume將日志發送到kafka中。scenic項目將kafka接受的日志進行解析計算,最后將計算結果保存到redis中。

redis采用一用一備,3台主服務器,3台備服務器。redis調用少時沒感覺,當調用頻率變高時,redis主從服務器會切換角色,不知道是不是主redis沒抗住壓力down了,然后從服務器重新選舉上的。

  這里不得不說,storm真的是十分吃配置,扛不住!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM