admin

Spring boot 之 Eureka 服务注册与发现
简介使用翻译软件对Eureka进行翻译,有发现了;找到了的意思,它是一个服务注册与发现的组件,与其类似的有Zook...
扫描右侧二维码阅读全文
07
2018/07

Spring boot 之 Eureka 服务注册与发现

简介

使用翻译软件对Eureka进行翻译,有发现了;找到了的意思,它是一个服务注册与发现的组件,与其类似的有ZookeeperConsul,它是Netflix公司的一个开源组件,在 Spring boot 中使用非常简单。Eureka使用的是http协议进行的服务提供。

使用

使用过Zookeeper的都知道,服务注册与发现都需要先启动Zookeeper服务端,Eureka也不例外,下面简单来搭建配置一个Eureka服务端,新建Maven项目,除了Spring boot基础依赖,需要添加Eureka组件的stater依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

依赖包含了 spring boot web 的 starter,所以添加上面依赖后 spring boot web starter 可以不用添加了。
此处有坑,贴上完整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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</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>

如果你是用 IDEA 新建的Spring boot项目,默认parent节点中spring-boot-starter-parent的版本是最新的,当前我新建的时候是2.0.3,当我做完所有配置兴致冲冲地运行程序时,一个奇怪的报错出来了,一堆看不懂的东西,只是说classpath有问题,根本无从下手,最后把上面的版本改为1.5.8,顺利运行。
application.properties配置使用Eureka组件:

server.port=8888

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

由于客户端配置与上面也是大同小异,Eureka默认会自己向自己注册,所以作为服务端,需要将registerWithEurekafetchRegistry设置为false
接下来新建Spring boot工程的启动类EurekaServerApplication:

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

只要一个@EnableEurekaServer注解即可将一个Spring boot作为一个Eureka服务端。运行程序,打开浏览器http://localhost:8888
eureka-server.png

目前为止,Eureka服务端算是搭建好了,下面编写Eureka客户端程序:
Eureka服务端差不多,先添加依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

注意,和上面服务端的依赖不同,此时如果没有spring-boot-starter-web依赖的话,就需要添加上了。
然后就是application.properties配置文件了,与服务端大同小异,前面也说了防止自己注册自己的问题,客户端不存在这个问题,也就不需要将上面的那两个属性设置为false:

server.port=8889
eureka.client.service-url.defaultZone=http://localhost:8888/eureka/
spring.application.name=eureka-client

继续采坑,当采用application.properties方式配置Spring boot配置文件时,IDEA 中默认自动补全属性名并不是驼峰式的命名,而是以减号分割的形式,Spring boot在读取的时候会转换为驼峰式的命名。但在配置eureka.client.service-url.defaultZone的时候,很容易就会踩进深坑,看到 IDEA 提示都是减号分割的属性名,下意识的将defaultZone写成default-zone,后面就悲剧了,报错TransportException: Cannot execute request on any known server。原因是serviceUrl是一个Map属性,设值的时候不是调的setter方法,所以没有进行驼峰式命名的转换。
最后编写客户端程序:

package com.eureka.client.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

运行后继续查看服务端页面http://localhost:8888:
eureka-register.png
可以看到服务注册成功!

文章篇幅略长,服务消费后面再写文章去了。。主要两种消费方式:RestTemplate(和自己手写 http 调用差不多)、Feign 声明式调用(这种就和调接口差不多了)。

Last modification:August 6th, 2018 at 02:14 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment