前言
在我们的RPc框架中,微服务之间的注册,发现,治理,监控等统一管理是一个十分重要的环节。可以说在任何的RPC的框架中,都必须有一个服务注册中心。而我们当前流行的几种服务注册发现的Eureka、zookeeper、consul、Nacos我们需要比较深层次的了解,从而在实际应用选型时找到我们所适合的服务。
什么是服务注册中心
用于微服务架构中服务的注册、发现、管理、调用、负载均衡等功能的服务就是服务注册中心。
为什么需要服务注册中心
在微服务架构中,或者说RPC远程调用框架中,微服务之间的关系紧密而复杂,此时对于服务调用、负载均衡、服务监控等功能统一的管理就十分有必要了。这就是我们使用服务注册中心的原因。
什么是服务注册发现
对于我们的服务注册中心来说,一般都是采用CS架构,即服务注册发现的Server端和Client端。Client的微服务将自己的信息发送给Server端的操作就是服务注册的操作。其他的client端通过server端获取到其他client端信息的操作就叫做服务发现。
以Eureka为例,Eureka的client具备一个内置的、使用轮询算法的负载均衡器,在client注册到Eurekaserver上后,会默认每隔30s发送心跳(可配置修改),如果在默认次心跳周期内没有获得某个client的心跳,那么EurekaServer会将此client移除。
Eureka
那我们从Eureka说起。
关于pom依赖
打开maven的远程仓库:
mvnrepository.
引入EurekaServer的pom有三个:
spring-cloud-starter-eureka是使用最多的依赖,但是最近的更新时间是2019年3月23日,备注信息里也说明了是一个过期的依赖,建议使用(deprecated, please use spring-cloud-starter-netflix-eureka-server),所以本次我们使用的就是推荐版本。
spring.factories
在很多的springboot的源码中,常见到spring.factories文件,那么这个文件是用来做什么的呢?
先给出定义:
在构建大型项目的时候,有时你可能会引入一个外部依赖包(类似spring-boot-starter-xxx)。主项目添加这个外部依赖包后,这个外部依赖包里面的bean如果需要自动加入主项目的spring容器中(而不是手动添加@Bean实例化)的时候,需要使用spring.factories。
@SpringBootApplication
这个springboot的启动项注解大家都不陌生
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@Filter(
type = FilterType.CUSTOM,
classes = {
TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {
AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {
};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {
};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {
};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {
};
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
这个注解的内容十分丰富,我们在这里关注一点就是自动配置的这个注解@EnableAutoConfiguration。在这个springboot的项目中,ComponentScan注解已经将当前项目中配置的@Bean,@Component等Bean都注入到spring容器中。而外部的Bean的注入就需要EnableAutoConfiguration注解来做。
@EnableAutoConfiguration
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({
AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {
};
String[] excludeName() default {
};
}
AutoConfigurationImportSelector
protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
configurations = removeDuplicates(configurations);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions