自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 资源 (2)
  • 收藏
  • 关注

原创 Java 8 与并发(二)

一、并行流与并行排序Java 8中可以在接口不变的情况下,将流改为并行流,方便在多线程中进行集合中的数据处理。1.1 使用并行流过滤数据下面示例统计1~1000000内所有质数的数量。下面是一个判断质数的函数:public class PrimeUtil { public static boolean isPrime(int number) { int tmp = ...

2018-09-27 23:09:18 352

原创 JDK并发包-线程复用:线程池

为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用。线程池中,总有那么几个活跃线程。当你需要使用线程时,可以从池子中随便拿一个空闲线程,当完成工作时,并不急着关闭线程,而是将整个线程退回到池子,方便其他人使用。1.1 JDK对线程池的支持JDK提供一套Executor框架,帮助开发人员更好的有效的控制多线程。其中ThreadPoolExecutor表示一个线程池。Executor...

2018-09-27 18:13:45 213

原创 Java lambda表达式

lambda表达式是Java 8 中的一个很重要的新特性,它容许将行为传到函数中。在Java 8 之前,如果我们想要把行为传到函数中,仅有的选择就是匿名内部类。但Java 8 发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码,突出匿名内部类中最重要的逻辑代码。下面以Runable接口说明这一点:Runnable runnable = new Runnable() { ...

2018-09-27 18:02:05 307

原创 Java 8 与并发(一)

一、Java 8 的函数式编程1.1 函数作为一等公民JavaScript被称之为多范式语言,你既可以把它当做面向对象的语言也可以当做函数式语言。在jQuery中经常可以看到如下的代码:$("button").click(function(){ $("li").each(function(){ alert($(this).text()); });});注意这里each(...

2018-09-27 18:01:01 612

原创 并行模式与算法(二)

1.矩阵算法在矩阵乘法中,第一个矩阵的列数和第二个矩阵的行数必须是相同的。如果需要进行并行计算,一种简单的策略是可以将A矩阵进行水平分割,得到子矩阵A1和A2,B矩阵进行垂直分割,得到子矩阵B1和B2。此时,我们只要分别计算这些子矩阵的乘积,将结果进行拼接,就能得到原始矩阵A和B的乘积。当然这个过程是可额予以反复进行的。为了计算A1*A2,我们可以进一步将A1和B1进行分解,直到我们认为子矩阵的...

2018-09-27 17:59:59 701 1

原创 服务熔断与熔断监控(Finchley版本)

在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫...

2018-09-26 23:55:18 1360

原创 Spring Cloud Sleuth服务链路追踪(Finchley版本)

一、Java 8 的函数式编程1.1 函数作为一等公民JavaScript被称之为多范式语言,你既可以把它当做面向对象的语言也可以当做函数式语言。在jQuery中经常可以看到如下的代码:$("button").click(function(){ $("li").each(function(){ alert($(this).t

2018-09-18 21:35:16 1484 1

原创 使用Docker运行war包Java应用

在之前的文章Docker部署Spring Boot中,应用编译的结果是jar包,而在很多情况下J2EE应用的编译结果是war包。本节将使用Docker部署war包Java应用。一、构建tomcat的基础镜像下载并上传tomcat到linux服务器在这里我使用的tomcat版本是8.5.33,上传后解压文件并重命名:$ tar -zxvf apache-tomcat-8.5.3...

2018-09-17 09:02:44 1898

原创 构建最小JDK Docker镜像

一、问题描述最近在使用docker部署spring Cloud微服务项目的时候发现,每个服务构建出的镜像文件高达700M。 较大的镜像往往会导致移植,迁移缓慢。最后启动并进入容器发现,jdk用的是openjdk,那么我们就需要在构建镜像时使用更小的jdk作为基础镜像,进而减小镜像的大小。二、解决方案使用Oracle的JRE不是openjdk,并构建成Docker镜像。具体步骤如下:...

2018-09-17 09:02:16 3645

原创 Docker-compose编排微服务顺序启动解决方案

一、前言docker-compose可以方便组合多个 docker 容器服务, 但是, 当容器服务之间存在依赖关系时, docker-compose 并不能保证服务的启动顺序。docker-compose 中的 depends_on 配置是容器的启动顺序, 并不是容器中服务的启动顺序。本章将详细叙述如何解决 docker-compose 顺序启动微服务的问题。二、解决方案经过两天的...

2018-09-16 08:18:19 15796 3

原创 Docker Compose编排微服务

在前面的文章Docker部署Spring Boot中,使用maven构建镜像,然后使用docker命令操作容器。微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。Docker Compose可以轻松的管理容器,降低维护工作量。一、Docker Compose简介Docker Compose是一个编排多容器分布式部...

2018-09-16 08:18:08 1681

原创 Docker部署Spring Boot

Docker技术的发展给微服务的部署带来了很大的便利,本文简单介绍一下使用Docker部署Spring Boot项目。一、构建一个简单的Spring Boot项目1. 启动类@SpringBootApplicationpublic class DemoApplication { @RestController public class HelloSimonContro...

2018-09-16 08:17:57 393

原创 CentOS 7.x 安装Docker

一、Docker概述Docker是一个开源的容器引擎,它有助于更快的交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker,可更快地打包,测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。下面是Docker的架构图: 图中包含以下组件: Docker daemon(Docker守护进程):Docker daemon是一个...

2018-09-16 08:17:47 869

原创 并行模式与算法(一)

一、高性能生产者-消费者:无锁实现BlockigQueue使用锁和阻塞等待来实现线程间的同步,而ConcureentLinkedQueue使用大量的无锁CAS操作,相比BlockigQueue的性能要好的多。但是使用CAS进行编程是非常困难的,不过现成的Disruptor框架帮我们实现了这一功能。1.1 无锁的缓冲框架:DisruptorDisruptor框架是由LMAX公司开发的...

2018-09-16 08:17:33 1174 2

原创 锁的优化及注意事项(二)

一、无锁对于并发控制而言,锁是一种悲观的策略,总是假设每一次进入临界区操作都会产生冲突,如果多线程访问临界区资源,就宁可牺牲性能让线程等待,所以锁会阻塞线程执行。而无锁是一种乐观策略,它会假设对临界区资源的访问是没有冲突的,所有线程都会不停顿的执行,但是如果遇到冲突那该怎么办?无锁策略使用一种叫做比较交换的技术(CAS Compare And Swap)来鉴定线程冲突,一旦检测到冲突,就进行重...

2018-09-16 08:17:13 232

原创 锁的优化及注意事项(一)

一、提高锁性能的几点建议锁的竞争会导致程序整体性能的下降,如何降低锁竞争带来的副作用是我们必须考虑的。下面提出几点锁优化的建议:1.1 减小锁持有时间单个线程对锁的持有时间与系统的性能密切相关。如果线程持有锁的时间越长,那么锁的竞争程度就会越激烈。因此,应尽可能减少线程对某个锁的占有时间,进而减少线程间互斥的可能。看下面这段代码:public synchronized vo...

2018-09-16 08:17:01 541

原创 JDK并发包-JDK并发容器

除了同步控制,线程池等基本工具以外,JDK还准备了一大批好用的容器类。1.1 并发集合JDK提供的这些容器大部分在java.util.concurrent包中。ConcurrentHashMap:这是一个高效的并发HasshMap,可以理解为一个线程安全的HashMapCopyOnWriteArrayList:这是一个List,在读多写少的场合,这个List的性能非常好,远远好...

2018-09-16 08:16:48 448

原创 JDK并发包—多线程的团队协作:同步控制

在Java并行程序基础知识一文中我们提到使用syschronized关键字做同步控制来决定一个线程是否可以访问临界区资源,同时使用线程等待Object.wait(),线程通知Object.notify()做多线程间的协作。这一节我们主要学习syschronized,Object.wait(),Object.notify()的增强版——重入锁。1.1 syschronized的功能扩展:重入...

2018-09-16 08:16:34 250

原创 Java并行程序基础知识

一、线程简介进程:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体,在当代面向线程设计的计算机结构中,进程是线程的容器,程序是指令、数据及其组织形式的描述,进程是程序的实体;线程是轻量级进程,是程序的最小执行单位,使用多线程进行并发程序的设计,是因为线程间的切换和调度的成...

2018-09-16 08:16:15 358

原创 Feign传递请求头信息

在我之前的文章服务网关Spring Cloud Zuul中,将用户的登录id放在了请求头中传递给内部服务。但是当内部服务之间存在feign调用时,那么请求头信息会在feign请求的时候传递吗?不会,请求的头信息和请求参数都不会进行传递。但是我们可以通过通过实现RequestInterceptor接口,完成对所有的Feign请求,传递请求头和请求参数。1. 实现RequestIntercep...

2018-09-15 09:38:20 12458 4

原创 Spring Boot Admin 2.0 监控Spring Cloud服务(Finchley版本)

一、简介Spring Boot Admin 在Spring Boot Actuator 的基础上提供简介的可视化WEB UI,用来管理Spring Boot应用程序的一个简单的界面,提供如下的功能:显示 name/id 和版本显示在线状态Logging 日志级别管理MX beans 管理Threads 会话和线程管理Trace 应用请求跟踪应用运行参数信息,如:Java 系...

2018-09-15 09:36:16 3138

原创 Feign实现微服务间文件下载

在使用Feign做服务间调用的时候,当下载大的文件会出现堆栈溢出的情况。另外,文件管理服务(服务提供者)文件下载接口无返回值,是通过HttpServletRespoonse传输的流数据来响应,那么服务消费者该如何接受下载的数据呢?一. 示例介绍 服务名 端口号 角色 feign_upload_first 8100 feign服务提供者 feig...

2018-09-15 09:31:14 11332 4

原创 Feign实现微服务间文件上传

在Spring Cloud 的Feign组件中并不支持文件的传输,会出现这样的错误提示:feign.codec.EncodeException: class [Lorg.springframework.web.multipart.MultipartFile; is not a type supported by this encoder. at feign.codec.Encode...

2018-09-15 09:25:15 1313

原创 服务网关Spring Cloud Zuul(Finchley版本)

一、Zuul简介Zuul作为微服务系统的网关组件,用于构建边界服务(Edge Service),致力于动态路由、过滤、监控、弹性伸缩和安全。其在微服务架构中有着重要的作用,主要体现在以下六个方面:Zull、Ribbon以及Eureka相结合可以实现智能路由和负载均衡的功能,Zull可以按照某种策略将请求分发到不同的实例上;网关作为边界服务,将内部服务的API接口进行聚合并统一对外暴露接...

2018-09-15 09:20:32 760

原创 声明式调用Feign之请求参数

1、Feign请求参数说明  Feign是Netflix的产品,Spring Cloud Feign是在原生Feign的基础上进行了封装。由于Spring Cloud Feign引入了许多springmvc的注解,方便springmvc的使用者使用,但同时也给使用者带来了很大的混淆,下面我们简单讲解一下springmvc和Spring Cloud Feign的参数绑定机制。1.1 Sp...

2018-09-15 09:17:16 3541 1

原创 Spring Boot 自定义过滤器

用户授权、日志记录、编码解码、UA分析、多端应用等都需要拦截请求来进行处理。这时就需要 Servlet、Filter、Listener、Interceptor 这几种组件。本章主要讲解Filter的用法。Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。Filter是可以复用的代码片段,常用来转换 HTTP 请求、响应和...

2018-09-15 09:10:46 1007

原创 Spring Boot 获取上下文环境

在Spring中可以通过ContextLoader获取上下文环境WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();但是这种方式在Spring Boot是失效的。本文提供三种方案获取Spring Boot上下文环境。1. 自动注入@Auto...

2018-09-15 09:08:52 6998

原创 Spring Boot 单元测试

一、使用mock进行单元测试Spring框架提供了MockMvc对象,可以在服务端完成对Controller的启动。测试开始之前需要建立测试环境,setup方法被@Before修饰。通过MockMvcBuilders工具,使用WebApplicationContext对象作为参数,创建一个MockMvc对象。 示例:@RunWith(SpringRunner.class)//这里的...

2018-09-15 09:02:01 547

原创 SpringBoot logback从配置中心读取属性

一、前言这篇文章https://www.jianshu.com/p/9be945a1c318中我详细描述了Spring Boot中如何配置logback日志。在最近的项目中,有这样一个需求:日志信息要使用日志搜集模块进行收集并存入mongodb数据库,所以在日志配置文件中我们必须传入mongodb的配置信息。二、解决问题官网描述 根据官网的描述可以得到这样的信息:log...

2018-09-15 09:00:53 7310

原创 Spring Boot 2.0 整合日志框架

一、前言在Spring Boot的官方文档中,我们发现关于日志的描述还是比较详细的:https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#boot-features-logging 。Spring Boot使用Commons Logging进行所有内部日志记录,但是默认配置也提供了对常用日志框架的...

2018-09-14 13:38:18 1170

原创 Spring Boot 2.0 常用配置描述(官网翻译)

常用配置描述我们可以在application.properties文件中,application.yml文件中或命令行开关中指定各种属性。 本附录提供了常用Spring Boot属性的列表以及对使用它们的底层类的引用。注意: 1. 属性贡献可以来自您的类路径上的其他jar文件,因此您不应该考虑这是一个详尽的列表。定义您自己的属性也是完全合法的 2. 此示例文件仅作为指南。不要将整个内容...

2018-09-14 13:30:12 1865

原创 Spring Boot知识整理(二)

一、Spring Boot 依赖管理  通过InteIIij IDEA创建Spring Boot项目,会发现在项目的pom文件中会有如下代码:<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent...

2018-09-14 13:28:12 280

原创 Spring Boot知识整理(一)

一、启动方式与部署  Spring Boot启动按照容器来分的话大概分为两种:内置tomcat启动和外部tomcat启动。(一)内部tomcat直接在程序中run(右键启动)在命令行中切换到工程目录,执行命令:mvn spring-boot:run先mvn install编译打包工程,之后切换到target路径下,使用java -jar jar包名 例如:java -jar...

2018-09-14 11:49:46 262

原创 CAS 5.1.5版本多属性返回

默认情况下单点登录只返回登录的用户名,不会返回其它的用户信息。如果想要返回更多的用户信息,我们需要进行扩展开发。比如返回用户的id,cas客户端从请求中获取登录用户的id。本文是基于CAS 5.1.X版本自定义jdbc验证这篇文章进行叙述。一、修改services默认配置 HTTPSandIMAPS-10000001.json 文件是cas默认的配置,如果我们没有配置自定义的ser...

2018-09-14 11:01:54 2161 3

原创 CAS 5.1.X版本自定义jdbc验证

一、前言在不同的项目中,可能由于业务需求或者架构方式的不同,对于用户登录的验证方式也不同。CAS为我们提供了很多的认证模式,其中最常见的认证方式有:JDBC认证,可以通过配置,也可以重写cas相关方法进行自定义认证LDAP认证Basic认证Shrio认证Pac4j认证MongoDB认证Rest认证IP黑白名单第三方认证:微信,QQ,github等在笔者最近接手的项目...

2018-09-14 10:37:16 1584

原创 CAS 5.1.x版本代理模式实现

一、什么是CAS的代理认证  在我们的项目中,有这样一个场景:有两个服务holiday(节假日服务)和mainWeb(集成服务),这两个服务都集成了CAS,所有的请求都要经过CAS Server的认证。由于mainWeb内部会去调用holiday的服务,但是mainWeb的请求会被holiday配置的CAS拦截器AuthenticationFilter拦截并重定向到CAS Server。这样我...

2018-09-14 10:32:22 4575 3

原创 cas5.1.x版本主题界面自定义

一、cas自定义主题界面使用场景  项目在集成了单点登录CAS后,往往CAS的登录界面是不满足项目需求的,并且不同系统接入CAS后,登录界面也是不同的。因此,我们需要对CAS登录界面进行自定义。二、相关规范  官方文档:https://apereo.github.io/cas/5.1.x/installation/User-Interface-Customization.html,...

2018-09-14 10:30:15 1684

Spring Boot 参数校验

Bean Validation是Java定义的一套基于注解的数据校验规范。这里简单实现了Spring Boot 参数校验,包括自定义注解,分组校验,全局异常处理等

2019-12-10

通过Feign 扩展 实现Feign 文件上传

在Spring Cloud 的Feign组件中并不支持文件的传输,会出现错误。通过Feign 扩展 可以实现Feign 单个文件和多个文件的上传,示例代码中演示了单个文件上传,多个文件上参考博客自己实现即可。文章地址:https://blog.csdn.net/AaronSimon/article/details/82710938

2019-12-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除