树莓派运行情况监控
树莓派运行情况监控项目地址:go-pi-monitor
go-pi-monitor 是在 gopsutil 的基础上挑选部分 metric 信息进行监控可视化。
编译部署在 Raspbian 上安装 GoLang 1.12.5 版本的脚本如下:
12345678910#install_go_pi.shcd $HOMEFileName='go1.12.5.linux-armv6l.tar.gz'wget https://dl.google.com/go/$FileNamesudo tar -C /usr/local -xvf $FileNamecat >> ~/.bashrc << 'EOF'export GOPATH=$HOME/goexport PATH=/usr/local/go/bin:$PATH:$GOPATH/binEOFsource ~/.bashrc
参考 Install Go Lang 1.12.5 on Raspberry Pi 3 B+。
下载 go-pi-monitor 并进行编译运行:
12345 ...
深入理解Spring事务原理
深入理解Spring事务原理
引用自深入理解Spring事务原理
事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:
获取连接 Connection con = DriverManager.getConnection()
开启事务con.setAutoCommit(true/false);
执行CRUD
提交事务/回滚事务 con.commit() / con.rollback();
关闭连接 conn.close();
使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自动完成。那么Spring是如何在我们书写的 CRUD 之前和之后开启事务和关闭事务的呢?解决这个问题,也就可以从整体上理解Spring的事务管理实现原理了。下面简单地介绍下,注解方式为例子
配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。
spring 在启动的时 ...
快速搭建微服务-API网关
快速搭建微服务-API网关API网关是整个后端微服务体系的门户,外部应用通过网关对后台数据进行相关操作,网关中包含了定义后台服务路由规则、服务限流、设置跨域、开启饥饿加载模式等内容。本文对这些内容一一进行说明。
路由规则定义请求前缀和后台服务的service-id即可。
1234567891011121314zuul: routes: auth: path: /auth/** service-id: auth-server api-order: path: /api-order/** service-id: service-order api-goods: path: /api-goods/** service-id: service-goods api-wechat-admin: path: /api-wechat-admin/** service-id: service-wechat-admin
服务限流通过编写自定义的限流Filter实现服务限流。
RateLimit ...
快速搭建微服务-服务安全
快速搭建微服务-服务安全微服务架构下的服务安全是构建微服务系统的一个重要环节。做好服务鉴权是保障数据不泄漏、不被非法操作的关键。
Spring Cloud架构支持OAuth2 + Spring Security的方式进行服务鉴权,只需简单配置即可。同时我们也可以在网关服务里加入自定义的鉴权Filter实现服务鉴权。
采用OAuth2 + Spring Security的方式进行服务鉴权时,如果同时使用了Hystrix断路器,就会出现后台服务之间进行调用时access_token无法在服务间传递的问题,其根本原因是Hystix的默认隔离策略是Thread(即线程隔离),这样就会导致服务间调用时没有将access_token进行传递,导致鉴权失败。此问题的具体解决办法可以在 实用技巧:Hystrix传播ThreadLocal对象(两种方案) 中找到。
本文对OAuth2 + Spring Security和自定义鉴权Filter都进行说明。
OAuth2 + Spring Security方式采用OAuth2 + Spring Security方式需要区分鉴权服务和资源服务。
api- ...
快速搭建微服务-服务容器
快速搭建微服务-服务容器本文介绍的服务容器有别于常说的Docker,而是指单个微服务运行依赖的Web服务器容器。Spring Boot支持的Web服务器有 Tomcat、Jetty、Undertow。综合比较之后选择Undertow作为微服务的服务容器。
Undertow配置Maven依赖这里是多个微服务依赖于同一个parent的maven配置,可以直接在parent的pom.xml中加入以下依赖:
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId></dependency>
如果是单个微服务独立配置maven依赖的话,则需要在pom.xml中配置如下依赖:
1234567891011121314<dependency> <groupId>org.springframework.boot< ...
快速搭建微服务-服务监控
快速搭建微服务-服务监控Spring Boot Admin为基于Spring Boot的基础数据安全端口提供了基础的可视化监控功能。还可以通过Spring Boot Admin的服务端程序对Spring Boot程序提供简单的实时管理(例如修改日志输出级别)。
Spring Cloud集成Spring Boot AdminSpring Boot Admin服务端Spring Cloud中集成Spring Boot Admin比较简单,只需要将服务端程序注册到注册中心即可。
服务端Maven依赖
1234567891011121314151617181920212223242526272829303132333435363738394041424344<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId></depend ...
快速搭建微服务-服务调用
快速搭建微服务-服务调用Spring Cloud体系中服务间的调用常见的有Feign和Ribbon两种方式,其中Feign默认集成了Ribbon。Ribbon采用注入RestTemplate实例,通过全局的RestTemplate调用其它可以被发现的服务,而Feign则使用类似于Controller的代码风格配合@FeignClient注解实现服务间接口的调用。由于注入RestTemplate的方式更符合Spring的编程风格,这里仅介绍基于Ribbon方式的服务调用。
Ribbon配置向Spring容器中注入RestTemplate实例12345@Bean@LoadBalancedpublic RestTemplate restTemplate() { return new RestTemplate();}
负载均衡策略@LoadBalanced注解用于开启客户端负载均衡,Ribbon默认的负载均衡策略是轮询选择。Ribbon提供了如下的负载均衡策略:
AvailabilityFilteringRule:过滤掉那些一直连接失败的被标记为circuit ...
快速搭建微服务-服务链路追踪
快速搭建微服务-服务链路追踪
部分内容引用自: 利用Zipkin对Spring Cloud应用进行服务追踪分析
针对服务化应用全链路追踪的问题,Google发表了Dapper论文,介绍了他们如何进行服务追踪分析。其基本思路是在服务调用的请求和相应中加入ID,标明上下游请求的关系。
对用Dapper的开源实现是Zipkin,支持多种语言包括JavaScript,Python,Java, Scala, Ruby, C#, Go等。其中Java由多种不同的库来支持。
Spring Cloud Sleuth是对Zipkin的一个封装,对于Span、Trace等信息的生成、接入HTTP Request,以及向Zipkin Server发送采集信息等全部自动完成。本文介绍如何在Spring Cloud中集成Spring Cloud Sleuth实现服务链路追踪。
Spring Cloud Sleuth的概念图如下:
服务端配置启动类加上 @EnableZipkinStreamServer 注解声明当前应用为Sleuth服务端。
使用MySQL存储链路追踪信息的配置
Maven 依赖
12 ...
快速搭建微服务-注册中心、服务发现
快速搭建微服务-注册中心、服务发现注册中心是微服务的核心组件,SpringCloud比较常见的注册中心有eureka和consul,这里简单说明下这两种注册中心服务如何实现。这里的例子是基于SpringCloud Edgeware版本。
Spring Cloud Eureka注册中心Server端
maven
1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
application.yml
123456789101112131415server: port: 9101eureka: instance: hostname: localhost client: register-with-eureka: false fetch-regis ...
快速搭建微服务-消息总线
快速搭建微服务-消息总线利用Spring Cloud Bus提供的批量刷新配置的机制,可以实现在配置中心的配置信息发生变化后自动更新相关服务的配置的功能。Spring Cloud Bus消息总线通过使用轻量级的消息代理中间件(例如RabbitMQ、Kafka等)连接分布式系统的节点,这样就可以通过Spring Cloud Bus广播配置信息的变化。
这里使用RabbitMQ作为消息中间件向Spring Cloud微服务架构中加入消息总线,并实现配置自动刷新配置信息的功能。
配置中心服务端
添加Maven依赖
1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>
配置信息
12345678910spring: cloud: bus: trace: enable ...
快速搭建微服务-熔断器
快速搭建微服务-熔断器熔断器的主要功能是在进行服务间调用时提供一种容错保护,当服务提供方因网络或自身原因出现调用故障或延迟时,会导致服务调用方对外服务也出现延迟,如果此时服务调用方的请求不断增加,则会出现调用方的自身服务的故障甚至蔓延导致整个系统的瘫痪。
服务调用方配置熔断
Maven依赖
1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
开启熔断器
在启动类上加入@EnableCircuitBreaker注解开启熔断器。
服务降级
通过 @HystrixCommand 注解实现服务降级。
123456789@GetMapping("")@HystrixCommand(fallbackMethod = "listWxMpAccountFa ...
快速搭建微服务-配置中心
快速搭建微服务-配置中心配置中心是用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,分为服务端和客户端两个部分。配置中心的服务端是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息的接口。配置中心的客户端可以是微服务架构中的各个微服务应用或基础服务,客户端在启动的时候调用服务端接口获取并加载配置信息。Spring Cloud Config实现的配置中心默认采用Git仓库来存储配置信息。本文简单介绍如何在微服务架构中使用Spring Cloud Config作为配置中心。
配置仓库在Git代码托管平台上创建一个新的仓库/项目,并将配置文件上传至Git仓库的根目录下。
配置文件的命名格式为:[serviceId]-[profile].yml
当profile为 “default” 默认配置时,可以忽略。
配置文件的格式可以是yml,也可以是properties,推荐可读性更好的yml格式。配置文件的内容填写相应的微服务的外部配置信息,例如 api-gateway 网关服务的配置文件 api-gateway.yml 中配置了jwt的相关参数和不同客 ...
数据同步
数据同步敬请期待……
架构五要素
架构五要素一般在做架构设计时,我们会关注以下五个要素:
高性能
高可用
伸缩性
扩展性
安全性
高性能性能的测试指标主要有:
响应时间:指应用执行一个操作需要的时间
并发数:指系统能够同时处理请求的数目
QPS:指单位时间内系统处理的请求量
系统性能计数器:描述服务器或者操作系统性能的一些数据指标
性能优化,根据网站分层架构,可以分为三大类:
Web前端性能优化
减少http请求
适用浏览器缓存
启用压缩
减少Cookie传输
应用服务器性能优化:缓存、集群、异步
多线程(设计为无状态,使用局部对象,并发访问资源使用锁)
资源复用(单例,对象池)
数据结构
异步操作(消息队列,削峰作用)
多台应用服务器组成一个集群共同对外服务,提高整体处理能力
使用CDN,将网站静态内容分发至里用户最近的网络服务器机房,使用户通过最短访问路径获取数据。可以在网站机房部署反向代理服务器,缓存热点文件,加快请求响应速度,减轻应用服务器负载压力
应用服务器端,可以使用服务器本地缓存和分布式缓存(网站性能优化第一定律:考虑使用缓存优化性能)
代码层面,通过使用多线程、改善内存管理等手段优化性 ...
缓存
缓存敬请期待……
负载均衡
负载均衡敬请期待……
集群技术
集群技术敬请期待……
高可用
高可用敬请期待……
HashMap的扩容机制
HashMap的扩容机制简介HashMap是单纯的kv键值对结构,可以接受null键和null值,速度比较快,非线程安全。
HashMap的数据结构HashMap实际上是一个“链表的数组”的数据结构,每个元素存放链表头节点的数组,即数组和链表的结合体。
Entry就是数组中的元素,每个Map.Entry其实就是一个key-value对,它持有指向下一个元素的引用,这就构成了链表。
工作原理
put
当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组的该位置上。
HashMap基于hashing原理,使用put()方法存储,当将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,然后找到bucket位置来存储值对象。
当获取对象时,同上找到对应的bucket,通过键对象的equals() ...
JDK并发包里常用的类
JDK并发包里常用的类资料:
并发编程 :Concurrent 用户指南 ( 上 )
并发编程 :Concurrent 用户指南 ( 中 )
并发编程 :Concurrent 用户指南 ( 下 )
ConcurrentHashMap是线程安全的。
put方法,首先是对key.hashCode进行hash操作,得到hash值。然后获取对应的segment对象,接着调用Segment对象的put方法完成当前操作。当调用put方法时,首先lock操作。完成操作后再释放锁。
http://ifeve.com/concurrenthashmap/
Semaphore可以控制某资源同时被访问的个数。例如连接池中通常要控制创建连接的个数。
tryAcquire方法,获得锁release方法,释放锁
CountdownLatch闭锁,确保一个服务不会开始,直到它依赖的其他服务都已经开始,它允许一个或多个线程,等待一个事件集的发生。通过减计数的方式,控制多个线程同时开始某个动作。当计数为0时,await后的代码才会被执行。提供await()和countDown()两个方法。
CyclicBarri ...