随着业务的发展,微服务应用也随之增加,这些服务的管理和治理会越来越难,并且集群规模、服务位置、服务命名都会发生变化,手动维护的方式极易发生错误或是命名冲突等问题。而服务治理正是为了解决这个问题,服务治理是微服务架构中最为核心和基础的模块,它主要实现各个微服务实例的自动化注册和发现。
服务注册
在服务治理框架中,都会构建一个或多个服务注册中心。
每个服务模块向注册中心登记自己所提供的服务,将主机host、端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按服务名分类组织服务清单。
服务注册中心还需要以心跳的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,达到排除故障服务的效果。
服务发现
服务间调用不再通过指定具体实例地址来实现,而是通过向服务名发起请求调用实现。
服务调用方需要先从服务注册中心获取所有服务的实例清单,才能实现对具体服务实例的访问。
服务调用方在发起调用时,会以某种策略取出一个具体的服务实例进行服务调用(客户端负载均衡)。
在生产环境中为了考虑性能等因素,不会采用每次都向服务注册中心获取服务的方式,并且不同的应用场景在缓存和服务剔除等机制上也会采用不同的实现策略。
Spring Cloud Eureka
Spring Cloud Eureka 是基于 Netflix Eureka 来实现服务注册和发现的。它主要包括两个组件:
Eureka Server(服务端):服务注册中心,支持高可用配置,依托于强一致性提供良好的服务实例可用性,服务注册中心之间可以通过异步模式互相复制各自的状态。
Eureka Client(客户端):处理服务的注册与发现,客户端可以通过注解和参数配置的方式实现注册与发现,客户端向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约,Eureka客户端从服务端查询当前注册的服务信息并把它们缓存到本地并周期性的刷新服务状态。
Eureka 基础架构
服务注册中心(Eureka Server):服务端,提供服务注册和发现功能。
服务提供者(Service Provider):提供服务的应用,将自己提供的服务注册到 Eureka Server,供其他应用发现。
服务消费者(Service Consumer):消费者应用从 Eureka Server 获取服务列表,从而调用对应的服务(ribbon或者feign)。
基础架构图


快速搭建服务注册中心(Eureka Server)
1. 创建 Spring Boot 项目,添加依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. @EnableEurekaServer 注解启动服务注册中心
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaServerApplication.class, args);
}
}
3. 配置文件 application.properties
server.port=9999
#eureka
eureka.instance.hostname=127.0.0.1
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.client.register-with-eureka:当前应用为服务注册中心,所以设置为false,代表不向注册中心注册自己。
eureka.client.fetch-registry:注册中心的职责主要是维护服务实例,所以设置为false,代表不去检索当前应用的服务。
eureka.client.serviceUrl.defaultZone:用于与 Eureka Server 交互的地址,注册服务和发现服务都需要依赖这个地址。
4.启动应用,访问::9999/