Fork me on GitHub
雨正来【一路奔跑的人】


  • 首页

  • 归档

  • 分类

  • 标签

  • top

  • 关于

  • 搜索

软件工程认知

发表于 2019-04-29 | 分类于 编程 | | 阅读次数:
| 字数统计: 1.4k

软件工程学习【Everything is a project】

记录极客时间学习要点

  • 想法: 想法阶段通常是想要解决问题。最开始问题通常是模糊的,所以需要清晰地定义 好问题,研究其可行性,检查是否有可行的解决方案
  • 概念: 概念阶段就是用图纸、草图、模型等方式,提出一些概念性的解决方案。这些方 案可能有多个,最终会确定一个解决方案
  • 计划:计划阶段是关于如何实施的计划,通常会包含人员、任务、任务持续时间、任务 的依赖关系,以及完成项目所需要的预算。
  • 设计:设计阶段就是要针对产品需求,将解决方案进一步细化,设计整体架构和划分功 能模块,作为分工合作和开发实施的一个依据和参考。
  • 开发:开发阶段就是根据设计方案,将解决方案构建实施。开发阶段通常是一个迭代的 过程,这个阶段通常会有构建、测试、调试和重新设计的迭代
  • 部署:将最终结果包括文档发布。

    什么是工程方法?

    有目的、有计划、有步骤的解决问题的方法就是工程方法。

    #瀑布模型及软件周期
  1. 用户需求文档&可行性分析
  2. 需求分析文档
  3. 架构设计文档【系统架构文档,数据库文档】
  4. 软件开发
  5. 测试报告
  6. 运行说明和维护
    需求、设计、编码、测试 无论是瀑布模型还是其他的scrum 模型 都归根结底离不开这四个核心环节。
阅读全文 »

分布式事务的理念

发表于 2019-04-28 | 分类于 编程 | | 阅读次数:
| 字数统计: 800

分布式事务的理念

  • 单体应用中的事务ACID
  • 微服务中的分布式事务
    • CAP理论 和 BASE理论

      依据 CAP 理论,必须在可用性(availability)和一致性(consistency)之间做出选择。如果选择提供一致性需要付出在满足一致性之前阻塞其他并发访问的代价。这可能持续一个不确定的时间,尤其是在系统已经表现出高延迟时或者网络故障导致失去连接时。

    • BASE 理论 ?
      因为在微服务的架构中,不像单体应用哪样很容易就实现并且已经成熟,微服务中可能才用的都不是同类型的数据库,一般都是关系型数据库+ nosql 数据库 甚至有些图数据库、ES 等等。在这种情况下必然2PC的方案不能满足,因为XA条件限制。
      2PC方案 ,分为准备提交+ 准备回滚2个分段。
      ###最佳实践微服务中采用最终一致性的方案
  • 可靠事件模式
    举一个例子,客户下单,产出一个待支付订单,发送消息到mq ,支付服务进行消费订单服务,发送消息到mq 支付成功,订单服务消费 更新支付状态。
    在这个例子中,请分析数据不一致的存在点,一个就是订单服务更新DB后,没有发送消息到mq。另外一点就是发送了多次的消息,支付服务如果进行处理,处理多次会导致数据不一致。
    其中2点需要特别注意,保证消息投递的可靠性和避免重复消费,前者可以依靠mq本身特性,后者在业务中进行去重处理,保证幂等性。
  • 业务补偿模式
    补偿模式使用一个额外的协调服务来协调各个需要保证一致性的微服务,协调服务按顺序调用各个微服务,如果某个微服务调用异常(包括业务异常和技术异常)就取消之前所有已经调用成功的微服务。
  • 业务异常
    • 请在前置进行处理,能在validate 的情况下请避免。
  • 技术异常
    • 网络异常,非业务逻辑异常
      补偿模式其实很繁琐,以为业务的调用链有时候过长,或者涉及到多个微服务,A-B-C-D 如果D 异常,需要在D当中处理反向的业务流程,也要保证最后的一致性问题。
  • TCC 模式
    分成3个阶段,try 、commit、cancel 需要一个事务协调器,事务协调者也需要保证高可用,第一个阶段 发起事务到协调者,协调者 分别调用 其他服务进行锁定资源阶段,如果成功执行2阶段,如果失败业务失败。
    第二阶段 根据第一阶段的结果,进行提交第一阶段锁定的资源或者进行回滚的操作。这个过程可能网络原因也会产生失败,要有一定的重试机制,幂等操作。

