Spring Cloud Eureka
作用:构建服务注册中心、服务注册与发现,对微服务应用实例化的自动化管理。
场景:最初,微服务系统数目不多时,我们通过做一些静态配置来完成服务的调用。但是后来系统功能越来越复杂,服务数目不断增加,集群规模、服务的位置和命名等都可能发生变化,那么静态配置就越来越难以维护,继续使用手工维护就会消耗大量的精力且易出错。
1. 服务注册
服务注册中心:每个服务单元向服务注册中心登记自己提供的服务,包含主机和端口号、版本号、通信协议等。当这些服务的进程启动后,注册中心就会维护这些服务的服务清单,并以心跳方式监测服务的可用性,不可用就从服务清单中剔除。
2. 服务发现
服务A希望调用服务B --> A向注册中心发起咨询服务请求 --> 服务注册中心返回B服务的所有位置清单给A --> A以某种轮询策略取出B的一个位置来进行服务调用。
但实际上为了性能等原因,不是每次都向服务注册中心获取服务清单,会采取一些缓存策略,这里只是简单说明了服务治理逻辑,不做深入讲解。
Spring Cloud Eureka 包含了服务端组件和客户端组件。
- Eureka服务端:服务注册中心,支持高可用。
- Eureka客户端:处理服务注册与发现。
3. 搭建服务注册中心:
<1> 新建子模块EurekaServer ,在pom.xml中引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<2> 配置Eureka Server
默认情况下,Eureka server 也是一个Eureka client,必须要指定一个server,配置如下(resources\application.yml):
server:
port: 1111
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #代表不向注册中心注册自己
fetch-registry: false #由于注册中心的职责就是维护服务实例,它并不需要去检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
<3> 启动服务注册中心
通过@EnableEurekaServer注解启动服务注册中心提供给其他应用进行对话 :
@EnableEurekaServer //启动一个服务注册中心提供给其他应用进行对话
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
在完成了上面的配置后,启动应用并访问http://www.localhost:1111/, 即可访问注册中心,如果有服务已经注册,面板中会显示注册应用的信息:
至此,一个简单的服务注册中心搭建完毕。
4. 服务注册:
<1> 新建子服务a_service,在pom.xml中引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
<2> 配置服务注册信息(resources\application.yml):
server:
port: 8180 #服务的端口
spring:
application:
name: aService #服务命名, 注意:不能使用下划线等!
eureka:
client:
service-url:
defaultZone: http://localhost:1111/eureka/ #指定服务注册中心的地址
其中,spring.application.name服务名称,之后服务与服务之间的相互调用一般都是根据这个值。
<3> 激活服务发现
在主类中添加注解@EnableEurekaClient,来激活服务发现,使得服务可以被发现和调用:
@EnableEurekaClient //激活服务发现
@SpringBootApplication
public class AServiceApplication {
public static void main(String[] args) {
SpringApplication.run(AServiceApplication.class, args);
}
}
完成上面配置后,启动服务注册中心服务以及aService服务,再次打开注册中心http://localhost:1111/eureka/,会看到aService已经出现在服务列表中:
5. 服务调用示例:
<1> 在aService中新建文件HelloControl.java,添加hello方法:
@SpringBootApplication
@RestController
public class HelloControl {
@Value("${server.port}")
private String port;
@RequestMapping("/hello")
public String hello(@RequestParam String name) {
return "Hello " + name + ", I am from: " + port;
}
}
<2> 浏览器中访问:http://localhost:8180/hello?name=Tom,得到结果如下:
点击此处获取: 示例代码