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: registryserver: 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@SpringBootApplicationpublic 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: devserver: port: 1110eureka: 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@SpringBootApplicationpublic 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注册中心的目的就是保证服务的高可用。