springboot的自动化配置

发表于 2019-04-17 | 分类于 编程 | | 阅读次数:
| 字数统计: 310

#springboot 如何实现自动化配置
你肯定常常使用@EnableAutoConfiguration 这个注解,你可能会说没有啊?那么细心的你会发现
@SpringbootApplication 中有这上边的这个注解。
其实底层是AutoConfigerationImportSlector 这个类去实现的
META-INF/spring.factories

其实springboot 都是拿一些条件注解去编程进行实现

@Conditional
@ConditionalOnClass
@ConditionalOnBean
@ConditionalOnMissingBean
@ConditionalOnProperty

Tips :
如果想观察那些类自动配置或者排除掉了,可以在run param 配置 –debug 参数,这样就会生成一个的报告.
springboot中有好多分析器,你可以通过上边的报告看出来。去看看他们的实现,以便完成自己项目启动时候的分析。
@Conditional注解是spring4 才出现的,那么spring3的版本怎么去实现上述的自动化配置呢?

##核心思路 BeanFactoryPostProcessor + java Config + @component-scan

  • BeanFactoryPostProcessor 针对bean 定义 进行判断 ,容器创建Bean前获取配置元信息。
    • javaConfig 中需要定义为static 方法
  • BeanPostProcessor 针对bean 实例
    ##关于bean 的一些定制
    Lifecycle callback
    InitializingBean 、@postConstruct、init-method 、DisposableBean 、@PreDestroy 、destroy-method
    XxxAware 接口
  • ApplicationContextAware
  • BeanFactoryAware
  • BeanNameAware

##一些Bean 常用操作

###判断类是否存在

  • ClassUtils.isPresent()

    判断bean是否定义

  • ListableBeanFactory.containsBeanDefinition()
  • ListableBeanFactory.getBeanNameForType()
    ###注册Bean定义
  • BeanDefinitionRegistry.registerBeanDefinition()
    • GenericBeanDefinition
  • BeanFactory.registerSingleton()

分布式session

发表于 2019-04-17 | 分类于 编程 | | 阅读次数:
| 字数统计: 83

#常见的会话解决方案

  • 粘性方案 sticky session
  • 会话复制 session replication
  • 集中会话 centralized session

Spring 为我们定制了一个HttpSession

  • SessionRepositoryRequestWrapper
  • SessionRepositoryFilter
  • DelegatingFilterProxy
    引入 spring-session-data-redis 依赖
    • @EnableRedisHttpSession
    • 提供 RedisConnectionFactory
    • AbstractHTTPSessionApplicationInitializer
      • 配置DelegatingFilterProxy
        properties文件配置熟悉
        1
        2
        3
        4
        5
        spring.redis.host=localhost 
        spring.session.store-type= redis
        spring.session.timeout = 600
        spring.session.flush-mode= on-save
        spring.session.redis.namespace= spring:redis

怎么设计一个好的resful web service

发表于 2019-04-17 | 分类于 编程 | | 阅读次数:
| 字数统计: 352

识别资源

设计uri并选择合适的http方法和返回码

  • 合理的利用分隔符表述资源之间的层次关系
    • 例如 : /user/{id}/
  • 使用逗号或者分号表述非层次关系(实际应用很少用)
  • 使用连接字符“-” “_” 改善长路径名称可读性
  • 避免出现一些后缀名
  • 使用& 区分参数

    设计资源的表述

    合适的 资源的力度

    服务端
  • 网络效率
  • 表述资源的多少,是否需要多一次性传入
  • 客户端易用性
    客户端
  • 可缓存性
  • 可变性
  • 修改频率
    1
    2
    3
    4
    5
    6
    7
    8
    动作   | 安全/幂等  | 用途 
    Get | Y/Y | 获取信息
    post | N/N | 创建,更新,批量更新
    delete | N/Y | 删除资源
    put | N/Y | 更新资源或者完全替换资源
    head | Y/Y | 同get 获取header 信息,但是没有响应体
    options | Y/Y | 获取资源支持的http方法列表
    trace | Y/Y | 让服务器返回其收到的http头
1
2
3
4
5
6
7
8
状态码 | 描述  | 状态码  |  描述
200 | ok | 400 | bad request
201 | created | 401 | unauthorized
202 | accepted | 403 | forbidden
301 | moved permanently | 404 | not found
303 | see other | 410 | gone
304 | not modified | 500 | internal server error
307 | temporary redirect | 503 | service unavailable

什么是HATEOAS?

hybermedia as the engine of applications state
rest 统一接口必要重要的组成部分

认识下HAL

hypertext application language 为api 提供简单一致的链接
模型:

- 链接
- 内嵌资源
- 状态

springboot-data-rest
@RepostoryRestResource
Resource
PagedResource

jodatime快速记忆

发表于 2019-04-11 | 分类于 编程 | | 阅读次数:
| 字数统计: 280

速记

常常在使用jodatime 中忘记api,查找会浪费时间。所以在大脑中形成记忆还是最好的方式。

构造方法

:n
1
2
3
4
5
6
/** The recognised object types are defined in
* {@link org.joda.time.convert.ConverterManager ConverterManager} and
* include ReadableInstant, String, Calendar and Date.
**/
public DateTime(Object instant)...
public DateTime(Long instant)

其他的一些方法

  • with 开头的方法,返回的是副本,具体大概是设置时间点
  • plus/minus 开头的方法,对日期增减的方法
  • 返回 Property 的方法:Property 是 DateTime 中的属性

    :n
    1
    2
    3
    4
    5
    DateTime now = new DateTime(); // 2016-02-26T16:51:28.749+08:00
    now.monthOfYear().getAsText(); // February
    now.monthOfYear().getAsText(Locale.KOREAN); // 2월
    now.dayOfWeek().getAsShortText(); // Fri
    now.dayOfWeek().getAsShortText(Locale.CHINESE); // 星期五
  • Interval:它保存了一个开始时刻和一个结束时刻,因此能够表示一段时间,并进行这段时间的相应操作

    • Period:它保存了一段时间,比如:6 个月,3 天,7 小时这样的概念。可以直接创建 Period,或者从 Interval 对象构建。
  • Duration:它保存了一个精确的毫秒数。同样地,可以直接创建 Duration,也可以从 Interval 对象构建

    https://www.jianshu.com/p/efdeda608780 引用

必须掌握的idea 快捷键

发表于 2019-04-09 | 分类于 编程 | | 阅读次数:
| 字数统计: 330

必须掌握的快捷键

反正本人经常忘记快捷键,网上也有大量的mac idea 快捷键整理。梳理出常用的快捷键,那么我们开发时候得心应手,百战不殆!

