Jone Sun's Blog

用心发现,这个星球很美!

0%

目录

任何并发能做的事情,单进程也能够实现,只不过这种方式效率很低,它是一种顺序性的

java多线程1-从Thread到Future再到CompletableFuture

java多线程2-线程池

java多线程3-fork-join框架

java多线程4-volatile&synchronized

java多线程5-并发同步器CountDownLatch&CyclicBarrier&Semaphore

java多线程6-ConcurrentHashMap

java多线程7-atomic原子类

java多线程8-locks锁

java多线程9-BlockingQueue和BlockingDeque-待细化

java多线程10-ThreadLocal

阅读全文 »

目录

SpringBoot版本为2.x, 2.4.0开始版本号没有.RELEASE后缀

SpringBoot-Starters

使用Jenkins自动构建

第三方组件

SpringBoot-集成Log日志

SpringBoot-Test用法

SpringBoot-集成Mybatis

SpringBoot-集成Swagger3

SpringBoot-集成Redis

SpringBoot-SpringSecurity5整合

SpringBoot-集成Websocket

SpringBoot应用整合ELK实现日志收集

SpringBoot-监控

SpringBoot-集成Flyway实现数据库版本控制

SpringBoot-SpringInitializr说明

SpringBoot-消息队列MQ

SpringBoot-Docker使用

开发小技巧

SpringBoot开发小技巧-对象属性拷贝BeanUtils.copyProperties

SpringBoot开发小技巧-打印Mybatis中的sql语句

screw-简洁好用的数据库表结构文档生成工具

springboot多环境配置

阅读全文 »

前言

顾名思义是跟云相关的,云程序实际上就是指分布式应用程序,所以Spring Cloud就是为了让分布式应用程序编写更方便,更容易而提供的一组基础设施,它的核心是Spring框架,利用Spring Boot的自动配置,力图实现最简化的分布式应用程序开发。

截至目前(2021-06-22)官网 最新版本为2020.0.3版

Spring Cloud包含了一大堆技术组件,既有开源社区开发的组件,也有商业公司开发的组件,既有持续更新迭代的组件,也有即将退役不再维护的组件。

Spring Cloud变化

在2020.x之前Spring Cloud一直以来把Netflix OSS套件作为其官方默认的一站式解决方案,但是Netflix公司在2018年开始将其核心组件Hystrix、Ribbon、Zuul、Archaius等进行了闭源和设置为维护模式。

模块置于维护模式,意味着 Spring Cloud 团队将不会再向模块添加新功能,只修复重大bug以及安全问题

当然Spring Cloud 2020.0.0版本开始彻底删除掉了Netflix除Eureka外的所有组件依赖。所以学习Spring Cloud时需要注意版本(尤其看网上的各个博客教程时):

Release Train 发布时间 Spring Boot版本 SC Commons版本
2020.0.x 2020-12 2.4.x 3.0.0
Hoxton 2019-07 2.2.x, 2.3.x (从SR5起) 2.2.x
Greenwich 2018-11 2.1.x 2.1.x
Finchley 2017-10 2.0.x 2.0.x
Edgware 2017-08 1.5.x 1.3.x
Dalston 2017-05 1.5.x 1.2.x
Brixton 2016-09 1.3.x 1.1.x
Angel 2016-05 1.2.x 1.0.x

如果是新项目直接上2020.x最新版本,需要注意有些Netflix的组件不再推荐使用(除Eureka和已经贡献出去的OpenFeign),Spring Cloud的替代建议是:

阅读全文 »

设计模式是为了可扩展性,不要为了使用设计模式而使用

概念

设计模式,即Design Patterns,是指在软件设计中,被反复使用的一种代码设计经验。使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性。

创建型模式

创建型模式关注点是如何创建对象,其核心思想是要把对象的创建和使用相分离,这样使得两者能相对独立地变换,共五种:

  • 工厂方法模式FactoryMethod: 定义一个用于创建产品的接口,由子类决定生产什么产品
  • 抽象工厂模式AbstractFactory: 提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品
  • 单例模式Singleton: 某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式
  • 建造者模式Builder: 将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象
  • 原型模式Prototype: 将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例

结构型模式

