0%

ConcurrentSkipListMap

底层使用的是SkipList结构,也就是跳表

SkipList

SkipList让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过以时间换空间,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的节点,从而提高效率

SkipList具备如下特性:

  • 由很多层结构组成,level是通过一定的概率随机产生的
  • 每一层都是一个有序的链表,默认是升序,也可以根据创建映射时所提供的Comparator进行排序,具体取决于使用的构造方法
  • 最底层(Level 1)的链表包含所有元素
  • 如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出现
  • 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素

跳表搜索

阅读全文 »

Feign显示fallback异常原因

我在最一开始使用Feign的时候,是使用FallBack类去实现的FeignClient接口,就像这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@FeignClient(name = "SPRINGCLOUD2-PROVIDER",contextId = "DeptClient",
fallback = DeptClient.DeptClientFallBack.class)
public interface DeptClient {

@GetMapping(value = "/dept/get/{id}")
CommonResult<Dept> get(@PathVariable("id") long id);

@GetMapping("/timeout")
String timeout();

@Component
class DeptClientFallBack implements DeptClient{

@Override
public CommonResult<Dept> get(long id) {
return null;
}

@Override
public String timeout() {
return null;
}
}
}

但是这样的话,我发现没有办法查看是因为什么原因造成的fallback呢,这种方法肯定是不行的

阅读全文 »

自定义Feign的配置

Feign的默认配置类是FeignClientsConfiguration,其内部定义了Feign默认使用的编码器、解码器、契约、重试机制等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Bean
@ConditionalOnMissingBean
public Decoder feignDecoder() {
// 解码器,将字节数组反序列化为方法返回值类型的对象,默认只支持反序列化为String和byte[]
// SpringDecoder使用消息解析器可以支持任意类型
return new OptionalDecoder(
new ResponseEntityDecoder(new SpringDecoder(this.messageConverters)));
}

@Bean
@ConditionalOnMissingBean
@ConditionalOnMissingClass("org.springframework.data.domain.Pageable")
public Encoder feignEncoder() {
// 编码器,将请求体对应的方法参数序列化为字节数组,默认的只支持参数为String和byte[]
// SpringEncoder可以将任意方法参数序列化
return new SpringEncoder(this.messageConverters);
}

@Bean
@ConditionalOnMissingBean
public Contract feignContract(ConversionService feignConversionService) {
// Contract的作用是解析方法上的注解和参数,构建Http请求需要用到的基本参数
// SpringMvcContract使得Feign能够识别SpringMvc的注解
return new SpringMvcContract(this.parameterProcessors, feignConversionService);
}

@Bean
@ConditionalOnMissingBean
public Retryer feignRetryer() {
return Retryer.NEVER_RETRY;
}
阅读全文 »

Eureka多网卡下IP选择

对于多网卡的服务器,如何指定注册到Eureka Server的IP呢

有四种方式可以使用

前提是eureka.instance.prefer-ip-address为true

忽略指定名称的网卡

1
2
3
4
5
6
spring:
cloud:
inetutils:
ignored-interfaces: #忽略eth0和以veth开头的网卡
- eth0
- veth.*

使用正则表达式指定网络地址

1
2
3
4
5
6
spring:
cloud:
inetutils:
preferredNetworks:
- 192.168
- 10.0

只使用站点本地地址

1
2
3
4
spring:
cloud:
inetutils:
useOnlySiteLocalInterfaces: true

指定IP地址

1
2
3
4
eureka:
instance:
ip-address: 127.0.0.1

Eureka元数据

Eureka的元数据有两种,一种是标准元数据,一种是自定义元数据

标准元数据

标准元数据指的是主机名、ip地址、端口号、状态页和健康检查等信息,这些信息都会被发布到服务注册表中,用于服务之间的调用

自定义元数据

自定义元数据使用eureka.instance.metadata-map来进行配置,可以在客户端discoveryClient.getInstances获取到自定义的元数据