玩转SpringCloud专题(三):SpringCloud注册中心Eureka入门

1.Eureka注册中心

1.1.Eureka简介

首先我们来解决第一问题,服务的管理。
问题分析
在刚才的案例中,user-service对外提供服务,需要对外暴露自己的地址。而
consumer(调用者)需要记录服务提供者的地址。将来地址出现变更,还需要及时
更新。这在服务较少的时候并不觉得有什么,但是在现在日益复杂的互联网环境,
一个项目肯定会拆分出十几,甚至数十个微服务。此时如果还人为管理地址,不仅
开发困难,将来测试、发布上线都会非常麻烦,这与DevOps的思想是背道而驰的。

网约车
这就好比是网约车出现以前,人们出门叫车只能叫出租车。一些私家车想做出租却
没有资格,被称为黑车。而很多人想要约车,但是无奈出租车太少,不方便。私家
车很多却不敢拦,而且满大街的车,谁知道哪个才是愿意载人的。一个想要,一个
愿意给,就是缺少引子,缺乏管理啊。
此时滴滴这样的网约车平台出现了,所有想载客的私家车全部到滴滴注册,记录你
的车型(服务类型),身份信息(联系方式)。这样提供服务的私家车,在滴滴那
里都能找到,一目了然。
此时要叫车的人,只需要打开APP,输入你的目的地,选择车型(服务类型),滴滴
自动安排一个符合需求的车到你面前,为你服务,完美!
Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST服务,用
于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务
架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以
访问到服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,
比如Zookeeper。

1.2.Eureka基本架构

SpringCloud封装了Netflix公司开发的Eureka模块来实现服务注册和发现(请对比
Zookeeper)。Eureka采用了C-S的设计架构。EurekaServer作为服务注册功能的服务
器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到
EurekaServer并维持心路连接。这样系统的维护人员就可以通过EurekaServer来监控
系统中各个微服务是否正常运行。SpringCloud的一些其他模块(比如Zuul)就可以
通过EurekaServer来发现系统中的其他微服务,并执行相关的逻辑。
在这里插入图片描述

- Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
- 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
- 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费
者,并且定期更新
- 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
1.2.1 EurekaServer(注册中心)

EurekaServer作为一个独立的部署单元,以RESTAPI的形式为服务实例提供了注册、
管理和查询等操作。同时,EurekaServer也为我们提供了可视化的监控页面,可以直
观地看到各个EurekaServer当前的运行状态和所有已注册服务的情况。

1.2.2 EurekaClient(客户端)

● 服务注册: 启动时,会调用服务注册方法,向 EurekaServer 注册自己的信息。
EurekaServer 会维护一个已注册服务的列表。当实例状态发生变化时(如自身检
测认为Down的时候),也会向EurekaServer更新自己的服务状态,同时用
replicateToPeers() 向其它EurekaServer节点做状态同步。

● 续约与剔除: 服务实例启动后,会周期性地向 EurekaServer 发送心跳以续约自
己的信息,避免自己的注册信息被剔除。续约的方式与服务注册基本一致,首先更
新自身状态,再同步到其它Peer。如果EurekaServer在一段时间内没有接收到某个微
服务节点的心跳, EurekaServer 将会注销该微服务节点(自我保护模式除外)。

● 服务消费: ServiceConsumer 本质上也是一个 EurekaClient 。它启动后,会
从 EurekaServer 上获取所有实例的注册信息,包括IP地址、端口等,并缓存到本
地。这些信息默认每30秒更新一次。前文提到过,如果与 EurekaServer 通信中
断, ServiceConsumer 仍然可以通过本地缓存与 ServiceProvider 通信。

● 三处缓存 EurekaServer 对注册列表进行缓存,默认时间为30s。
EurekaClient 对获取到的注册信息进行缓存,默认时间为30s。 Ribbon 会从上
面提到的EurekaClient获取服务列表,将负载均衡后的结果缓存30s。

2.Eureka项目的构建

我们做三个角色 EurekaServer:提供服务注册和发现; ServiceProvider:服务提供
方,将自身服务注册到Eureka,从而使服务消费方能够找到; ServiceConsumer:服
务消费方,从Eureka获取注册服务列表,从而能够消费服务。

2.1 新建一个工程EurekaServer-7001

● 依然使用spring提供的快速搭建工具:
在这里插入图片描述
●选择依赖,完整的Pom文件:

<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bruceliu.eureka.server</groupId>
<artifactId>eureka-server-7001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server-7001</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</springcloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eurekaserver</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-clouddependencies</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>
</project>

●编写启动类:

