0%

简介

Feign使得 Java HTTP 客户端编写更方便。Feign 灵感来源于RetrofitJAXRS-2.0WebSocketFeign 最初是为了降低统一绑定DenominatorHTTP API 的复杂度,不区分是否支持 Restful

Maven依赖:

1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/com.netflix.feign/feign-core -->
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
<version>8.18.0</version>
<scope>runtime</scope>
</dependency>

为什么选择Feign而不是其他

你可以使用 JerseyCXF 这些来写一个 RestSOAP 服务的java客服端。你也可以直接使用 Apache HttpClient 来实现。但是 Feign 的目的是尽量的减少资源和代码来实现和 HTTP API 的连接。通过自定义的编码解码器以及错误处理,你可以编写任何基于文本的 HTTP API


Feign工作机制

Feign通过注解注入一个模板化请求进行工作。只需在发送之前关闭它,参数就可以被直接的运用到模板中。然而这也限制了Feign,只支持文本形式的API,它在响应请求等方面极大的简化了系统。同时,它也是十分容易进行单元测试的。

阅读全文 »

购买配置阿里云服务器ECS

阿里云服务器ECS

云服务器(Elastic Compute Service,简称 ECS)是一种简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本,使您更专注于核心业务创新。

选购服务器

从产品主页直接进入到选购页面就可以了。选择自己需要的服务器就好。主要有如下可选项:

  • 计费方式
  • 地域(服务器所在地域,考虑翻墙的请选择境外的)
  • 网络(这个比较坑,有经典网络和专有网络两种,默认的是专有网络,经典网络和专有网络部互通。 如果自己只是弄一个服务器玩玩的话选经典网络就好)
  • 实例(服务器的硬件配置)
  • 带宽
  • 镜像(服务器的操作系统)
  • 存储(默认已经有40G硬盘,不够可可以额外购买)
  • 安全设置(主要设置SSH远程连接时的用户密码)
阅读全文 »

前言

其实之前也有看过HashMap的源码,觉得自己对其中的实现原理什么的都还算是比较了解了。其实当初看的时候就没有看的多仔细,只是应付面试的问题罢了。 这不,最近有人提出个问题自救就没法回答了。

问: 我们知道,初始化 HashMap 的时候,可以使用默认的构造函数,也可以使用一个带 initialCapacity 参数的构造函数用于构造一个已知大小的实例。这样可以减少扩容时的数据转移等操作从而提高性能,那么已知需要存1000个数据,初始的 initialCapacity 应该是多少?

听到这问题的时候,脑海中大致知道有个扩容之类的与之相关,但是具体的却是不记得了,很是尴尬。所以接下来就回去再次详细的看了看 HashMap 的源码,这里作为记录,在下面的内容中会涉及解惑该问题。

注: 此篇文章的分析是基于JDK7的


阅读全文 »

说起JAVA并发编程,就不得不聊聊CAS(Compare And Swap)和AQS了(AbstractQueuedSynchronizer)。


CAS(Compare And Swap)

什么是CAS

CAS(Compare And Swap),即比较并交换。是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS有效地说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。

在JAVA中,sun.misc.Unsafe 类提供了硬件级别的原子操作来实现这个CAS。 java.util.concurrent 包下的大量类都使用了这个 Unsafe.java 类的CAS操作。至于 Unsafe.java 的具体实现这里就不讨论了。

阅读全文 »

前言

Java多线程编程中,保证线程安全通常会使用到synchronizedLock。那么合适该使用synchronized,什么时候该使用Lock呢。这个就需要我们对synchronizedLock有个清晰的了解。


Locksynchronized

synchronized 是JAVA提供的强制原子性的内置锁机制。一个synchronized有两部分:锁对象的引用 (synchronized 方法的锁,就是该方法所在对象本身),以及这个锁保护的代码块。每个Java对象都可以作为一个用于同步的锁的角色,这些内置的锁被成为内部锁,线程进入 synchronized 块之前会自动获得锁,退出、报错异常、时会释放锁。内部锁是一种互斥锁,这就是说,至多只有一个线程可以获得锁,所以被 synchronized 声明的方法或代码块至多只有一个线程可以进入。从而保证了线程安全。 大致有如下用法:

1
2
3
4
5
6
7
8
9
//作用于方法
public synchronized void synchronizedMethod(){
//do something
}

// 作用与代码块
synchronized (syncObj){
//do something
}
阅读全文 »