@EnableEurekaServer
,但是暂时找不到它被使用的地方ApplicationEvent
,可以看出肯定会有订阅者接收该配置,配置内容就是我们application.properties里配置的属性,不配则是默认属性@EnableEurekaServer
起作用的原理@Import
它的作用就是将之后的类对象所对应的实例,实例化并加入spring容器管理@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EurekaServerMarkerConfiguration.class)
public @interface EnableEurekaServer {
}
EurekaServerMarkerConfiguration
类,可以看到如下,该类的作用仅仅用来标记下,为启动类判断是否需要启动EurekaServer@Configuration
public class EurekaServerMarkerConfiguration {
@Bean
public Marker eurekaServerMarkerBean() {
return new Marker();
}
class Marker {
}
}
@ConditionalOnBean
表示,若存在该类Bean,则启动配置生效restTemplate.getForEntity("http://eureka-server", String.class);
LoadBalancerInterceptor
loadBalancer
又是RibbonLoadBalancerClient
RibbonLoadBalancerClient
怎么注入进来的,这也简单,这里有两层关系,该LoadBalancerInterceptor
如何实例化的,和RibbonLoadBalancerClient
如何实例化并注入的,可以看如下图
RibbonLoadBalancerClient
的实现了
@SpringBootApplication
@EnableDiscoveryClient
@RestController
@Slf4j
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
/**
* 使用Ribbon的负载均衡
* @return
*/
@GetMapping("/")
public ResponseEntity<String> getTime(){
return restTemplate.getForEntity("http://eureka-server", String.class);
}
/**
* 模拟轮询负载的调用
* @return
*/
@GetMapping("/discovery")
public ResponseEntity<String> discovery(){
List<ServiceInstance> instances = discoveryClient.getInstances("eureka-server");
int i = incrementAndGetModule(instances.size());
return restTemplate.getForEntity(((EurekaDiscoveryClient.EurekaServiceInstance) instances.get(i)).getInstanceInfo().getHomePageUrl(), String.class);
}
private AtomicInteger nextIndex = new AtomicInteger();
private int incrementAndGetModule(int module) {
for (; ; ) {
int current = nextIndex.get();
int next = (current + 1) % module;
if (nextIndex.compareAndSet(current,next) && current < module) {
return current;
}
}
}
/**
* 加上@LoadBalanced该注解使用的Ribbon的负载均衡算法
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
discoveryClient
实现最简单的模拟轮询算法@LoadBalanced
注掉