天气变化无常的一周---4.10周技术小结(一)

说实话,之前做完第一次技术周小结之后,由于时间,个人拖延等问题,一直没有坚持下去写。上周又想到了这个事情,回想了一下自己当时为什么要做这个周小结,感觉自己当初的出发点就是每周都能接触,了解,学到很多新的,或者之前知道但不太了解的东西,平时稍微做点记录,然后每周周末的时候再花一点时间整理一下,就感觉这周比较有成就感。但是,没坚持下去。

最近在工作中,发现每天都会接触很多不太了解的东西,之前都是记在笔记本上,但是感觉很庞杂,而且也都只是当时自己的随笔,不是很系统,而且感觉一直放在笔记本里也不太好。所以,我又想起了自己之前的这个周小结,回顾之前的做法,现在愈发感觉要坚持下去了!

好了,废话不多说,直接上内容。
目录:

1.高并发设计的几点思路(High Concurrence Architecture Design)
2.高性能的优化(High Performance Optimizing)
3.邮件系统的架构和相关协议
4.分布式系统初探
5.Spring 异常处理办法
6.认识的一些 "新的伙伴"

1.高并发设计的几点思路

对于高并发设计的切入点,看了很多文章,总结了一些目前主流的一些做法,其中主要包括对服务器端数据库缓存静态资源的设计。

  • 服务器端
  • 引入负载均衡,比如利用nginx充当负载均衡器,使用阿里云SLB服务
  • 对资源进行监控
  • 采用分布式的架构,缓解单机访问压力,提高并发量
  • 数据库
    • 主从分离
    • 建立数据库集群
    • 建立分布式的数据库架构
    • 表优化、索引优化
  • 缓存
    • 利用redis,memcached,mongodb等NOSQL数据库,同时要做到主从分离,集群部署

参考文章:
大话程序猿眼里的高并发
大话程序猿眼里的高并发架构

2.高性能的优化

我自己对于高性能的简单理解就是,服务器的响应速度很快。(这里可能理解的过于简单,如果有什么问题,希望大家能给我指出来,我也要再学习下)。
那么该怎么做呢?

  • 代码优化
  • JVM调优
  • 数据库优化,包括sql语句,连接池,采用NOSQL数据库,读写分离,水平和垂直分库分表
  • 利用缓存,比如本地缓存HashMap,Ehcache,缓存服务Redis/Tair/Memcache
  • 架构上的调优,比如负载均衡,分布式系统
  • 采用异步请求机制
  • 度量、监控系统 提供间接帮助来优化系统。

仔细对比一下1和2的总结,可以看到有很多重合的解决办法,所以说,其实高并发也属于高性能的一个指标。

参考文章:
美团点评-常见性能优化策略的总结

3.邮件系统的架构和相关协议

邮件系统涉及的参与者:

  • 用户代理
  • 邮件服务器

涉及的协议

  • POP3
    Post Office Protocol 3 它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
  • SMTP
    Simple Mail Transfer Protocol 是一种提供可靠且有效电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。
  • IMAP
    Internet Mail Access Protocol(交互式邮件存取协议)IMAP是斯坦福大学在1986年开发的研发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。
    其特点是:
    1.用户可以维护自己在服务器上的邮件目录;可以直接抓取邮件的特定部分
    2.IMAP它只下载邮件的主题,并不是把所有的邮件内容都下载下来,而是你邮箱当中还保留着邮件的副本,没有把你原邮箱中的邮件删除。

4.分布式系统初探

1.分布式系统的特点:

  • 可扩展性

    企业级应用需求经常随时间而不断变化,企业级应用平台必须要能适应需求的变化,即具有可扩展性。

  • 性能制约:内部网络通讯开销

    所以分布式系统每个节点一般不采用高性能的服务器,而是性能相对一般的普通PC服务器。提升分布式系统的整体性能是要通过横向扩展(增加更多的服务器),而不是纵向扩展(提升每个节点的服务器性能)。

  • 廉价高效

  • 能够企业应用服务层面的弹性扩展

    应用服务层面的弹性扩展是相对计算资源层面的弹性扩展而言的。一般公有云服务(IaaS)厂商都会提供计算资源层面的弹性扩展,比如可以很方便地增加或删除虚拟主机、提升或降低虚拟主机的性能配置等等。但是企业客户真正需要的是应用服务层面的弹性扩展,即随着业务量的涨落,后台应用服务的实例能动态变化,这是IaaS厂商还做不到的。比如,某移动互联网短视频分享应用,在晚间11点到凌晨1点是访问高峰,同时在线人数高达几十万,这时后台应用服务要扩张到数千个实例才能应付这么高并发的访问请求;过了高峰时段,后台应用服务可以收缩到几十个实例。有了分布式系统,就可以很方便地调度应用服务实例,从几十个到几百个甚至上千个,真正实现应用服务的弹性扩展。

