一、 什么是Eureka
在上一篇我们谈到,零散的微服务需要个大管家,来管理,那么这个服务注册的管家,就是Eureka
了。他是用来主管服务的注册与发现类似于zookeeper。它是C-S结构的,基于客户端和服务器端。Eureka Client
是他的客户端,主要用简化跟Eureka Server
的交互。Eureka Server主要负责服务的注册。
Eureka中的三大角色:
- Eureka Server:服务的注册与发现
- Service provider 服务的提供者,将服务注册到Eureka,当中
- Servce consumer 服务发消费者 ,从Eureka服务列表中获得服务,然后进行消费
二、工程的代建
这篇文章 我们只需要对三个模块进行操作
创建microservice_eureka_7001
改造microservice_product_provider8001
改造microservice_product_consumer80
(1) Eureka Server微服务的创建
在父工程下,新建一个模块microservice_eureka_7001
,这个模块是Eureka
的服务中心。创建过程如正常maven模块。
创建完成之后。
1、引入相关依赖
<?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">
<parent>
<artifactId>microservice</artifactId>
<groupId>com.kuke</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microservice_eureka_7001</artifactId>
<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>
</project>
2、进行配置application.yml
server:
port: 7001 #服务端口名称
eureka:
instance:
hostname: eureka7001
client:
fetch-registry: false # 不用检索服务 自己是注册中心
register-with-eureka: false #不向注册中心注册自己
service-url:
defaultZone: http://eureka7001:7001/eureka
为了后面区分多个eureka,我在本机的hosts文件中进行了配置,将eureka7001 映射到了127.0.0.1
fetch-registry: false
不用检索服务 自己是注册中心,因为这个服务是Eureka-server,主要是用来注册的,所有不需要去发现另外的服务
register-with-eureka: false
不用像注册中心自己。自己就是注册中心。就好比房东去收房租,他的租户需要向他缴纳房租,但是他自己确不需要。
defaultZone: http://eureka7001:7001/eureka
配置注册中心的地址
3、编写主启动类Eureka7001Application
添加注解@EnableEurekaServer
标识这是一个注册中心的服务端。
@EnableEurekaServer
@SpringBootApplication
public class Eureka7001Application {
public static void main(String[] args) {
SpringApplication.run(Eureka7001Application.class,args);
}
}
4、访问http://eureka7001:7001
浏览器显示这个,那么就说明Eureka的注册服务中心已经搭建成功了。
(2)Service provider服务的提供者的创建
我们就直接对上一篇文章中创建的microservice_product_provider8001
进行改造。
1、引入相关依赖(这个我们创建改工程的时候已经引入)
<!--引入eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
2、增加配置
eureka: #设置eureka注册服务的地址
client:
service-url:
defaultZone: http://eureka7001:7001/eureka/
instance:
instance-id: microservice-provider-dept-8001 #配置服务的别名
prefer-ip-address: true # 注册的时候使用ip注册
3、注解开启Eureka客户端
//在启动类上标注
@EnableEurekaClient //开启服务注册功能
4、修改完成之后,启动microservice_product_provider8001(Eureka-server注册中心这个服务要一直保持开启)
在此访问服务注册中心的地址http://eureka7001:7001
我可以发现,有一个服务名为MICROSERVICE-PROVIDER
,在注册中心列表。其实这个服务名就是我们在下面配置的。
spring:
application:
name: microservice-provider
所以我们现在知道这个name,就是我们对外暴露服务的名字。我们还发现,他有红色的警告提示,至于原因。我下面会介绍。
(3)Servce consumer 服务发消费者
这个也就是Eureka的第三部分,服务的消费者。有服务注册到了注册中心,需要有另外的服务去消费。那么这个消费者如何才能找到注册中心呢,所有这也要进行相关的配置。步骤与创建Eureka服务的提供者大致相同,
对改造microservice_product_consumer80
模块进行改造
1、引入相关依赖(这个我们创建改工程的时候已经引入)
<!--引入eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
2、增加配置
eureka:
client:
service-url:
#eureka发现服务的列表
defaultZone: http://eureka7001:7001/eureka
#自己不能注册 自己只需要通过eureka发现服务
register-with-eureka: false
instance:
appname: microserviceconsumer
#使用ip索取服务
prefer-ip-address: true
3、注解开启Eureka客户端
//在启动类上标注
@EnableDiscoveryClient
关于eureka的自我保护机制:
Eureka遵守AP(高可用,分区容错性),Eureka各个节点都是平等的,几个节点挂点,不会影响的剩余的节点提供服务。只要有Eureak服务还在工作,当Eureka-client向某个eureka节点注册或查询服务时如果发现连接失败,就会自动连接到其他eureka服务器,只不过查询到是数据可能不是最新的(因为eureka无法保证数据的一致性),在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有
接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。如果在15分钟内,超过85%节点没哟正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障。
自我保护机制:
1、Eureka不会从注册列表中移除长时间没有心跳的服务(好死不如赖活着)。
2、Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他的节点当中。
3、当网络稳定时候,当前新实例的注册信息会被同步到其他节点当中
这样消费者也就配置好了。但是消费者通过哪种方式来访问注册中心的服务呢。那么这就就把这个问题的详细解答留给下一篇博客。
(先剧透一下:其实也是使用RestTemplate,但是带有Ribbon功能的)