在后期筹备的文章中也说过了Spring Cloud的5大组件,明天就来讲讲服务发现(注册)。无论是Spring Cloud H版还是最新的版本,Eureka都是作为服务发现和注册的罕用组件。

我的项目搭建

构建一个eureka的父模块,具体怎么实现能够参考前篇文章。

在空我的项目外面构建2个模块

  • eureka的服务端,eureka的客户端,其中客户端在本例仅包含服务的生产者。

Eureka父模块的pom文件如下,为了不便间接引入了server和client

<?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>        <artifactId>spring-cloud-learning</artifactId>        <groupId>com.cutey.none</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>eureka</artifactId>    <packaging>pom</packaging>    <modules>        <module>eureka-server8001</module>        <module>eureka-client-provide7001</module>        <module>eureka-client-consume9001</module>    </modules>    <properties>        <maven.compiler.source>9</maven.compiler.source>        <maven.compiler.target>8</maven.compiler.target>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>        </dependency>    </dependencies></project>

能够看到pom文件中指明了父模块,同时也继承了父模块的依赖。全副实现后,我的我的项目构造如下图所示:

我的项目的规约,不肯定是和真正开发一样,然而为了不便记忆:

  • 服务注册核心的端口为8xxx
  • 生产端的端口为7xxx
  • 生产端的端口为9xxx

Eureka Server

在上一步的pom文件中就曾经通过maven导入了Eureka Server的依赖。如果没有在父模块中导入,则需退出上面的代码:

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

接下来要做的就是减少配置文件启动类以及业务代码的编写。

配置文件

application.yml

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

留神我这里的端口是8001,然而eureka默认的端口是8761,这个端口能够自行批改,所以问题不大。

还有一个须要留神的点是,defaultZone 是肯定须要的,官网文档外面是说service-url 是以键值对的模式存储,所以必须要有key和value。

启动类

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

次要是加了一个@EnableEurekaServer 的注解,因为是服务端的起因,在这种demo中就没有增加其它多余的业务类。

Eureka Client生产端

生产端能够说真正调用的中央,提供了业务代码。同样在父模块中曾经引入了Eureka Client依赖,如果没有在父类中援用,那么须要增加以下代码:

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

配置文件

server:  port: 7001spring:  application:    name: eureka-provideeureka:  client:    fetch-registry: true    register-with-eureka: true    service-url:      defaultZone: http://localhost:8001/eureka/  instance:    instance-id: eureka-provide7001

其实会发现配置文件大差不差,客户端的时候因为须要往服务端中注册,所以register-with-eureka 为true,并且后续可能去注册核心获取其它地址,fetch-registry 也为true。而后这个instance-id 是服务注册到Eureka的实例id,在前面创立集群的时候也会说到。

启动类和业务类

本例把启动类和业务类放在了一起,因为仅仅是入门的起因,所以基本上能简则简,官网上的demo也是这样的。

@SpringBootApplication@RestController@EnableEurekaClientpublic class EurekaProvide7001 {    @Value("${server.port}")    int port;    @GetMapping("/eureka/provide")    public String getInfo() {        return "hello, eureka provide:" + port;    }    public static void main(String[] args) {        SpringApplication.run(EurekaProvide7001.class, args);    }}

首先在主启动类上增加了@EnableEurekaClient 的注解表明本人是Eureka Client ;其次增加@RestController 作为web我的项目的controller ,而后业务逻辑也比较简单,就不再赘述。

服务端和客户端曾经有了,当初就能够开启服务来进行测试,先开启端口为8001的服务端,接着开启端口为7001的客户端。

先来看看客户端是否失常地拜访业务http://localhost:7001/eureka/... Boot我的项目

再来看看Eureka界面,拜访http://localhost:8001/ ,能够发现服务曾经被注册进Eureka

Eureka集群

要申明一点,集群的作用是什么呢,在现阶段能想到的答案是两方面,一方面是做负载平衡;其次是避免服务挂掉。所以Eureka集群也能够分为两个方面,一个是服务端的集群,一个是客户端负责提供服务的集群。本大节重点讲的是前面的集群。

启动两个端口来模仿两台服务器,值得注意的是,尽管端口不一样,然而服务的名字都是一样的。在idea中只须要批改配置文件就能启动不同端口的实例。

留神,还记得下面配置文件中有一项instance-id吗,为了演示,曾经批改了下面的配置文件

在不指定id状况下eureka会主动为咱们生成实例id,这时候只须要简略批改端口即可。

然而,如果下面的instance-id 曾经指定过了(正如本来的配置文件),如果只批改端口会发现7002端口并没有注册进去

idea输入文件如下

这种状况下,只须要在下面配置的根底上再增加一个参数即可

重新启动7002端口,此时能够发现服务曾经注册进Eureka中

结语

本篇文章只讲了Eureka Client的生产端,还有生产端没讲。并不是遗记了,而是留着下一讲Ribbon的时候再解说。

创作不易,如果感觉文章不错,或者有帮到你,动动小手关注、点赞、在看加分享呀!