SpringBoot使用虚拟线程
并发编程的演化线程总所周知,线程(Thread)是计算机中的最小执行单元,由操作系统直接进行调度,每个线程都有自己的执行路径和执行状态,可以独立地运行和并发执行多个任务。 线程是一种重量级的资源,线程的创建、销毁以及在多个线程之间切换都需要耗费 CPU 时间,一个系统可以同时创建、调度的线程数量有限。所以,现在应用基本上都会使用 线程池 来解决这个问题,通过池化线程,可以减少线程频繁 创建 和 销毁 的成本。 例如,Servlet 容器(Tomcat、Undertow、Jetty)的并发模型就是通过线程池,为每一个请求分配一个线程池中的线程进行处理。但是,一旦涉及到阻塞操作(IO、网络请求),当前线程就会被挂起进入等待状态,这个线程就不能去执行其他任务。这就导致了,使用传统线程池并发模型的服务器能同时处理的请求有限。 而,当代 Web 应用基本上都是 IO 密集形应用,请求中执行的业务往往涉及到与数据库进行交互、调用远程服务(Socket IO),本地磁盘文件读写等等,因此使用阻塞式线程是非常低效的。 异步非阻塞编程为了解决传统线程在执行 IO 操作时由于阻塞导致的低效,于是,开...
配置ssh key(一个或多个key)
配置一个SSH Key 生成ssh公私钥(默认就是2048字节, 邮箱也可以不加,邮箱是作为title存在, 所以可以配置个有标识性的名称之类的): ssh-keygen -t rsa -C "yourEmailAddr" -b 2048 如果ssh密码没有配置在默认路径, 需要按照如下步骤进行配置 启动ssh-agent:eval ssh-agent -s添加私钥到agent【ssh-add "私钥文件地址" 】 如:ssh-add "c:/Users/xxx/.ssh/id_rsa" 第二步提示:Could not open a connection to your authentication agent,执行ssh-agent bash 将公钥添加到远端库ssh管理处(github/gitee/gitlab) clone 代码:git clone git@xxx.git 配置多个SSH Key场景描述开发人员通常只会生成一个SSH Key,名字叫id_rsa,然后提交到多个不同的网站(如:GitH...
springdoc整合
前言SpringDoc是一个用来自动生成API文档的库。它是基于SpringBoot项目的,遵循OpenAPI3(一个组织规定的规范)规范。它是通过检查我们运行中的程序,推断出基于Spring配置、类结构和各种注解的API语义,从而自动生成JSON、YAML和HTML格式的接口文档。 而我们不得不提的就是Swagger。Swagger是一个公司的开源项目,将自己的API设计贡献给了OpenAPI并由其标准化。在SpringDoc之前我们还可以使用Springfox,和SpringDoc一样是一个用于生成API文档的库,2020年起不再更新。 官方文档链接:https://springdoc.org/#Introduction 使用插件使用【用于生成openapi.json】:https://springdoc.org/#plugins 官方demo文档:https://github.com/springdoc/springdoc-openapi-demos 访问主页:http://localhost:8080/swagger-ui.html 注解介绍@Tag1234567// 用...
单环境,多分支并行开发方案(流量染色/istio)
需求 同一套环境, 两个微服务serviceA和serviceB, 且分别有2个版本original, v1 调用链路: serviceA -> serviceB 具体分为以下几种情况 如果serviceA和serviceB都有v1版本 serviceA(v1) -> serviceB(v1) 如果serviceA有v1版本, serviceB没有 serviceA(v1) -> serviceB(original) 如果serviceA没有v1版本, 而serviceB有 serviceA(original) -> serviceB(v1) 技术方案流量染色 什么是流量染色 在元数据中心(这里可以代指我们的k8s集群),维护每个环境对应的服务列表;在流量的入口处,对请求添加标识;在基础框架层,对流量标识进行解析、透传 和 服务路由。 实际操作一般是在我们的 HTTP 请求中,加入对应环境,用户等变量标识,使请求可以根据这些标识做分类,转发等操作 为什么需要流量染色 使不同的服务,共享环境 可以本地调试特定的服务,而不阻碍服务的正常运行 ...
SpringBoot集成JPA详细教程
SpringBoot集成SpringData JPA依赖引入SpringBoot项目工程,在pom.xml中引入相关依赖包即可: 12345678910<!-- 数据库相关操作 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency> 入口注解SpringData JPA提供了部分注解,可以添加在Application入口程序类上方,来满足相关诉...
单元测试介绍及使用
前言开发人员写的常常是“单元测试”,但其实可以细分成 单元测试 和 集成测试 两个。 划分的原因拿常见的 Spring IoC 举例。Spring 不同Bean之间相互依赖,例如某API业务逻辑中会依赖不同模块的 Service,Service 方法中又可能依赖不同的 Dao 层方法,甚至还会通过 RPC、HTTP 调用外部服务方法。这给我们写测试用例带来了难度,本来只想测试某个方法的功能,却要考虑一连串的依赖关系。 单元测试 单元测试:是指对软件中的最小可测试单元进行检查和验证。 通常任何软件都会划分为不同的模块和组件。单独测试一个组件时,我们叫做单元测试。单元测试用于验证相关的一小段代码是否正常工作。单元测试不是用于发现应用程序范围内的 bug,或者回归测试的 bug,而是分别检测每个代码片段。 单元测试不验证应用程序代码是否和外部依赖正常工作。它聚焦与单个组件并且 Mock 所有和它交互的依赖。例如,方法中调用发短信的服务,以及和数据库的交互,我们只需要 Mock 假执行即可,毕竟测试的焦点在当前方法上。 单元测试的特点: 不依赖任何模块。 基于代码的测试,不需要在 A...
Gradle
介绍Gradle 是google开发的基于groovy语言 ,用于代替 ant 构建的一种配置型语言 Gradle 是基于groovy语言实现(基于JVM的语法和java类似的脚本语言)的一个Android编译系统, google针对Android编译用groovy语言开发了一套 DSL 语言 有额外需要直接使用groovy,或者java代码解决 下载 / 安装地址: http://services.gradle.org/distributions/ 环境配置123456GRADLE_HOME={installed path}PATH=%GRADLE_HOME%\bin# 缓存依赖项/元数据/插件数据# 该属性的默认值根据平台不同而不同,Windows平台默认为C:\Users\用户名\.gradle,Linux和Mac平台默认为~/ .gradle。可以通过设置该属性来指定Gradle用户目录的位置# GRADLE_USER_HOME= 验证gradle -v 问题&解决办法记录Idea中gradle下载太慢解决办法项目名称\gradle...
Gradle插件篇
开发自定义Gradle插件Gradle插件是封装可重用的构建逻辑的一种方式,可以在许多不同的项目和构建中使用。Gradle允许您实现自己的插件,以便重用您的构建逻辑,并与他人共享。 您可以使用任何语言来实现Gradle插件,只要最终实现编译为JVM字节码即可。在我们的示例中,我们将在独立的插件项目中使用Java作为实现语言,在构建脚本插件示例中使用Groovy或Kotlin。通常情况下,使用静态类型的Java或Kotlin实现的插件将比使用Groovy实现的相同插件性能更好。 打包插件有几个地方可以放置插件的源代码。 构建脚本您可以直接在构建脚本中包含插件的源代码。这样做的好处是,插件会自动编译并包含在构建脚本的类路径中,无需进行任何操作。但是,插件在构建脚本之外不可见,因此您无法在定义插件的构建脚本之外重用该插件。 buildSrc项目您可以将插件的源代码放在rootProjectDir/buildSrc/src/main/java目录中(或rootProjectDir/buildSrc/src/main...
maven&gradle多环境
Gradle多环境配置目录结构 指定环境打包 application.yml/yaml/properties 执行 bootJar 打包命令前要先执行 clean【其它和 processResources 相关的命令也要先执行 clean】,否则 active 值不会变! 123spring: profiles: active: @activeProfile@ build.gradle 修改 processResources 任务123456789101112131415161718192021222324252627282930313233def activeProfile = project.properties['activeProfile'] ?: "dev"processResources { exclude { FileTreeElement details -> { (//排除不是当前环境的 yml 配置文件 details.fil...
maven常用插件(长期整理)
maven-compiler-plugin 这个插件是用来编译源代码的 例如报错static import declarations are not supported in -source 1.3 ,这是因为编译的时候默认是1.3版本.可以设定编译器的版本为1.6 target版本一定大于等于source版本 用法: 12345678910111213<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>...
