zoukankan      html  css  js  c++  java
  • 一次简单的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真的是十分吃配置,扛不住!!!

  • 相关阅读:
    仙人球的残影
    Calculate the formula
    自定义代码段
    getter-setter方法练习
    封装
    Xcode文档安装
    Xcode模板修改
    匿名对象
    OC多文件开发介绍
    #pragma mark指令
  • 原文地址:https://www.cnblogs.com/jaxlove-it/p/9274210.html
Copyright © 2011-2022 走看看