2.设计理念:

  • 分布式系统对服务器硬件要求很低

  • 分布式系统强调横向可扩展性

  • 分布式系统不允许单点失效

  • 分布式系统尽可能减少节点间通讯开销(Hadoop MapReduce)

  • 分布式系统应用服务最好做成无状态的(Redis/Memcache)

    把应用服务设计成无状态的,让程序把需要保存的数据都保存在专门的存储上,这样应用服务程序可以任意重启而不丢失数据,方便分布式系统在服务器宕机后恢复应用服务。

参考文章:
分布式系统的特点以及设计理念

5.Spring 异常处理办法

1.局部异常处理:

  • Annotation:@ExceptionHandler

2.全局异常处理:

  • web.xml and Application.xml Configuration
  • @ControllerAdvice
  • SimpleMappingExceptionResolver
  • Interface:HandlerExceptionResolver

2.1 Web.xml and Application.xml Configuration
In Web.xml:

<error-page>
    <error-code>404</error-code>
    <location>/404</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/500</location>
</error-page>

<!-- 未捕获的错误,同样可指定其它异常类,或自定义异常类 -->
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/uncaughtException</location>
</error-page>

In Application.xml:

<!-- 错误路径和错误页面,注意指定viewResolver -->
<mvc:view-controller path="/404" view-name="404"/>
<mvc:view-controller path="/500" view-name="500"/>
<mvc:view-controller path="/uncaughtException" view-name="uncaughtException"/>

2.2 @ControllerAdvice
从注解名字上来看,其负责对所有的Controller进行增强,具体增强的逻辑在其方法中实现。那么对于异常处理,其实就是对Controller的一种增强逻辑,具体做法如下:

@ControllerAdvice
public class ControllerAdvice {
    @ExceptionHandler(NullPointerException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public String handleIOException(NullPointerException ex) {
        return ClassUtils.getShortName(ex.getClass()) + ex.getMessage();
    }
}

首先类ControllerAdvice有一个类注解@ControllerAdvice表示该类是对所有的Controller的增强,具体的增强逻辑在其方法handleIOException中实现,同时在该方法上有一个最开始提到过的注解@ExceptionHandler,表示该方法要对相应的异常进行捕获,然后处理。

同时,注解@ResponseStatus经常和@ExceptionHandler共同使用,表示要返回的status。

2.3 Class: SimpleMappingExceptionResolver

该类SimpleMappingExceptionResolvers是Spring MVC提供的一个异常处理实现类。其常见用法如下:

基于传统xml配置的:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!-- 默认错误页面,就是不在exceptionMappings指定范围内 -->
    <property name="defaultErrorView" value="uncaughtException" />
    <property name="exceptionMappings">
        <props>
            <!-- 异常类名,可以是全路径,错误页面或Controller路径! -->
            <prop key="NullPointerException">NullPointerException</prop>
            <prop key="java.io.IOException">IOException</prop>
        </props>
    </property>
</bean>

基于 Hard Code的:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.balbala.mvc.web"})
public class WebMVCConfig extends WebMvcConfigurerAdapter{
  @Bean
    public SimpleMappingExceptionResolver simpleMappingExceptionResolver()
    {
        SimpleMappingExceptionResolver b = new SimpleMappingExceptionResolver();
        Properties mappings = new Properties();
        mappings.put("org.springframework.web.servlet.PageNotFound", "page-404");
        mappings.put("org.springframework.dao.DataAccessException", "data-access");
        mappings.put("org.springframework.transaction.TransactionException", "transaction-Failure");
        b.setExceptionMappings(mappings);
        return b;
    }
}

从上边的使用上可以窥探到,该类内部是封装了一个Map对象,该对象存储、维护着异常类型与view之间的对应关系,Spring会抛出异常之后,会根据该类的Map对象维护的映射关系来选择返回的View。

2.4 Interface: HandlerExceptionResolver

用法如下:

public class CustomHandlerExceptionResolver implements HandlerExceptionResolver{

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("e", e);
        //这里可根据不同异常引起类做不同处理方式,本例做不同返回页面。
        String viewName = ClassUtils.getShortName(e.getClass());
        return new ModelAndView(viewName, model);
    }
}

实现该接口,并将其实现类注册为一个Bean放入到Spring IOC中,接着出现异常就会走这个实现方法。

参考文章:
Spring-MVC开发之全局异常捕获全面解读
Exception Handling in Spring MVC
[Spring Exception Demo](spring-mvc-exception demo:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc)

认识的一些 "新的伙伴"

1.Mysql Route: lightweight middleware
2.敏捷项目开发工具:redMine,gitlab,Jira,MantisHub

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,778评论 6 342
  • 分布式系统面临的第一个问题就是数据分布,即将数据均匀地分布到多个存储节点。另外,为了保证可靠性和可用性,需要将数据...
    olostin阅读 4,561评论 2 26
  • 晚上去慢茶喝了杯咖啡,所以现在没有困意,能把饮品店做成今天的样子,也真的是很成功。她喜欢里面的大鱼缸,所以每次我们...
    小红豆阅读 405评论 0 3
  • 2017年4月2日 手机里循环播放着这首歌《这个年纪》 “这个年纪的我们 徘徊在理想与现实之中 这个年纪我已不再将...
    奔跑的小青桔阅读 846评论 0 2