Spring Cloud(Greenwich版)-02-服务注册与服务发现-Eureka入门

代码界的吴彦祖 2019-07-31 17:28:55 ⋅ 662 阅读



前言


生产者与消费者


上一节通过RestTemplate实现了生产者与消费者之间的调用关系,也提到了这种方式在分布式架构中是存在着问题的。
例如:商品微服务是消费者的同时还是其他服务的生产者,那么他们的调用配置都需要变更。当然可以采用nginx等反向代理来实现,但是当有数百个微服务岂不是被搞si了。针对这个问题引出了服务发现的概念,如下图所示:


服务发现机制:
1、服务生产者和服务消费者在启动的时候都会把自己的网络地址(IP+端口)注册到服务发现组件服务消费者要调用的时候先到服务发现组件里面查询服务提供者的IP+端口然后进行调用。
2、任何服务都有宕掉的可能,如果服务生产者挂了那就需要将服务发现组件里注册的对应节点剔除掉,所以当服务消费者和生产者注册到服务发现组件后就会隔段时间发起心跳,如果接受不到节点信息就剔除掉。

服务发现组件功能

1、服务注册表
可以将服务注册表看做是数据库,因为本身就是将当前可用服务示例的网络信息(IP+端口)记录下来。提供查询API和管理API,使用查询API可以获得可用的服务示例,使用管理API实现注册和注销;
2、服务注册
将网络信息(IP+端口)存放到服务注册表
3、健康检查
上面提到的心跳检查就是其中一个功能,将不可用的网络信息进行剔除,保证服务消费者能够调用到正常的网络信息。

服务发现的方式

1、客户端发现
例如:Eureka、zookeeper等。
2、服务器端发现
例如:Consul + nginx

Eureka简介

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转义的目的。Spring Cloud将它集成在其子项目spring-cloud-netflix中,用来实现Spring Cloud的服务发现功能。

实现一个Eureka Server

第一步:添加Eureka依赖(pom.xml)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
第二步:Spring Boot启动类增加注解
/**
* @Auther: Lin
* @Date: 2019-07-29 23:01
* @Description: 使用Eureka做服务发现
*/

@SpringBootApplication
@EnableEurekaServer
public class MicroserviceDiscoveryEurekaApplication {
public static void main(String[] args){
SpringApplication.run(MicroserviceDiscoveryEurekaApplication.class,args);
}
}
第三步:增加Eureka配置(application.ml)
server:
port: 8761
eureka:
client:
# 是否要注册到其他Eureka Server实例
register-with-eureka: false
# 是否要从其他Eureka Server实例获取数据
fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:8761/eureka/

备注:Eureka默认端口为8761。

第四步:启动测试

访问地址:http://127.0.0.1:8761,如下图所示:




出现上面控制台页面说明Eureka单机部署成功。

将用户(user)和商品(goods)服务注册到Eureka Service

基于SpringCloud实战(一)中的microservice-consumer-goodsmicroservice-provider-user微服务,将服务注册到Eureka Service。

第一步:添加Eureka Client依赖(pom.xml)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

备注:goods和user两个工程pom.xml都需添加

第二步:添加注解
#microservice-provider-user 微服务
@SpringBootApplication
#@EnableEurekaClient
public class MicroserviceProviderUserApplication {
public static void main(String[] args) {
SpringApplication.run(MicroserviceProviderUserApplication.class, args);
}
}

#microservice-consumer-goods 微服务
@SpringBootApplication
#@EnableEurekaClient
public class MicroserviceDiscoveryEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(MicroserviceDiscoveryEurekaApplication, args);
}
}

备注:Spring Cloud 的Edgware版本之前客户端启动类需要增加@EnableDiscoveryClient或 @EnableEurekaClient,从Edgware开始,可省略

第三步:添加配置
#microservice-provider-user 微服务
spring:
application:
# 指定注册到eureka server上的服务名称
name: microservice-provider-user
eureka:
client:
service-url:
# eureka server的通讯地址,注意路径
defaultZone: http://127.0.0.1:8761/eureka/
instance:
# 是否将IP注册到eureka server,false:否,ture:是
prefer-ip-address: true

#microservice-consumer-goods 微服务
spring:
application:
# 指定注册到eureka server上的服务名称
name: microservice-consumer-goods
eureka:
client:
service-url:
# eureka server的通讯地址,注意路径
defaultZone: http://127.0.0.1:8761/eureka/
instance:
# 是否将IP注册到eureka server,false:否,ture:是
prefer-ip-address: true
第四步:启动测试
  1. 按照顺序启动Eureka Server、用户微服务和商品微服务;

  2. 访问Eureka控制台查看,地址:http://127.0.0.1:8761




常见问题汇总