结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构,共七种:

  • 适配器模式Adapter: 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作
  • 装饰器模式Decorator: 动态的给对象增加一些职责,即增加其额外的功能
  • 代理模式Proxy: 为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性
  • 外观模式Facade: 为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问
  • 桥接模式Bridge: 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度
  • 组合模式Composite: 将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性
  • 享元模式Flyweight: 运用共享技术来有效地支持大量细粒度对象的复用

行为型模式

行为型模式主要涉及算法和对象间的职责分配。这些设计模式是特别侧重于对象之间的通信,通过使用对象组合,行为型模式可以描述一组对象应该如何协作来完成一个整体任务,共十一种:

  • 策略模式Strategy: 定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户
  • 模板方法模式TemplateMethod: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤
  • 观察者模式Observer: 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为
  • 迭代器模式Iterator: 提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示
  • 责任链模式Chain of Responsibility: 把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合
  • 命令模式Command: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开
  • 备忘录模式Memento: 在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它
  • 状态模式State: 允许一个对象在其内部状态发生改变时改变其行为能力
  • 访问者模式Visitor: 在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问
  • 中介者模式Mediator: 定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解
  • 解释器模式Interpreter: 提供如何定义语言的文法,以及对语言句子的解释方法,即解释器

见名思意, 代码中出现了类名存在如Adapter、Factory、Decorator等,可以联想到对应的设计模式,无论自己编写还是查阅他人代码

设计模式需要满足:

  • 开闭原则(Open Close Principle): 软件应该对扩展开放,而对修改关闭。这里的意思是在增加新功能的时候,能不改代码就尽量不要改,如果只增加代码就完成了新功能,那是最好的
  • 里氏替换原则(Liskov Substitution Principle): 即如果我们调用一个父类的方法可以成功,那么替换成子类调用也应该完全可以运行
  • 依赖倒转原则(Dependence Inversion Principle): 针对接口编程,依赖于抽象而不依赖于具体
  • 接口隔离原则(Interface Segregation Principle): 使用多个隔离的接口,比使用单个接口要好
  • 迪米特法则(Demeter Principle): 一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立
  • 合成复用原则(Composite Reuse Principle): 尽量使用合成/聚合的方式,而不是使用继承

特别感谢廖雪峰老师的文章推荐学习!

阅读全文 »

docker 中运行nginx

拉取nginx最新镜像

1
docker pull nginx:latest

如果需要指定版本,可以到 Docker Hub 镜像仓库 选择指定Tag

1
docker pull nginx:1.21.3

查看是否拉取成功

1
docker images
阅读全文 »

前言

日常项目中经常会针对不同环境进行不同配置,比如数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据。或者像日志的配置等等……
这时候,我们可以利用profile在不同的环境下配置不同的配置文件

而在SpringBoot中是允许约定按照一定的格式(application-{profile}.yml)来定义多个配置文件,然后通过在application.yml中通过指定spring.profiles.active来具体激活一个或者多个配置文件。

如果没有没有指定任何profile的配置文件的话,spring boot默认会启动application-default.yml

阅读全文 »

创建任务

安装并配置好Jenkins后,我们来构建并部署springboot项目

创建任务首先准备一个SpringBoot项目上传到上面凭据所在的git托管网站中,以便Jenkins可以正常拉取源码

新建Item-选择【构建一个Maven项目】(如果这里没有这个选项,回到上篇安装插件Maven Integration并重启Jenkins)

new-job

JDK

选择该项目构建时的Java版本(如果这里没有所需的版本,回到上篇配置配置JDK、Maven、Git环境,新增即可)

源码管理中

选择Git,填写仓库地址,选择之前添加的凭证

构建触发器

阅读全文 »

安装前准备

下载配置jdk

从Jenkins的官网可以看到

jenkins-jdk

较新的Jenkins需要运行在Java 8 或者 Java 11上,我们安装java8版本,由于Oracle下载jdk需要注册账户,我们下载openjdk,这里推荐 Liberica OpenJDK

直接下载zip版本,并在环境变量中配置JAVA_HOME,使用cmd执行java -version查看是否配置成功

如果电脑里已经安装了Java环境,直接用java -version验证是否Java8+版本

下载安装Git

我们需要使用Jenkins拉取项目源码,故需要先安装下git

git 官网下载安装即可

阅读全文 »