上一篇文章Eureka(六)——服务消费的例子中,实现了对服务名为eureka-client
的/dc
接口的调用。由于RestTemplate
被@LoadBalanced
修饰,所以它具备客户端负载均衡的能力,当请求真正发起的时候,url中的服务名会根据负载均衡策略从服务清单中挑选出一个实例来进行访问。
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor
继承ThreadPoolExecutor
类,实现ScheduledExecutorService
接口。它是一个支持定时执行或者延时执行的线程池。
Eureka(四)——server实现细节
上一篇文章Eureka(三)——client注册过程中,我们详述了Eureka Client是如何完成注册、续约、获取服务、下线等操作的。本篇文章,我们来记述Eureka Server是如何工作的。
wait、notify、notifyAll和Condition
经典的生产者-消费者模型是线程之间协作的典型应用:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待期间,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态。然后等待消费者消费了商品,然后消费者通知生产者队列有空间了。同样的,当队列空时,消费者也必须等待,等待生产者通知它队列中有商品了。这种互相通信的过程就是线程间的协作。
Java中线程协作的最常见的两种方式:利用Object.wait()
、Object.notify()
和使用Condition
Eureka(一)——服务注册与发现
微服务架构就是将一个完整的应用从一个完整的应用从数据存储开始垂直拆分成多个不同的服务,每个服务都能独立部署、独立维护、独立扩展,服务与服务间通过诸如RESTful API的方式互相调用。
服务注册与发现是微服务架构的核心功能,本文将尝试实现一个简单的服务注册与发现的demo。
Spring Cloud的系列博客使用的Spring-boot版本为2.0.1.RELEASE,Spring-cloud版本为Finchley.RC1
Guava Multimap
有时候我们需要这样的数据类型Map<String, CollectionMultimap
就是为了解决这类问题的。
Multimap
提供了丰富的实现,所以你可以用它来替代程序里的Map<K, Collection
实现 | Key实现 | Value实现 |
---|---|---|
ArrayListMultiamp | HashMap | ArrayList |
HashMultimap | HashMap | HashSet |
LinkedListMultimap | LinkedHashMap | LinkedList |
LinkedHashMultimap | LinkedHashMap | LinkedHashSet |
TreeMultimap | TreeMap | TreeSet |
ImmutableListMultimap | ImmutableMap | ImmutableList |
ImmutableSetMultimap | ImmutableMap | ImmutableSet |
上述Multimap
的实现都是线程不安全的,如果想要创建线程安全的Multimap
需要调用Multimaps.synchronizedMultimap(Multimap<K, V> multimap)
方法将multimap包装成线程安全的版本。