共计 3862 个字符,预计需要花费 10 分钟才能阅读完成。
在后期筹备的文章中也说过了 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: 8001
eureka:
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
@EnableEurekaServer
public 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: 7001
spring:
application:
name: eureka-provide
eureka:
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
@EnableEurekaClient
public 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 的时候再解说。
创作不易,如果感觉文章不错,或者有帮到你,动动小手关注、点赞、在看加分享呀!