一、Eureka是什么
Eureka是Spring Cloud中用于服务注册与发现的组件,类似于Zookeeper
二、Eureka中的组成
1.Eureka Server
即Eureka服务端,是服务注册中心
2.Eureka Client
即Eureka客户端,包括服务提供者(服务生产者)和服务消费者(服务调用者)
(1) 客户端操作
- 注册服务(register):向注册中心注册服务(向注册中心报告客户端的IP、端口、运行状态指标的URL等)
- 心跳报告(renew):每隔一段时间(默认为30秒)向注册中心发送一次心跳报告以完成服务续约。(注册中心在一定时间(默认为90秒)内,未收到心跳报告,则认为该客户端不可用,会从服务注册列表中剔除该客户端)
- 获取服务注册列表(fetch registries):获取所有的在注册中心注册的客户端列表
- 下线(cancel):客户端向服务端自动要求下线,注册中心收到下线通知后,会将该客户端从服务列表中剔除掉
(2)客户端分类
- 服务提供者:提供接口服务的客户端
- 服务调用者:调用接口服务的客户端
- 首先从注册中心获取到相应的服务注册列表
- 远程调用服务提供者的服务(通过客户端负载均衡组件选择服务注册列表中某个客户端进行调用)
三、Eureka主要应用配置说明
# Eureka服务器相关配置说明
server:
port: 8001
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- server.port : 开放服务的端口
- eureka.instance.hostname : Eureka服务器主机的名称
- eureka.client.register-with-eureka : 当前开启的客户端(就是当前开启的服务)是否注册到Eureka(注册中心不需要注册,因为当前本身就是Server,因此不需要注册到Eureka)
- eureka.client.fetch-registry: 当前的服务是否要从Eureka获取注册信息(注册中心不需要获取,因为本身是Server,所以不需要向自己获取服务注册信息)
- eureka.client.service-url.defaultZone: Eureka注册中心提供服务的地址
四、Eureka注册服务实践
1.启动Eureka的Server端(即开启注册中心的服务)
(1)maven主要依赖
- spring boot:整个Spring Cloud都是基于Spring boot这个WEB框架
- eureka-server:Eureka的server端包,具体包为spring-cloud-starter-netflix-eureka-server
a)打开idea后,依次点击File->New->Project
b)选择Spring Initializr
c)填写maven需要的基础配置
d)因为这里是注册中心组件,所以使用Cloud Discovery
e)后面的直接Next即可,直到Finish
maven详细配置如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.github.shixinke.spring.cloud</groupId>
<artifactId>item-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>item-eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<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/milestone</url>
</repository>
</repositories>
</project>
(2)应用配置
server:
port: 8001
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
注:
eureka.client.register-with-enreka
和eureka.client.fetch-registry
这两个配置项一定要设置为false,因为它本身就是注册中心,不存在自己向自己注册和获取服务注册列表信息的情况eureka.client.service-url.defaultZone
这个选项单词不要写错
(3)服务启动类
与其他基于Spring Boot的WEB项目相比,多了一个 @EnableEurekaServer
的注解
package com.github.shixinke.spring.cloud.itemeureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class ItemEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(ItemEurekaApplication.class, args);
}
}
启动服务即可,注册中心服务就启动了
(4)查看服务注册情况
在浏览中输入在配置中设置的服务地址,如http://localhost:8001
,正常的话,可以看到以下的界面:
- 主要是看客户端列表信息,由此可以判断服务(客户端)是否成功注册到server端(这里的信息有一定延迟性,并非实时统计)
2.开启服务提供者的服务
(1)添加maven主要依赖
- Spring Boot
- Eureka Client:具体是spring-cloud-starter-netflix-eureka-client
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.github.shixinke.spring.cloud</groupId>
<artifactId>item-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>item-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring.cloud.version>Finchley.SR2</spring.cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(2)应用配置
- eureka.client.service-url.defaultZone:标注注册中心的地址
- spring.application.name:指明应用的名称
server:
port: 8002
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
spring:
application:
name: item-provider-1
(3)应用启动类
- 与常用的Spring Boot应用区别就是多了一个
@EnableEurekaClient
的注解
package com.github.shixinke.spring.cloud.itemprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ItemProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ItemProviderApplication.class, args);
}
}
(4)定义控制器方法(对外提供的接口)
与普通的Spring boot应用中的控制器没有任何区别
package com.github.shixinke.spring.cloud.itemprovider.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/health")
public class HealthCheck {
@Value("${server.port}")
private int serverPort;
@Value("${spring.application.name}")
private String appName;
@RequestMapping("/check")
public String check() {
return String.format("Server running on port:%d, application name is %s", serverPort, appName);
}
}
(5)启动服务,如果成功注册,可以在注册中心的控制台上看到相应的信息
3.开启服务调用者的服务
服务调用者作为Eureka的客户端,与服务提供者步骤是完全相同的,参考上一节的步骤,只需要将应用名称修改为自己的名称即可