目录
一、新建 Eureka Server 的 Module microservicecloud-eureka-7001
二、新建 Eureka Provider Module microservicecloud-provider-dept-8001
前言
Eureka是Spring Cloud 全家桶中的一个技术组件。是Netflix的一个子模块,也是核心模块之一。
它是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册和发现,只需要使用服务的标识符,就可以访问服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper。
原理解析
一、Eureka的地位
Spring Cloud封装了Netflix公司开发的Eureka模块来实现服务注册和发现。
二、C-S设计架构
1.Eureka Server: Eureka采用了C-S的设计架构,Eureka作为服务注册功能的服务器,是服务注册中心。
2.系统中的其他微服务 :使用Eureka的客户端Eureka Client连接到Eureka Server并维持心跳连接。这样系统的维护人员可以通过Eureka Server监控系统中各个微服务是否正常运行。Spring Cloud的一些其他模块(zuul)可以通过Eureka Server发现系统中其他微服务,并执行相关的逻辑。
三、架构图
左边图是Eureka的架构图,对比右边zookeeper的架构图。
Eureka包含两个组件:Eureka Server和Eureka Client
1.Eureka Server 提供服务注册服务
各个节点启动后,会在Eureka Server中进行注册,Eureka Server中的服务注册表会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
2.Eureka Client
是一个java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表把这个服务节点移除(默认90秒)
四、三大角色
- Eureka Server 提供服务注册与发现
- Eureka Provider (Eureka Client) 服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
- Eureka Consumer(Eureka Client) 服务消费方从Eureka获取注册服务列表,从而能够消费服务。
搭建Eureka环境
需要建立一个maven项目,在idea或eclipse环境下都可以,建立一个项目microservicecloud,之后进行下面的操作,在pom.xml文件中,引入相应的依赖
<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.atguigu.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
一、新建 Eureka Server 的 Module microservicecloud-eureka-7001
1.引入依赖
<dependencies>
<!--eureka-server服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
2.配置启动项
建立一个包,在包下面创建Java类 EurekaServer7001_App,并添加相应的注解@EnableEurekaServer @SpringBootApplication
@SpringBootApplication
@EnableEurekaServer // EurekaServer服务器端启动类,接受其它微服务注册进来
@EnableDiscoveryClient //服务发现
public class EurekaServer7001_App
{
public static void main(String[] args)
{
SpringApplication.run(EurekaServer7001_App.class, args);
}
}
3.配置application.yml文件
server:
port: 7001
eureka:
instance:
hostname: eureka7001 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://localhost:${server.port}
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
server:
# enable-self-preservation: false # 关闭自我保护模式
eviction-interval-timer-in-ms: 3000
二、新建 Eureka Provider Module microservicecloud-provider-dept-8001
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2.启动类 添加注解
@SpringBootApplication
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
public class DeptProvider8001_App
{
public static void main(String[] args)
{
SpringApplication.run(DeptProvider8001_App.class, args);
}
}
3.配置文件application.yml
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: microservicecloud-dept8001
prefer-ip-address: true #访问路径可以显示IP地址
lease-renewal-interval-in-seconds: 30000
lease-expiration-duration-in-seconds: 90000
启动项目验证
Eureka Consumer module创建类似 Eureka Provider。先测试服务注册和发现功能:
1.启动 Eureka Server端 microservicecloud-eureka-7001,如下所示
2.启动 Eureka Client端 microservicecloud-provider-dept-8001,如下所示
Eureka 中完善服务信息
一、修改注册服务的名称
二、actuator 与注册微服务信息完善
1.微服务info内容详细信息修改
(1)本服务pom文件添加依赖:
<!-- actuator监控信息完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2) 父工程pom文件添加
<build>
<finalName>microservicecloud</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
(3)本服务的application.yml文件修改
info:
app.name: atguigu-microservicecloud
company.name: www.atguigu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
(4)效果图
三、Eureka 自我保护
原因:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。
具体的配置如下,在Eureka服务端,禁用Eureka的自我保护模式。
设置心跳检测,及时踢出实际未注册的服务
1.Eureka Server端
在文件application.yml中,添加最下面的两个属性server下面的,关闭自我保护模式
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port} #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
server: # 关闭自我保护模式
enable-self-preservation: false
eviction-interval-timer-in-ms: 3000
2.Eureka Client 端
在文件application.yml中,添加最下面的两个属性lease开头的
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://eureka7001.com:7001/eureka
instance:
instance-id: microservicecloud-dept8001
prefer-ip-address: true #访问路径可以显示IP地址
lease-renewal-interval-in-seconds: 5 # 租约续订间隔时间(默认30秒),如下所示每间隔 5s 向服务端发送一次心跳,证明自己依然"存活"
lease-expiration-duration-in-seconds: 10 # 租约到期时间(默认90秒),如下所示,告诉服务端如果我 10s 之内没有给你发心跳,就代表我"死"了,将我踢出掉
小结
最后简单对比一下Zookeeper与Eureka:
Zookeeper 保证CP
Eureka 保证AP