Spring Cloud 快速入门系列之 Eureka-注册中心

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注册中心的目的就是保证服务的高可用。