一、Editing(编辑)

  • ⌘D 复制当前行或选定的块
  • ⌘⌫ 删除当前行或选定的块的行
  • ⌘⇧↩ 自动结束代码,行末自动添加分号
  • ⌘P 显示方法的参数信息
  • ⌃J, Mid. button click 快速查看文档
  • ⌘N, ⌃↩, ⌃N 生成代码(getter、setter、构造函数、hashCode/equals,toString)
  • ⌃O 覆盖方法(重写父类方法)
  • ⌃I 实现方法(实现接口中的方法)
  • ⌘⌥T 包围代码(使用 if..else, try..catch, for, synchronized 等包围选中的代码)command+option+T
  • ⌥↑ 连续选中代码块
  • ⌥↓ 减少当前选中的代码块
  • ⌥↩ 显示意向动作和快速修复代码
  • ⌘⌥L 格式化代码
  • ⌃⌥O 优化 import
  • ⌃⇧Q 显示上下文信息 (在类一个方法,变量,能展示出当前是哪个类) 很少用
  • ⇥ / ⇧⇥ 缩进代码 / 反缩进代码
  • ⇧↩ 开始新的一行
  • ⌘⇧U 大小写切换
  • 删除到单词的末尾(⌦键为 Fn+Delete)
  • ⌘⇧] / ⌘⇧[ 选择直到代码块结束 / 开始
  • ⌘+ / ⌘- 展开 / 折叠代码块
  • ⌘⇧+ 展开所以代码块
  • ⌘⇧- 折叠所有代码块
  • ⌘W 关闭活动的编辑器选项卡
    阅读全文 »

近期工作小结整理

发表于 2019-04-09 | 分类于 编程 | | 阅读次数:
| 字数统计: 309

git 使用https url 和 ssh url 区别

git 中 clone 项目有两种方式:HTTPS 和 SSH,它们的区别如下:
HTTPS:不管是谁,拿到 url 随便 clone,但是在 push 的时候需要验证用户名和密码;
SSH:clone 的项目你必须是拥有者或者管理员,而且需要在 clone 前添加 SSH Key。SSH 在 push 的时候,是不需要输入用户名的,如果配置 SSH key 的时候设置了密码,则需要输入密码的,否则直接是不需要输入密码的。
在 git 中使用 SSH Key 的步骤:
检查电脑是否存在 SSH Key:$ cd ~/.ssh$ ls
如果存在 id_rsa.pub 或 id_dsa.pub 文件,说明文件以及存在,跳过创建 SSH Key 步骤。
创建 SSH Key
将公共的 SSH 放到远程仓库上
注: 之前用gitlab 的时候,因为已经给成员配置的项目的权限。在公司还是没啥特别大的区别吧。

阅读全文 »

服务注册与发现eureka

发表于 2019-03-31 | 分类于 编程 | | 阅读次数:
| 字数统计: 99

服务注册与发现

1.什么是服务注册与发现?

2.服务注册与发现的原理?

3.微服务中都有哪些服务发现组件?

4.eureka 实现的原理?

5.eureka怎么实现高可用?

6.eureka属于AP还是CP?

7.eureka 常用配置

  • 扩展阅读
    • eureka高可用的配置
    • eureka的自我保护机制
    • eureka与zk服务发现对比

JAVA 基础

发表于 2019-03-31 | 分类于 编程 | | 阅读次数:
| 字数统计: 6.2k

##JAVA 基础

Java8新特性: Lambda学习指南

Lambda 表达式

一.什么是lambda?

lambda 相当于匿名内部类的实现.

为什么使用lambda表达式?

简洁、方便

lambda对接口的要求?

接口方法有且只有一个抽象方法, 如果其他方法有default实现也可. default 方法也是java8 新增的特性,该接口方法如果是default修饰,那么实现的类可以不去实现此方法.

二. lambda 的基本语法
  • 返回值类型、方法名、参数列表、方法体. lambda是匿名所以方法名可以不存在, 返回值类型在lambda中也可以省略. 最终仅仅剩下,参数列表和方法体.

  • 参数列表

    无参 () -> {}

    一个参数(int a ) -> {}

    二个参数(int a, int b) -> {}

    有返回值的 LambdaInf a = (int a) -> {};

    ​ Ret b = a.infMethod();

三. lambda的语法精简
  1. 参数类型可以省略类型,如果省略则所有参数类型全部省略
  2. 参数如果只有一个,那么()可以省略。 a -> {System.out.println(“aaa”)};
  3. 方法大括号,如果方法体有一条语句,那么大括号可以省略 a -> System.out.println(“aaa”);
  4. 如果方法体中有一条return 语句, 那么可以省略大括号和return
四. lambda 之函数引用

LambdaInf lambda = a -> change(a)

LambdaInf lambda = a -> 方法隶属者::方法名

private int change(a){ return a *2 ;}

五.lambda之 : 排序comparator
六.lambda之 :forEach()
七.lambda之 :removeIf()
八. lambda之 :线程实例化
九.系统内置函数接口

内置函数接口

十.闭包

闭包会提升局部变量的生命周期,局部变量一般都是方法结束后就消失了,但是闭包使用局部变量后会提升生命周期.

  1. JAVA 中的几种基本数据类型是什么,各自占用多少字节。
    Int,double,byte,short,char,float ,long,boolean
  2. String 类能被继承吗,为什么。
    不能,String类型是final修饰,不可变类型。final修饰的类是不能进行继承的
  3. String,Stringbuffer,StringBuilder 的区别。

    buffer线程安全,用synchronized 修饰

    • StringBuilder 和 StringBuffer 都是可变字符串,前者线程不安全,后者线程安全。
    • StringBuilder 和 StringBuffer 的大部分方法均调用父类 AbstractStringBuilder 的实现。其扩容机制首先是把容量变为原来容量的 2 倍加 2。最大容量是 Integer.MAX_VALUE,也就是 0x7fffffff。
    • StringBuilder 和 StringBuffer 的默认容量都是 16.
  4. ArrayList 和 LinkedList 有什么区别。

    数据结构上,一个是数组,一个是链表结构,查询O(1) 增加O(n) 。链表插入,删除快,查询需要遍历结点

阅读全文 »
1234…7
lancecong

lancecong

68 日志
9 分类
32 标签
点下试试
  • 😆 网易云音乐 😆
  • Coldplay Official Website
  • 获取 Elon Musk 的新闻
  • 尼古拉·特斯拉:发明了现代世界的人
© 2017 — 2020 lancecong
微信扫一扫,call me !
0%