Spring Cloud 学习——2. 服务注册与发现简单示例
1. 前言
概述Spring Cloud 集成了 Eureka 作为注册中心,来实现服务的注册与发现。
2. Eureka 概述
在一个微服务架构的系统中,服务之间要想能够相互调用,那么服务调用者(后文叫消费者)必须要知道被调用(提供者)相关信息,比如提供者的服务地址、健康状态等等。而在一个大型的系统中,可能存在种类和数量都非常庞大的这种微服务,如果所有的微服务之间都是两两直接配置和维持心跳的话,那么服务就不用做其它的事了,光维持心跳就够了,而且配置也会非常的繁琐。所以,必须要有一个管理者来集中管理这些五花八门的服务。这个管理者至少需要管理这些信息:
2.1. 系统中存在哪些种类的微服务(比如:用户服务、商品服务、订单服务)
2.2. 每种服务的调用方式(也就是访问路径。如果不提供调用,那么还能叫服务吗)
2.3. 每种服务的实例信息(虽然可能某一种微服务是集群部署,但是最后业务访问的时候,还是需要具体到某一台具体的服务器上去)
2.4. 每一个服务实例的健康状态(如果一个实例因为某种原因导致不能提供服务了,那么这个管理者必须要及时知道,并做到不让请求触达它。一般通过心跳来检测健康状态)
想要掌握这些信息,那么所有的服务必须到这个管理者来注册,并提供自己的一些元数据信息(比如:服务名、实例ID等)。所以我们把这个负责注册的管理者叫做服务注册中心。Eureka 就是提供这么一个注册中心的组件。
3. Eureka 模式图(引用:https://www.cnblogs.com/gdjlc/p/11784681.html):
从图中我们应该了解到以下几点信息:
3.1. Eureka 包含两个部分:Eureka server 和 Eureka client 。Eureka server 就是注册中心,也就是前面讲到服务管理者;Eureka client 就是具体的需要注册的服务。
3.2. Eureka server 和 Eureka client 之间主要有两个交互:
3.2.1. client 向 server 注册,提供自己的注册信息;
3.2.2. client 向 server 查找服务,server 为其提供可供调用的服务(可能是其它服务,也包括它自己)
3.3. 不管是服务提供者还是消费者,都需要注册。这个并不难理解,因为如果你不注册,我通过什么途径给你提供服务呢?而且在实际项目中,往往一个应用既是服务提供者也是服务消费者
3.4. Eureka server 支持多节点。这样做的目的当然是提高可靠性。试想所有的服务都靠注册中心来保持联系,那如果注册中心挂了岂不是整个系统就不可用了!所以在一个高可靠性的微服务系统中,注册中心的多节点支持是必须要有的
4. 编码实现
4.1. 实现 Eureka server
4.1.1. 创建一个spring boot 工程:
略
4.1.2. 添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
4.1.3. 声明为 Eureka server
在启动类上加上注解 @EnableEurekaServer :
4.1.4. 不注册自己
在 Eureka 的模型中,server 和 client 都是 instance,所以默认会将 server 也进行注册。可以通过下述两个配置禁用 Eureka 注册自己(在 application.properties 中)
4.1.5. 仪表盘配置
仪表盘是 Eureka 提供的一个简单的可视化界面,用来查看注册的服务实例。值得说明的是, eureka.dashboard.path 配置的路径是相对于应用的 context-path 的路径,如果你应用的 server.servlet.context-path=/eureka/server ,那么最终的 仪表盘访问路径就是 http://localhost:${server.port}/eureka/server/dashboard
4.1.6. 启动 Eureka server,访问仪表盘的结果:
4.2. 编写服务
4.2.1. 创建一个 spring boot 工程
略
4.2.2. 添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
4.2.3. 声明为 Eureka client
在启动类上添加注解 @EnableEurekaClient (或者 @EnableDiscoveryClient ,它包含前者)
4.2.4. 配置注册信息
4.2.5. 初始化 rest 工具
4.2.6. 调用服务
编写一个简单的 Controller ,实现调用
这里,我们写了两个服务接口:主页服务接口(/)和 欢迎页服务接口(/welcome),欢迎页服务接口返回它调用的主页服务接口的结果。在这个例子里面,同一个应用既是服务提供者也是服务消费者。
4.2.7. 启动服务,测试
4.2.7.1. 我们先来看一下注册中心的仪表盘是否已经有了服务注册
可以看到,现在仪表盘显示已经有一个服务实例注册了,就是我们上面编写的 sys 服务
4.2.7.2. 下面分别访问两个服务接口
主页:
可以看到,返回了预期的结果。
欢迎页:
也返回了预期的结果,说明服务调用成功了。
参考: