乐趣区

一起学习使用Spring-Cloud-Netflix之Eureka

前言

spring cloud 为互联企业构建微服务提供了一整套的技术组件,其中 Eureka 是 Spring Cloud 体系中的核心。Netfix 不是一个技术概念,它原本是国外一个视频网站的名称。这个视频网站的技术团队在微服务方向做了大量实践,并提供了很多的技术组件,Eureka 就是其中之一。笔者也是 Spring Cloud 初学者,本文从创建项目工程开始,一步一步开始讲解如何创建 eureka 服务端和客户端,一起学习,共同进步。

本文来源于我的技术博客:http://51think.net

一、什么是 eureka

我们经常看到一些互联网企业在描述其技术架构时会使用到 Eureka 一词,也听说过 Eureka 用于服务注册发现,并不清楚它是如何整合到应用层的。从代码结构上来看,Eureka 就是一个大 jar 包集合,maven 引入这个 jar 包集合,并在应用层做简单配置即可实现服务发现功能。也就是说,Spring Cloud 已经将相关功能封装的很好了,直接引用就行了,这也符合各种流行框架的宗旨,最大程度的降低非业务性的工作量,让程序员更加专注实现自己的业务功能。Eureka 这个组件是不能单独运行的,需要以 Springboot 作为应用载体,真正的部署到虚机上面才能运行。

二、创建 Eureka 注册中心

注册中心,顾名思义,类似于 zookeeper 一样,提供服务注册发现功能,即服务端的服务地址通过注册中心全部暴露给客户端,由客户端实现负载均衡。下面我们使用 idea 工具创建相关项目。
1、创建一个 maven 主工程
2、在主工程下创建一个 model, 本例中命名为 spring-cloud-eureka

3、填写 Group 和 Artifact

4、勾选 Eureka Server

5、创建完成之后的 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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-eureka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-eureka</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.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>

</project>

pom 文件中只有一个关键的 spring-cloud-starter-netflix-eureka-server 包,其实这个包下面依赖了很多子包,如下图:

6、找到 Springboot 的启动类,加上 @EnableEurekaServer 注解
@EnableEurekaServer 代表这个 springboot 应用是一个注册中心。

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);
    }

}

7、配置 application.yml

server:
  port: 8010

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

其中两个属性 registerWithEureka: false fetchRegistry: false 表明这个应用是 Eureka Server 端,而不是 Client 端。defaultZone 用来申明这个注册中心的地址,后面创建 Eureka Client 端时也要申明这个地址,以便向注册中心注册。

三、创建一个服务生产者应用

这里我们要创建一个 springboot 应用作为服务的生产者,并且能够将服务注册到注册中心。对于整个系统而言,我们创建的是一个服务端应用供客户端调用,对于 Eureka 注册中心而言,除了注册中心是 Server 角色,其他都是 Eureka Client 角色。具体过程如下:
1、创建 model 过程与创建 Eureka Server 类似, 名称为 spring-cloud-eureka-myservice
2、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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-eureka-myservice</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-eureka-myservice</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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 文件与之前的 pom 文件的差别,spring-cloud-starter-netflix-eureka-clien 组件和之前注册中心 pom 文件中的 spring-cloud-starter-netflix-eureka-server 相对应。spring-boot-starter-web 组件用来提供 web 访问能力,我们可以通过浏览器来访问后台服务。
3、使用 @EnableEurekaClient 来标注自己的身份

@EnableEurekaClient
@SpringBootApplication
public class MyServiceApplication {public static void main(String[] args) {SpringApplication.run(MyServiceApplication.class, args);
    }

}

4、配置 application.yml

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8010/eureka/
server:
  port: 8011
spring:
  application:
    name: myservice

这个配置项 spring.application.name 很重要,表明这个应用在微服务架构中的应用名称,后面的案例中我们可以通过这个名称来访问这个服务。

5、启动注册中心应用 spring-cloud-eureka
6、启动服务生产者应用 spring-cloud-eureka-myservice
7、访问 Eureka 面板
Eureka 提供一个 web 访问页面,通过这个页面我们可以看到已注册的服务列表以及注册中心应用的状态。浏览器访问 http://localhost:8010,会展现如下页面:

红框标注的部分即我们刚刚启动的 spring-cloud-eureka-myservice 应用,服务名称为 myservice。
至此,Eureka Server 端和 Client 端已经部署成功。

源码地址:https://github.com/huangyubia…

退出移动版