eureka原理介绍
原理简介
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一
1背景介绍
服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。
有了服务中心调用关系会有什么变化,画几个简图来帮忙理解
项目A调用项目B
正常调用项目A请求项目B
有了服务中心之后,任何一个服务都不能直接去掉用,都需要通过服务中心来调用
项目A调用项目B,项目B在调用项目C
这时候调用的步骤就会为两步:第一步,项目A首先从服务中心请求项目B服务器,然后项目B在从服务中心请求项目C服务。
上面的项目只是两三个相互之间的简单调用,但是如果项目超过20个30个呢,任何一个项目改动,就会牵连好几个项目跟着重启,麻烦而且容易出错。
通过服务中心来获取服务不需要关注调用项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。
由于各种服务都注册到了服务中心,就有了去做很多高级功能条件。
1.几台服务提供相同服务来做均衡负载;
2.监控服务器调用成功率来做熔断,移除服务列表中的故障点;
3.监控服务调用时间来对不同的服务器设置不同的权重等等。
2 eureka介绍
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。
Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。
Eureka由两个组件组成:Eureka服务器和Eureka客户端。
Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。

####(1)、Eureka Server
提供服务注册和发现
####(2)、Service Provider
服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
####(3)、Service Consumer
服务消费方从Eureka获取注册服务列表,从而能够消费服务
3.eureka代码实现(简单)
配置注意情况
eureka.client.register-with-eureka :表示是否将自己注册到Eureka Server,默认为true。
eureka.client.fetch-registry :表示是否从Eureka Server获取注册信息,默认为true。
eureka.client.serviceUrl.defaultZone :设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。server服务端
(1).pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</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.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!--注意:这里必须要添加,否则各种依赖有问题-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>#####(2)main方法
@SpringBootApplication
@EnableEurekaServer
public class AppRunCloud {
public static void main(String[] args) {
SpringApplication.run(AppRunCloud.class, args);
}
}#####(3) application.yml
server:
port: 8101
spring:
application:
name: cw-server
eureka:
instance:
##注册中心的ip地址
hostname: 127.0.0.1
client:
service-url:
##注册中心地址
defaultZone: http://${eureka.instance.hostname}:8101/eureka
###自己是注册中心,是否要将自己注册到注册中心去,但是集群的时候需要设置为true
register-with-eureka: false
###自己是注册中心,不需要去检索服务信息
fetch-registry: falseclient客户端
(1).pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</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.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!--注意:这里必须要添加,否则各种依赖有问题-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>(2).main方法
@SpringBootApplication
@EnableEurekaClient
public class AppClientRun {
public static void main(String[] args) {
SpringApplication.run(AppClientRun.class, args);
}
}(3).application.properties
server.port=9200
spring.application.name=cw-order
eureka.client.service-url.defaultZone=http://127.0.0.1:8101/eureka
#注册到eureka服务器上的地址
eureka.client.register-with-eureka=true
#是否需要注册到eureka
eureka.client.fetch-register=true
#需要检索服务4.理解集群 (可以作为面试答)
(cw的理解)通过集群代码:
1.当服务器1打开后会发送心跳包连接服务器2,此时服务器1在工作,当服务器2连接成功后,服务器1和服务器2建立了集群,但实际上工作的是服务器1,服务器2休眠。
2.当服务器1断开后,服务器2发送心跳包连接服务器1,此时服务器2在工作,当服务器1连接成功后,服务器1会工作,服务器2休眠。
3.当服务器再次断开后,服务器2又处理工作状态,同时不断的发送心跳包给服务器1,当服务器1连接上时,服务器2休眠,服务器1继续工作。
5.eureka代码实现(集群)
server服务端集群
(1) pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</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.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!--注意:这里必须要添加,否则各种依赖有问题-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<description>Eureka集群</description>(2)application配置
① application.yml
#启动server1服务时,先注释掉server2配置
spring.application.name=server1
spring.profiles.active=server1
#启动server1服务时,先注释掉server1配置
#spring.application.name=server2
#spring.profiles.active=server2② application-server1.yml
server:
port: 8001
spring:
application:
name: server1
security:
user:
name: admin
password: admin
eureka:
instance:
hostname: server1
client:
registerWithEureka: true
fetchRegistry: true #表示是否从eureka服务器获取注册信息
serviceUrl:
defaultZone: http://admin:admin@server2:8002/eureka/③ application-server2.yml
server:
port: 8002
spring:
application:
name: server2
security:
user:
name: admin
password: admin
eureka:
instance:
hostname: server2
client:
registerWithEureka: true
fetchRegistry: true #表示是否从eureka服务器获取注册信息
serviceUrl:
defaultZone: http://admin:admin@server1:8001/eureka/④ host文件配置路径
由于采用了参数配置eureka.instance.hostnam及http://admin:admin@server1的写法,则需要在进行hosts的配置,
Window : 在C:\Windows\System32\drivers\etc\hosts,
Linux : /etc/host,如下图所示

(3) main方法
@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class RunServer {
public static void main(String[] args) {
SpringApplication.run(RunServer.class, args);
}
}(4)注意事项
启动第一个项目肯定会报错,因为互相注册导致无法找到另一个服务,不用惊慌,把两个服务全部启动。
访问http://127.0.0.1:8001/或http://127.0.0.1:8002/ ,
DS Replicas显示为另一个服务
application.yml:(启动两次修改此配置文件即可,server-1,和server-2分别启动一次)client客户端集群
#####(1)pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</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.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<!-- 这是因为client里不包含Tomcat的依赖,所以Spring容器无法创建一些实例,从而导致项目无法启动,只需在pom.xml文件中,加上web依赖即可 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!--注意:这里必须要添加,否则各种依赖有问题-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>#####(2) application.yml
spring:
application:
name: client
security:
user:
name: admin
password: admin
server:
port: 8101
eureka:
client:
fetchRegistry: true
registerWithEureka: true
serviceUrl:
defaultZone: http://admin:admin@server2:8002/eureka/,
http://admin:admin@server1:8001/eureka/#####(3) main方法
@SpringBootApplication
@EnableEurekaClient
public class RunClient {
public static void main(String[] args) {
SpringApplication.run(RunClient.class, args);
}
}
文章标题:eureka原理介绍
发布时间:2019-11-13, 16:08:48
最后更新:2020-03-25, 10:01:15