问题1:Eureka的注册页面,发现有一串红字:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.



原因:出现以上报错是因为Eureka进入了自我保护机制,默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳时,EurekaServer将会注销该实例(默认90s)。但是当网络发生故障时,微服务与EurekaServer之间无法通信,这样就会很危险了,因为微服务本身是很健康的,此时就不应该注销这个微服务,而Eureka通过自我保护机制来预防这种情况,当网络健康后,该EurekaServer节点就会自动退出自我保护模式;

这时再次将客户端微服务启动,刷新服务注册中心会发现,自我保护状态已取消。

配套代码

主代码库:https://github.com/yundianzixun/spring-cloud-study
Eureka Service:https://github.com/yundianzixun/spring-cloud-study/tree/master/microservice-discovery-eureka
microservice-provider-user :https://github.com/yundianzixun/spring-cloud-study/tree/master/microservice-provider-user
microservice-consumer-goods:https://github.com/yundianzixun/spring-cloud-study/tree/master/microservice-consumer-goods



全部评论: 0

    我有话说:

    Spring CloudGreenwich)-03-编写高可用Eureka Server(集群)

    前言 上一章Spring CloudGreenwich)-02-服务注册服务发现-Eureka入门,我们实现了将User和Goods微服务注册到了Eureka上,那么在生产环境中为了达到高

    Spring CloudGreenwich)-06-Spring Cloud集成Feign

    Spring Cloud系列教程第6节-Spring Cloud集成Feign

    码云推荐:一个优秀的分布式spring boot/Spring Cloud API限流框架,特别适合微服务架构

    一个优秀的分布式spring boot/Spring Cloud API限流框架,特别适合微服务架构.

    服务架构学习笔记:gRPC Spring Boot Starter 2.2.0 发布,及使用步骤

    gRPC Spring Boot Starter 项目是一个 gRPC 的 Spring Boot 模块。内嵌一个 gRPC Server 对外提供服务,并支持 Spring Cloud服务发现

    【开源资讯】JWCloud 专业 v1.0.0 发布,基于 SpringCloud 研发的微服务框架

    简介 JavaWeb_Cloud服务平台是一款基于 SpringCloud 框架研发的分布式微服务框架,主要使用技术栈包括: SpringCloud、Vue、ElementUI

    深入理解 Spring Cloud 核心组件 底层原理

    搜云库技术团队:https://mp.weixin.qq.com/s/_KCBWTPvFQ2QsM4P8-gqTQ 之前一直在看 Spring Cloud 及微服务架构 对 Spring Cloud

    Spring Cloud Alibaba 发布毕业后的首个版本

    方剑,花名洛夜,GitHub ID @fangjian0423,开源爱好者,阿里巴巴高级开发工程师,阿里云产品 EDAS 开发,Spring Cloud Alibaba 开源项目负责人。

    Spring Cloud快速搭建开放平台解决方案

    基于Spring Cloud开放平台解决方案 SOP

    MateCloud 3.2.8 版本发布,基于 Spring Cloud Alibaba 的微服务平台

    软件简介 MateCloud 是一款基于Spring Cloud Alibaba的微服务架构。目前已经整合 Spring Cloud Gateway、Spring Security

    构建数据集成和实时数据处理流水线工具Spring Cloud Data Flow

    Spring Cloud Data Flow 是基于原生云对 Spring XD 的重新设计

    Spring Cloud Eureka Nacos如何解决服务上线下线延时过长问题

    1.降低延迟时间     1)中小型的项目建议关闭自我保护(eureka.server.enableSelfPreservation=false)     2

    你的老板逼你上微服务了吗?

    “ 这些年软件的设计规模越来越庞大,业务需求也越来越复杂,针对系统的性能、高吞吐率、高稳定性、高扩展等特性提出了更高的要求。   图片来自 Pexels可以说业务需求是软件架构能力的第一推动力,由于这些因素导致了软件架构思想和相关技...

    服务架构实战篇(六):Spring boot2.x 集成阿里大鱼短信接口详解Demo

    Spring boot2.x 集成阿里大鱼短信接口,发送短信验证码及短信接口详解。

    「转载」微服务分布式架构中,如何实现日志链路跟踪?

    背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用ELK来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,我们来看下面的图     上图一个用户请求一个url,整个链路如图,每个处理层...

    Martian-cloud 4.0,跟注册中心拜拜了,基于传染机制的分布式组件诞生

    这次真的要跟注册中心讲拜拜了,微服务不再需要占用一套注册中心集群了,大大节约了运维成本 更新点如下 丢弃了一开始的【生产者->注册中心->消费者】模型 采用传染机制,实现服务发现

    架构实战篇(十六):Spring Boot Assembly服务化打包

    使用assembly来打包springboot微服务项目,让发布更简单