Eureka服务注册与发现

在最初开始构建微服务系统的时候可能服务并不多, 我们可以通过做一些静态配置来完成服务的调用。 比如,有两个服务 A 和 B, 其中服务 A 需要调用服务 B 来完成一个业务操作时, 为了实现服务 B 的高可用, 不论采用服务端负载均衡还是客户端负载均衡, 都需要手工维护服务 B 的具体实例清单。 但是随着业务的发展, 系统功能越来越复杂, 相应的微服务应用也不断增加, 我们的静态配置就会变得越来越难以维护。 并且面对不断发展的业务, 我们的集群规模、 服务的位置 、 服务的命名等都有可能发生变化, 如果还是通过手工维护的方式, 那么极易发生错误或是命名冲突等问题。 同时, 对于这类静态内容的维护必将消耗大量的人力

  • 服务注册
    即服务注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单。如
    图片引用自书籍

  • 服务发现
    由于在服务治理框架下运作,服务间的调用不再通过指定具体的实例地址来实现,而是通过向服务名发起请求调用实现。如服务C希望调用服务A,服务C需要向注册中心发起咨询服务请求,服务注册中心将A服务的位置清单返回C,如按上例服务A的情况,C便获得了服务A的两个可用位置192.168.0.100:8000和192.168.0.101:8000。当服务C要发起调用的时候, 便从该清单中以某种轮询策略取出一 个位置来进行服务调用。

    Eukeka包含了客户端和服务器端。Eureka服务器端就是服务注册中心。Eureka客户端主要处理服务的注册与发现。

搭建Eureka Server框架
这里写图片描述
下面给出Eureka Server端pom文件内容(包含了Spring Boot版本和Spring Cloud版本):

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.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>
        <spring-cloud.version>Dalston.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <!--Eureka服务器端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-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>

通过@EnableEurekaServer注解启动一个服务注册中心,如下

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

通常application.properties中需要配置如下:

#应用启动端口
server.port=1111
#Eureka服务器端实例名
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

默认情况下,服务注册中心会将自己作为客户端来尝试注册自己,所以eureka.client.register-with-eureka设置为false

  • eureka.client.fetch-registry:由于注册中心的职责是维护服务实例,并不需要去检索服务,所以设置为false

    网页访问项目:
    这里写图片描述
    可以看到此时applications并没有任何服务。因为我们此时就一个Eureka Server服务,而且规定其不能注册自己。

Eureka Client 客户端框架搭建
下面给出Eureka Client端pom文件内容(包含了Spring Boot版本和Spring Cloud版本):

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.13.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>
    <spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

通过@EnableDiscoveryClient将应用设置为服务提供者

@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {

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

然后在application.properties中将服务注册到服务中心

server.port=8010
server.context-path=/
spring.application.name=eureka-client01
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
  • spring.application.name 表示该spring boot应用的名称
  • eureka.client.service-url.defaultZone 表示将服务注册到哪个服务注册中心
    这里写图片描述
    可以看到eureka-client01服务已经被注册到Eureka Server中

至此一个简单的服务注册与发现框架即搭建完成,后续会介绍当客户端有多个服务调用时的客户端负载均衡工具rabbion
参考书籍
Spring Cloud微服务实战

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章