架构师启明_个人页

个人头像照片 架构师启明
个人头像照片
3
700
0

个人介绍

阿里云问答专家、阿里云认证云计算工程师、Java研发工程师

擅长的技术

  • Java
  • Linux
获得更多能力
通用技术能力:

阿里云技能认证

详细说明

暂无更多信息
  • 发表了文章 2018-11-30

    Java语言中的String、StringBuffer和StringBuilder三者的详细介绍

  • 发表了文章 2018-11-20

    【Java】【基本数据类型】数字字符串和数值型数据有什么区别?

  • 发表了文章 2018-11-06

    【云计算】入门级网站避免单点故障的云产品架构(适合Discu!论坛)

正在加载, 请稍后...
滑动查看更多
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]Linux系统java进程运行一段时间后内存升高

    然后使用以下的命令找到最耗内存的对象

      方法:jmap -histo:live 10765 | more      使用该命令后,会以表格的形式显示存活对象的信息,并按照所占内存大小排序,找到最耗内存的对象。
    
    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]我想知道 Java 关于引用那一块的知识

    “每种编程语言都有自己的数据处理方式。有些时候,程序员必须注意将要处理的数据是什么类型。你是直接操纵元素,还是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操作对象。所有这些在 Java 里都得到了简化,一切都被视为对象。因此,我们可采用一种统一的语法。尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“引用”(reference)。”  

    Person person;

    person = new Person("张三");

    在Java中new是用来在堆上创建对象用的,如果person是一个对象的话,那么第二行为何还要通过new来创建对象呢?由此可见,person并不是所创建的对象,是什么?上面的一段话说的很清楚,“操纵的标识符实际是指向一个对象的引用”,也就是说person是一个引用,是指向一个可以指向Person类的对象的引用。真正创建对象的语句是右边的new Person("张三"); 

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]想搭建一个Java版本控制库,是用Subversion好呢?还是用Git好?Git又有好多种版本,不知道怎么选择。

    SVN优缺点
    优点:
    1、 管理方便,逻辑明确,符合一般人思维习惯。
    2、 易于管理,集中式服务器更能保证安全性。
    3、 代码一致性非常高。
    4、 适合开发人数不多的项目开发。
    缺点:
    1、 服务器压力太大,数据库容量暴增。
    2、 如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。
    3、 不适合开源开发(开发人数非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。

    Git优缺点
    优点:
    1、适合分布式开发,强调个体。
    2、公共服务器压力和数据量都不会太大。
    3、速度快、灵活。
    4、任意两个开发者之间可以很容易的解决冲突。
    5、离线工作。
    缺点:
    1、学习周期相对而言比较长。
    2、不符合常规思维。
    3、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]Windows平台MySQL高可用方案

    (1)主从或主主半同步复制

    使用双节点数据库,搭建单向或者双向的半同步复制。在5.7以后的版本中,由于lossless replication、logical多线程复制等一些列新特性的引入,使得MySQL原生半同步复制更加可靠。

    (2)半同步复制优化

    半同步复制机制是可靠的。如果半同步复制一直是生效的,那么便可以认为数据是一致的。但是由于网络波动等一些客观原因,导致半同步复制发生超时而切换为异步复制,那么这时便不能保证数据的一致性。所以尽可能的保证半同步复制,便可提高数据的一致性。

    该方案同样使用双节点架构,但是在原有半同复制的基础上做了功能上的优化,使半同步复制的机制变得更加可靠。

    (3)高可用架构优化

    将双节点数据库扩展到多节点数据库,或者多节点数据库集群。可以根据自己的需要选择一主两从、一主多从或者多主多从的集群。

    由于半同步复制,存在接收到一个从机的成功应答即认为半同步复制成功的特性,所以多从半同步复制的可靠性要优于单从半同步复制的可靠性。并且多节点同时宕机的几率也要小于单节点宕机的几率,所以多节点架构在一定程度上可以认为高可用性是好于双节点架构。

    (4)共享存储

    共享存储实现了数据库服务器和存储设备的解耦,不同数据库之间的数据同步不再依赖于MySQL的原生复制功能,而是通过磁盘数据同步的手段,来保证数据的一致性。

    (5)分布式协议

    分布式协议可以很好解决数据一致性问题。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]如何判断一个单链表是否有环

    (1)快慢指针算法。
    (2)设两个工作指针p、q,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数是否和q一样。比如p从A走到D,用了4步,而q则用了14步。因而步数不等,出现矛盾,存在环。
    (3)在环的入口点出断开,从而转换为看两个链表是否有交点的问题。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]简述Hibernate常见优化策略

    ① 制定合理的缓存策略(二级缓存、查询缓存)。
    ② 采用合理的Session管理机制。
    ③ 尽量使用延迟加载特性。
    ④ 设定合理的批处理参数。
    ⑤ 如果可以,选用UUID作为主键生成器。
    ⑥ 如果可以,选用基于版本号的乐观锁替代悲观锁。
    ⑦ 在开发过程中, 开启hibernate.show_sql选项查看生成的SQL,从而了解底层的状况;开发完成后关闭此选项。
    ⑧ 考虑数据库本身的优化,合理的索引、恰当的数据分区策略等都会对持久层的性能带来可观的提升,但这些需要专业的DBA(数据库管理员)提供支持

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]Java函数式编程有什么特点和优势?

    帮助我们减少业务逻辑和代码的分歧。他允许我们在更高层次更自然的描述业务逻辑。让代码直接描述“你想做什么”,而不是“你想怎样去做”。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]NET转Java需要先了解Java的哪些框架?

    可以直接学习spring全家桶系列的,不过我还是建议您从最基础的基本数据类型开始学起,差不多了再接触框架,然后在深入框架原理。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]如何生成唯一序列号ID

    最简单粗暴的就是使用UUID,自己也可以使用时间戳加随机数之类的生成。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]你们公司内部使用什么Java框架?SSM?SSH?

    我们使用SSM框架

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]Java微服务框架都有哪些,目前比较流行的是哪一个?

    Java语言相关微服务框架

    1.Spring Boot

    Spring Boot的设计目的是简化新Spring应用初始搭建以及开发过程,2017年有64.4%的受访者决定使用Spring Boot,可以说是最受欢迎的微服务开发框架。利用Spring Boot开发的便捷度简化分布式系统基础设施的开发,比如像配置中心、注册、负载均衡等方面都可以做到一键启动和一键部署。

    2.Spring Cloud

    Spring Cloud是一个系列框架的合计,基于HTTP(s)的RETS服务构建服务体系,Spring Cloud能够帮助架构师构建一整套完整的微服务架构技术生态链。

    3.Dubbo

    Dubbo是由阿里巴巴开源的分布式服务化治理框架,通过RPC请求方式访问。Dubbo是在阿里巴巴的电商平台中逐渐探索演进所形成的,经历过复杂业务的高并发挑战,比Spring Cloud的开源时间还要早。目前阿里、京东、当当、携程、去哪等一些企业都在使用Dubbo。

    4.Dropwizard

    Dropwizard将Java生态系统中各个问题域里最好的组建集成于一身,能够快速打造一个Rest风格的后台,还可以整合Dropwizard核心以外的项目。国内现在使用Dropwizard还很少,资源也不多,但是与SpringBoot相比,Dropwizard在轻量化上更有优势,同时如果用过Spring,那么基本也会使用SpringBoot。

    5.Akka

    Akka是一个用Scala编写的库,可以用在有简化编写容错、高可伸缩性的Java和Scala的Actor模型,使用Akka能够实现微服务集群。

    6.Vert.x/ Lagom/ ReactiveX/Spring 5

    这四种框架主要用于响应式微服务开发,响应式本身和微服务没有关系,更多用于提升性能上,但是可以和微服务相结合,也可以提升性能。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]Java类里面的属性,一定要封装起来吗?

    这个不是必须的,封装是面向对象的一个基本特征,主要是对外隐藏具体的实现细节,根据实际情况自行调整,尽量对外暴露最少的属性与方法。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]对于java web项目的内网攻击,有没有什么要的应对策略?

    可以考虑使用白名单访问策略

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]java web 应用如何防止被暴力破解?

    可以引入阿里云的大数据风控机器识别组件,另外可以对IP请求频次进行限制。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]servlet生命周期及各个方法

    生命周期:

    加载和实例化Servlet

    我们来看一下Tomcat是如何加载的:

     1. 如果已配置自动装入选项,则在启动时自动载入。
    
     2. 在服务器启动时,客户机首次向Servlet发出请求。
    
     3. 重新装入Servlet时。
    
      当启动Servlet容器时,容器首先查找一个配置文件web.xml,这个文件中记录了可以提供服务的Servlet。每个Servlet被指定一个Servlet名,也就是这个Servlet实际对应的Java的完整class文件名。Servlet容器会为每个自动装入选项的Servlet创建一个实例。所以,每个Servlet类必须有一个公共的无参数的构造器。
    

    初始化

      当Servlet被实例化后,Servlet容器将调用每个Servlet的init方法来实例化每个实例,执行完init方法之后,Servlet处于“已初始化”状态。所以说,一旦Servlet被实例化,那么必将调用init方法。通过Servlet在启动后不立即初始化,而是收到请求后进行。在web.xml文件中用<load-on-statup> ...... </load-on-statup>对Servlet进行预先初始化。
    
      初始化失败后,执行init()方法抛出ServletException异常,Servlet对象将会被垃圾回收器回收,当客户端第一次访问服务器时加载Servlet实现类,创建对象并执行初始化方法。
    

    请求处理

      Servlet 被初始化以后,就处于能响应请求的就绪状态。每个对Servlet 的请求由一个Servlet Request 对象代表。Servlet 给客户端的响应由一个Servlet Response对象代表。对于到达客户机的请求,服务器创建特定于请求的一个“请求”对象和一个“响应”对象。调用service方法,这个方法可以调用其他方法来处理请求。
    
      Service方法会在服务器被访问时调用,Servlet对象的生命周期中service方法可能被多次调用,由于web-server启动后,服务器中公开的部分资源将处于网络中,当网络中的不同主机(客户端)并发访问服务器中的同一资源,服务器将开设多个线程处理不同的请求,多线程同时处理同一对象时,有可能出现数据并发访问的错误。
    
      另外注意,多线程难免同时处理同一变量时(如:对同一文件进行写操作),且有读写操作时,必须考虑是否加上同步,同步添加时,不要添加范围过大,有可能使程序变为纯粹的单线程,大大削弱了系统性能;只需要做到多个线程安全的访问相同的对象就可以了。
    

    卸载Servlet

      当服务器不再需要Servlet实例或重新装入时,会调用destroy方法,使用这个方法,Servlet可以释放掉所有在init方法申请的资源。一个Servlet实例一旦终止,就不允许再次被调用,只能等待被卸载。
    
      Servlet一旦终止,Servlet实例即可被垃圾回收,处于“卸载”状态,如果Servlet容器被关闭,Servlet也会被卸载,一个Servlet实例只能初始化一次,但可以创建多个相同的Servlet实例。如相同的Servlet可以在根据不同的配置参数连接不同的数据库时创建多个实例。
    

    各个方法:

    1. init()方法

        在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init();
      
    2. service()方法

        它是Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
      
    3. destroy()方法

        仅执行一次,在服务器端停止且卸载Servlet时执行该方法,有点类似于C++的delete方法。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
      
       下面来谈谈Servlet的生命周期,Servlet的生命周期是由Servlet容器来控制的,它始于装入Web服务器的内存时,并在终止或重新装入Servlet时结束。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet。
      
       在代码中,Servlet生命周期由接口javax.servlet.Servlet定义。所有的Java Servlet 必须直接或间接地实现javax.servlet.Servlet接口,这样才能在Servlet Engine上运行。javax.servlet.Servlet接口定义了一些方法,在Servlet 的生命周期中,这些方法会在特定时间按照一定的顺序被调用。
    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]JVM的最大内存和最小内存设置多大合适?

    ◆堆内存分配

    JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。

    ◆非堆内存分配

    JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

    ◆JVM最大内存

    首先JVM内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]有没有专门介绍Java数据结构和算法的书籍或技术文章?

    可以去看看:《Java编程思想》《Java数据结构和算法》

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]在云上搭建的Java Web项目建议使用自建数据库还是云数据库云数据库主要是有点贵。

    我建议是使用云数据库,自建数据库资源利用率低,运维成本高,安全性和稳定性较差。云数据库高度优化,资源利用率高,安全稳定。如果数据库表结构对存储引擎有特殊要求就需要自建数据库了,比如云数据库是禁了myisam存储引擎的。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]Springmvc与Struts区别

    一、框架机制

    spring mvc 和 struts2的加载机制不同:spring mvc的入口是servlet,而struts2是filter。

    1、Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。

    2、Filter在容器启动之后即初始化;服务停止以后销毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

    二、拦截机制

    1、Struts2

    a、Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter吧request数据注入到属性。

    b、Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。

    c、Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了

    2、SpringMVC

    a、SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。

    b、在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

    三、性能方面

    SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2。

    四、拦截机制

    Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。

    五、配置方面

    spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。
    SpringMVC可以认为已经100%零配置。

    六、设计思想

    Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

    七、集成方面

    SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

    踩0 评论0
  • 回答了问题 2019-07-17

    [@小川游鱼][¥20]如何理解分布式锁

    是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。

    踩0 评论0
正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息