Spring Cloud微服务(2)之 注册中心Eureka

时间:2022-03-27 16:25:43

1.介绍

微服务架构中一个最重要的部分就是服务管理,而服务管理就是通过注册中心来实现的,注册中心可以说是最核心的一个组件,以至于离了哪个组件都可以,但是唯独不能缺

少注册中心。有没有注册中心甚至可以作为评判一个架构到底是不是微服务的标准。

Eureka Server是服务注册中心,提供服务注册功能,采用客户端发现模式。每一个实例被启动时,根据配置,它会注册到Server上,同时它的网络地址会被写到注册表

上,这样Eureka Server中就有了所有服务实例的信息。在这个过程中Server端暴露出一个地址,然后所有的client都向这里注册。

当服务端发现时,服务端要包含业务逻辑,这时它是中心化的,比较而言,客户端发现更灵活,是去中心化的,轻量、耦合更少。有了服务发现之后就可以统一向外提供服

务。同时Eureka提供了仪表盘功能,通过Eureka的监控页面,可以在页面中直观的看到所有服务的状况。为了保证服务的可用性,通过Eureka的心跳机制,当某个节点服务在

规定时间内没有发送心跳信号时,或者当服务实例终止时,Eureka会从服务注册表中把这个服务注册点移除,这个服务实例注册表通过心跳机制动态更新。


2.如何使用

第一步:创建注册中心服务端工程eureka-server (名称自定义)

Spring Cloud微服务(2)之 注册中心Eureka

(1)pom.xml增加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.hole</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>eureka-server</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>


</project>

application.yml配置增加:

server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:8761/eureka/

配置了端口8761,所有服务实例向这个地址进行注册。因为这个是注册中心的Server,它不需要向自己注册,所以registerWithEureka和fetchRegistry都设成false。

(2)服务端代码

package com.hole;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

其中:@EnableEurekaServer 注释生命这个类是 Eureka 的 Server

启动服务,通过浏览器访问 http://localhost:8761/,可以看到注册中心的 Server 已经成功启动。

Spring Cloud微服务(2)之 注册中心Eureka

这是Eureka自带的监控界面,相当于电影院里滚动显示的大屏。电影院相当于一个服务发现中心,每一个场次的电影都是一个服务,观众是服务调用方来消费这些服务的

。电影院的大显示屏上回滚动显示当前可供观看的电影场次,上面显示的电影就是可供调用的服务,上面没有的影片就是已经下线的服务。我们可以很直观的看出服务的状态,

哪些可用,哪些不可用。


第二步:注册中心客户端工程 eureka-client

Eureka 客户端进行服务实例注册和注销。

(1)pom.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.hole</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>eureka-client</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>


</project>

(2)代码增加一行注解 @EnableDiscoveryClient

通过@EnableDiscoveryClient 打开开关,这个服务就可以被注册中心发现

package com.hole;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}

(3)application.properties配置增加。

spring.application.name=eureka-client
server.port=8763
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
eureka.instance.lease-renewal-interval-in-seconds=50
eureka.instance.lease-expiration-duration-in-seconds=30

lease-renewal-interval-in-seconds、expiration-duration-in-seconds 这两个是自己设置的轮询时间,上面的50和30是在实际项目中设置的值,如果不设置系统有默认值。
 lease-renewal-interval-in-seconds 解释:
客户端每隔多少秒发送心跳给服务端,表明客户端还活着,默认30秒。

lease-expiration-duration-in-seconds 解释:

注册中心在规定时间内没有收到服务心跳,那么注册中心会判定这个服务失利,让这个服务出局。默认90秒。

(4)启动服务,启动成功后,刷新 服务注册中心仪表盘,就可以看到服务注册到上面了。


Spring Cloud微服务(2)之 注册中心Eureka