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

文章目录

      • 1.Eureka注册中心
        • 1.1.Eureka简介
        • 1.2.Eureka基本架构
          • 1.2.1 EurekaServer(注册中心)
          • 1.2.2 EurekaClient(客户端)
      • 2.Eureka项目的构建
        • 2.1 新建一个工程EurekaServer-7001
        • 2.2.将user-service注册到Eureka
        • 2.3 消费者从Eureka获取服务
        • 2.4.注册微服务信息完善

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来发现系统中的其他微服务,并执行相关的逻辑。
玩转SpringCloud专题(三):SpringCloud注册中心Eureka入门_第1张图片

- 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提供的快速搭建工具:
玩转SpringCloud专题(三):SpringCloud注册中心Eureka入门_第2张图片
●选择依赖,完整的Pom文件:


<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.4.RELEASEversion>
<relativePath/> 
parent>
<groupId>com.bruceliu.eureka.servergroupId>
<artifactId>eureka-server-7001artifactId>
<version>0.0.1-SNAPSHOTversion>
<name>eureka-server-7001name>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
<spring-cloud.version>Greenwich.SR1springcloud.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eurekaserverartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-clouddependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
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.

玩转SpringCloud专题(三):SpringCloud注册中心Eureka入门_第3张图片

2.2.将user-service注册到Eureka

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


<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>

●然后是Eureka客户端:


<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eurekaclientartifactId>
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监控页面查看玩转SpringCloud专题(三):SpringCloud注册中心Eureka入门_第4张图片
我们发现service服务已经注册成功了!!!

2.3 消费者从Eureka获取服务

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


<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>

●然后是Eureka客户端:


<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eurekaclientartifactId>
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);
}
}

●注册中心:
玩转SpringCloud专题(三):SpringCloud注册中心Eureka入门_第5张图片
●访问测试:
在这里插入图片描述

2.4.注册微服务信息完善

●主机名称:服务名称修改默认:
玩转SpringCloud专题(三):SpringCloud注册中心Eureka入门_第6张图片
●在springcloud-demo属性文件中加入

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

●修改后,查看页面
玩转SpringCloud专题(三):SpringCloud注册中心Eureka入门_第7张图片
希望大家关注我一波,防止以后迷路,有需要的可以加我Q讨论互相学习java ,学习路线探讨,经验分享与java Q:2415773436

你可能感兴趣的:(java,分布式,spring,springcloud)