@SpringBootApplication
@EnableEurekaServer // 声明这个应用是一个EurekaServer
public class EurekaServer7001Application {
public static void main(String[] args) {
SpringApplication.run(EurekaServer7001Application.class,
args);
}
}

编写配置:

server:
port: 7001 # 端口
spring:
application:
name: eureka-server-7001 # 应用名称,会在Eureka中显示
eureka:
client:
register-with-eureka: false # 是否注册自己的信息到EurekaServer,
默认是true
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护
服务实例,并不需要去检索服务
service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需
要加上其它Server的地址。
defaultZone: http://127.0.0.1:${server.port}/eureka

●启动服务,并访问:http://127.0.0.1:7001.

在这里插入图片描述

2.2.将user-service注册到Eureka

注册服务,就是在服务上添加Eureka的客户端依赖,客户端代码会自动把服务注册
到EurekaServer中。 我们在springcloud-demo中添加Eureka客户端依赖: ●先添加
SpringCloud依赖:

<!-- SpringCloud的依赖 -->
<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>

●然后是Eureka客户端:

<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eurekaclient</artifactId>
</dependency>

在启动类上开启Eureka客户端功能
通过添加 @EnableDiscoveryClient 来开启Eureka客户端功能

@SpringBootApplication
@EnableEurekaClient // 开启EurekaClient功能
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
System.out.println("提供者启动:7001");
}
}

●编写配置

# 应用名称
spring.application.name=springcloud-demo-service
# EurekaServer地址
eureka.client.service-url.defaultZone=http://127.0.0.1:7001/eureka
# 当调用getHostname获取实例的hostname时,返回ip而不是host名称
eureka.instance.prefer-ip-address=true
# 指定自己的ip信息,不指定的话会自己寻找
eureka.instance.ip-address=127.0.0.1

注意:

- 这里我们添加了spring.application.name属性来指定应用名称,将来会作为应用的id使用。
- 不用指定register-with-eureka和fetch-registry,因为默认是true

●重启项目,访问Eureka监控页面查看在这里插入图片描述
我们发现service服务已经注册成功了!!!

2.3 消费者从Eureka获取服务

接下来我们修改springcloud-demo-consumer,尝试从EurekaServer获取服务。 方法
与消费者类似,只需要在项目中添加EurekaClient依赖,就可以通过服务名称来获取
信息了! 添加依赖: ●先添加SpringCloud依赖:

<!-- SpringCloud的依赖 -->
<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>

●然后是Eureka客户端:

<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eurekaclient</artifactId>
</dependency>

●在启动类开启Eureka客户端:

@SpringBootApplication
@EnableDiscoveryClient // 开启EurekaClient功能
public class SpringcloudDemoConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudDemoConsumerApplication.class,
args);
}
}

●修改配置:

spring.application.name=springcloud-demo-consumer
# EurekaServer地址
eureka.client.service-url.defaultZone=http://127.0.0.1:7001/eureka
# 当调用getHostname获取实例的hostname时,返回ip而不是host名称
eureka.instance.prefer-ip-address=true
# 指定自己的ip信息,不指定的话会自己寻找
eureka.instance.ip-address=127.0.0.1

●修改代码,用DiscoveryClient类的方法,根据服务名称,获取服务实例:

/**
* @author bruceliu
* @create 2019-05-02 15:52
* @description
*/
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient client;// Eureka客户端,可以获取到服务实例
信息
@RequestMapping("/test")
public List<User> consumerTest(){
List<String>list=client.getServices();
System.out.println("*服务列表*"+list);
List<ServiceInstance>
srvList=client.getInstances("springcloud-demo-service");
for(ServiceInstance element:srvList){

System.out.println(element.getServiceId()+"\t"+element.getHost()
+"\t"+element.getPort()+"\t" +element.getUri());
}
// 因为只有一个UserService,因此我们直接get(0)获取
ServiceInstance instance = srvList.get(0);
// 获取ip和端口信息
String baseUrl = "http://"+instance.getHost() + ":" +
instance.getPort()+"/all";
System.out.println("访问地址:"+baseUrl);
return
this.restTemplate.getForObject(baseUrl,List.class);
}
}

●注册中心:
在这里插入图片描述
●访问测试:
在这里插入图片描述

2.4.注册微服务信息完善

●主机名称:服务名称修改默认:
在这里插入图片描述
●在springcloud-demo属性文件中加入

eureka.instance.instance-id=springcloud-demo-service-80

●修改后,查看页面
在这里插入图片描述
希望大家关注我一波,防止以后迷路,有需要的可以加我Q讨论互相学习java ,学习路线探讨,经验分享与java Q:2415773436

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值