Eureka在spring cloud中的作用是服务发现。
当我们采用微服务开发,项目中的服务特别多,就需要一个机制来发现应用中所有的服务,方便调用,Erueka就是起到了服务发现的作用。
所有服务启动后,都向Eureka注册自己(除了Eureka自己),这样,在Eureka中就有了当前应用中所有的服务列表,这样每个服务都可以向Eureka询问,自己需要的服务在哪。
总结Eureka的核心作用就是两个,服务的注册与发现。
服务注册与发现,就涉及到了两个角色,一个是Server,一个是Client。我们来演示一下,如何搭建一个Eureka服务端,并建立一个客户端向服务端注册服务。
Eureka注册中心Server实现
1、新建一个maven项目,名叫registry,继承自spring boot,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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>registry</artifactId>
<groupId>com.itzhimei</groupId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR5</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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</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>
pom里最重要的一个配置就是:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
引入了一个Eureka Server的依赖
2、新建配置
在resource下新建4个文件(spring boot相关知识):
bootstrap.yml
bootstrap-dev.yml
bootstrap-prod.yml
bootstrap-test.yml
bootstrap.yml配置如下,相当于使用dev环境配置
spring:
profiles:
active: dev
bootstrap-dev.yml配置如下:
spring:
application:
name: registry
server:
port: 1111
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
serviceUrl:
defaultZone: http://localhost:${server.port}/eureka/
server:
# 设为false,关闭自我保护
enable-self-preservation: true
# 清理间隔(单位毫秒,默认是60*1000)
eviction-interval-timer-in-ms: 4000
我们来讲解一下上面的配置:
这是声明当前的服务的名称
spring:
application:
name: registry
声明服务所用端口
server:
port: 1234
不向Eureka注册,因为自己就是注册中心
register-with-eureka: false
不获取注册信息
fetch-registry: false
服务识别地址
defaultZone: http://localhost:${server.port}/eureka/
3、启动入口类
package com.itzhimei.registry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class RegistryApplication {
private static final Logger LOGGER = LoggerFactory.getLogger(RegistryApplication.class);
public static void main(String[] args) {
SpringApplication.run(RegistryApplication.class, args);
LOGGER.info("注册中心启动完成...");
}
}
这里有一个重要的注解@EnableEurekaServer,使用了这个注解,就表示当前项目是一个注册中心服务。(spring cloud的微服务开发就是这样简单,并不需要我们做过多的代码开发,只需要一个注解,对应功能微服务就有了。)
完成以上操作,就可以启动Eureka服务了,启动即可以i在IDE中启动,也可以把项目打成jar包启动,我这里使用的IDE,启动后访问本地1111端口:http://localhost:1111/
这里能看到所有注册到当前Eureka的所有服务,当前还没有服务注册,我们来写一个测试项目,注册到Eureka。
至此Eureka的服务端就完成了,接下来我们配置一个客户端,向服务端注册自己。
1、配置一个名叫service-a的项目,pom文件如下:
<?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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-a</artifactId>
<groupId>com.itzhimei</groupId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR5</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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</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>
这里pom文件中引入了一个Eureka的client依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、客户端位置文件
bootstrap.yml
spring:
application:
name: service-a
profiles:
active: dev
server:
port: 1110
eureka:
instance:
prefer-ip-address: true #注册时使用ip地址
bootstrap-dev.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/
这里就指定了Eureka服务的地址,当这个客户端服务启动时,会向这个服务中心注册自己。
3、启动入口类
package com.itzhimei.servicea;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceAApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAApplication.class, args);
}
}
这里使用了@EnableDiscoveryClient注解,表示当前服务就是一个Eureka的客户端,会向服务端注册自己。
service-a启动后,向Eureka注册
我们随便写一个测试方法,访问测试项目service-a地址:http://localhost:1110/getName
页面输出:名字是:张三
到这里Eureka的入门课程已经完成,动手试一试。
当然,这里讲解的还只是最简单的内容,你还可以试一试启动多个Eureka注册中心,让你的微服务同时向多个Eureka注册中心注册。多个Eureka注册中心的目的就是保证服务的高可用。