前文
文章目录
什么是 Eureka ?
Eureka 是 Netflix 的一个子模块,也是核心模块之一。Eureka 是一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于 dubbo 的注册中心,比如 Zookeeper,Netflix 在设计 Eureka 时遵守的就是 AP 原则
Eureka 的基本架构
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册与发现(请对比 Zookeeper)
Eureka 采用了 CS 的架构设计。Eureka Server 作为服务注册功能的服务器,它是服务注册中心
而系统中的其它微服务,使用 Eureka 的客户端连接到 Eureka Server 并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其它模块(如 Zuul)就可以通过 Eureka Server 来发现系统中的其它微服务,并执行相关的逻辑
Eureka 中的组件
Eureka 包含两个组件:Eureka Server 和 Eureka Client
- Eureka Server (提供服务注册服务):各个节点启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用的服务节点的信息,服务节点的信息可以在界面中直观的看到
- Eureka Client 是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载法的负载均衡器。在应用启动后,将会向 Eureka Server 发送心跳(默认周期为 30 s)。如果 Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,Eureka Server 将会从服务注册表中把这个服务节点移除(默认周期为 90 s)
Eureka 中的三大角色
Eureka 中的三大角色有:Eureka Server、Service Provider、Service Consumer
- Eureka Server:提供服务注册与发现
- Service Provider:服务提供方将自身服务注册到 Eureka,从而使服务消费方能够找到
- Service Consumer:服务消费方从 Eureka 获取注册服务列表,从而能够消费服务
1.x 和 2.x 的对比说明(Server)
以前老版本(2018)
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
现在新版本(2020.2)
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
创建工程(Server)
先创建一个 Eureka Server 工程,提供服务注册的功能
添加依赖
<dependencies>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--boot web actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般通用配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
编写 application.yml 文件
server:
port: 7001
eureka:
instance:
hostname: localhost # Eureka 服务端的实例名称
client:
register-with-eureka: false # false 表示不向注册中心注册自己
fetch-registry: false # false 表示自己端就是注册中心,职责就是维护服务实例,并不需要去检索服务
service-url:
# 设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
编写启动类
package com.java.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author Woo_home
* @create 2020/3/25 11:33
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerMain7001 {
public static void main(String[] args){
SpringApplication.run(EurekaServerMain7001.class,args);
}
}
启动项目
访问 http://localhost:7001/,如下所示
可以发现,Eureka Server 还没有服务注册进来
1.x 和 2.x 的对比说明(Client)
同样地,Eureka Server 有对比说明,那么 Eureka Client 也有对比说明,如下:
以前的版本(不推荐使用)
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
现在新版本(推荐使用)
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
创建工程(Client)
上面例子已经建好了 Server 端,既然要有服务注册,那么就得有 Client 端
添加依赖
<dependencies>
<!--包含了sleuth+zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
编写 application.yml
server:
port: 8001
spring:
application:
# 注册的名字
name: demo-provider-payment
eureka:
client:
# 表示是否将自己注册进 EurekaServer 默认为 true
register-with-eureka: true
# 是否从 EurekaServer 抓取已有的注册信息,默认为 true,单节点无所谓,集群必须设置为 true 才能配合 Ribbon 使用负载均衡
fetchRegistry: true
service-url:
# 注册地址
defaultZone: http://localhost:7001/eureka
编写启动类
package com.java.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @author Woo_home
* @create by 2020/03/24
*/
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
public static void main(String[] args){
SpringApplication.run(PaymentMain8001.class,args);
}
}
启动项目
注意:启动 Client 端之前先启动 Server 端
再次访问 http://localhost:7001/ 刷新如下:
可以发现 8001 这个服务已经注册进来了
多个服务注册
同样地,注册多个服务,只需要创建多个 Client 就可以,如下: