文章目录
1 eureka简介
1.1 什么是eureka
- 和consul、zookeeper类似,eureka是一个用户服务注册和发现的组件
- eureka分为eureka server和eureka client,eureka server是eureka服务注册中心,eureka client是eureka客户端
1.2 为什么选择eureka
在spring cloud中,可选择consul、zookeeper作为服务注册和发现,那为什么要选择eureka
- eureka完全开源,是Netflix公司的开源产品,经历了Netflix公司的生产环境的考验
- eureka和其他组件(负载均衡组件Ribbon、熔断器组件hystrix、熔断器监控组件hystrix dashboard、熔断器聚合监控turbine组件、以及网关zuul组件)相互配合,能够很容易实现服务注册、负载均衡、熔断和智能路由等功能。
1.3 eureka的基础架构
如下图:eureka的基础架构主要包括一下3种角色:
- register service: 服务注册中心,它是Eureka Server,提供服务注册和发现的功能。
- provider service: 服务提供者,它是Eureka Client,提供服务。
- consumer service: 服务消费者,它也是Eureka Client,消费服务
服务消费过程:
- 1 首先需要一个服务注册中心eureka Server,服务提供者eureka client向服务注册中心eureka server注册,将自己的信息(服务名、服务的IP地址等)通过REST API的形式提交给服务注册中心eureka server;
- 2 同样,服务消费者eureka client也向服务注册中心eureka server注册,同时服务消费者获取一份服务注册列表的信息,这样服务消费者就知道服务提供者的IP地址,可以通过HTTP远程调度来消费服务提供者的服务
1.4 eureka概念
1.4.1 register - 服务注册
当eureka client想eureka server注册时,eureka client提供自身的元数据,比如IP地址,端口、运行状况指标的url、主页地址等信息。
1.4.2 renew - 服务续约
eureka client在默认情况下每个30秒发送一次心跳进行服务续约。通过服务续约来告知eureka server 该eureka client任然可用;如果eureka server90秒没有收到eureka client的心跳,eureka server会将eureka client实例从注册列表删除。(官网不建议更改服务续约的间隔时间)
1.4.3 fetch registries - 获取服务注册列表信息
eureka client从 eureka server获取服务注册表信息,并将其缓存在本地。eureka client使用JSON格式来获取服务注册列表信息
1.4.4 cancel - 服务下线
eureka client在程序关闭是可以向eureka server发送下线请求。eureka server收到请求将其从服务注册列表中删除。该下线请求不会自动完成,需要在程序关闭时调用一下代码:
DiscoveryManager.getInstance().shutdownComponent();
1.4.5 服务剔除
默认情况下,当eureka client联系90秒没有eureka server发送服务续约(即心跳)时,eureka server会将该服务实例从服务注册列表删除,即服务剔除。
编写eureka demo
构建maven多module的结构
- IDEA 构建 可参考:https://blog.csdn.net/qiaziliping/article/details/105866892
- 结构如下
eureka-master的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qgg</groupId>
<artifactId>eureka-master</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-master</name>
<packaging>pom</packaging>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.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>
<spring-could.version>Dalston.SR1</spring-could.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-could.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
eureka-server
结构图如下:
- 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.qgg</groupId>
<artifactId>eureka-master</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<artifactId>eureka-server</artifactId>
<name>eureka-server</name>
<dependencies>
<!-- eureka-server起步依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--springboot测试起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>-->
</dependencies>
<build>
<!--springboot的maven插件,即可使用maven插件的方式来启动springboot工程-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- application.yml配置文件
在默认情况下,eureka server会向自己注册,需要配置eureka.client.registerWithEureka和eureka.client.fetchRegistry为false,防止自己向自己注册
server:
port: 8761 # 指定eureka server的端口为8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false # 客户端注册
fetch-registry: false # 客户端获取注册表
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #试了,两种方式都可以
# DEFAULT_ZONE: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
enable-self-preservation: false #关闭eureka-server的自我保护机制,默认为true
- EurekaServerApplication.java 启动文件
通过@EnableEurekaServer开启eureka server的功能
package com.qgg.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication //
@EnableEurekaServer // 开启eureka server的功能
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- eureka-server启动完成如下图
访问:http://localhost:8761/
eureka-client
结构图如下:
- pom.xml文件如下
eureka client客户端所需的依赖 spring-cloud-starter-eureka,
因为web功能的起步依赖spring-boot-starter-web,以及spring boot测试的起步依赖spring-boot-starter-test
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.qgg</groupId>
<artifactId>eureka-master</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<artifactId>eureka-client</artifactId>
<name>eureka-client</name>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.1.RELEASE</version>
</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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- application.yml配置文件
配置eureka-client的程序端口为8762
服务注册地址为http://localhost:8761/eureka/
程序名称为eureka-client22
server:
port: 8762 #eureka-client的程序端口
eureka:
client:
service-url:
DEFAULT_ZONE: http://localhost:8761/eureka/ # 服务注册地址
spring:
application:
name: eureka-client22 # 程序名称
- EurekaClientApplication.java 启动文件
通过@EnableEurekaClient开启eureka client的功能
package com.qgg.eurekaclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
- HiController.java 控制类
编写一个控制类,并通过@Value("${}")注解获取获取应用的端口号,在接口中返回该端口号
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HiController {
@Value("${server.port}")
public int port;
@GetMapping(value = "/getPort/{name}")
public String helloPort(@PathVariable String name) {
return name+"-"+port;
}
}
- eureka client启动完成如图
启动打印 如下log表示注册成功
DiscoveryClient_EUREKA-CLIENT22/liping-pc.diag.launch:eureka-client22:8762 - registration status: 204
重新刷新http://localhost:8761/,显示实例application为EUREKA-CLIENT22,status为UP(在线),端口为8762