当前位置: 首页 > news >正文

第二章:服务注册与发现(Eureka)-上

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 第二章:服务注册与发现(Eureka)-上

 

前言

从本章节开始,正式进入 SpringCloud的基础教程。从第一章《什么是SpringCloud》中我们可以知道,一个微服务框架覆盖的东西是很多的,而如何去管理这些服务或者说 API接口,就显得异常重要了。所以本章节,主要介绍下 SpringCloud中使用 Eureka实现服务的注册与发现。

服务治理

服务治理是微服务架构中最为核心和基础的模块。它主要用来实现各个微服务实例的自动化注册与发现。

来一张经典的图:

b35c4b44f94c90fb4a5f450df0468098dff.jpg

可以知道,随着服务的越来越多,越来越杂,服务之间的调用会越来越复杂,越来越难以管理。而当某个服务发生了变化,或者由于压力性能问题,多部署了几台服务,怎么让服务的消费者知晓变化,就显得很重要了。不然就会存在调用的服务其实已经下线了,但调用者不知道等异常情况。

这个时候有个服务组件去统一治理就相当重要了。简单来说,一个服务治理组件应该具备以下几个功能:

服务注册表

服务治理组件的核心,它用来记录各个微服务的信息,比如说微服务的名称、IP、端口等。服务注册组件提供查询API和管理API,查询API用来查询可用的微服务实例,管理API用于服务的注册和注销。

服务注册与发现

  • 服务注册是指微服务在启动时,将自己的信息注册到服务治理组件上的过程。

  • 服务发现是指查询可用微服务列表及其网络地址的机制。

服务检查

服务治理组件使用一定机制定时检测已注册的服务,是否在线,或者是否无法连接等,若发现无法访问,就会从服务注册表中移除该实例,进行下线操作。

Eureka实践

Eureka简单介绍

EurekaNetflix开源的服务发现组件,本身是一个基于 REST的服务。它包含 ServerClient两部分。 SpringCloud将它集成在子项目 SpringCloudNetflix中,从而实现微服务的注册与发现。

题外话:有兴趣的同学,可以搜索看看这家在线影片租赁提供商:Netflix。全家桶里面大部分接触的都是这家公司开源的,老牛逼了!

Netflix官方github地址了解下:https://github.com/Netflix

Eureka服务端

也称为注册中心,用于提供服务的注册与发现。支持高可用配置,依托与强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。

Eureka客户端

主要处理服务的注册与发现。客户端服务通过注解和参数配置方式,嵌入在客户端的应用程序代码中,在应用程序启动时,向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态。

简单看下, Eureka总体架构:

d98269d0e3a1752188eb7a9db61d0552c1d.jpg

从这个简图中,可以看出, Eureka有三部分组成:

  • Service Provider: 暴露服务的提供方。

  • Service Consumer:调用远程服务的服务消费方。

  • EureKa Server: 服务注册中心和服务发现中心

而我们使用 Eureka主要是实现 服务治理功能,通过下图我们来大致了解下其治理体系:

c5f6c50d7d935ad1414d2824d5f42ac92ac.jpg27756c99a50537130490d8f2b39d6adbb61.jpg

简单来说,客户端通过注册中心,获取服务端服务的地址信息,再根据地址进行服务调用,而注册中心来维护各服务的状态,比如发送心跳验证健康状态,判断是否在线,同时记录其服务地址,以供查询。

开始讲解实例前,先说明下为了版本可统一管理,本系列教程创建了一个父类pom文件,利用 MavendependencyManagement对模块版本进行了统一管理。后续若是升级版本时,正常就更新此父类pom版本即可。

创建Eureka服务端

创建一个Eureka服务端很简单,我们只需要简单几步即可完成。

创建个名为 spring-cloud-eureka-serverSpringBoot项目。

0.加入pom依赖。

 
  1.    <dependency>

  2.        <groupId>org.springframework.cloud</groupId>

  3.        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>

  4.    </dependency>

这里注意,和E版不同,E版是引入: spring-cloud-starter-eureka-server

1.添加配置文件配置。

 
  1. spring.application.name=eureka-service

  2. # 修改端口

  3. server.port=1000

  4.  

  5. # 实例的主机名称

  6. eureka.instance.hostname=127.0.0.1

  7.  

  8. ## 不要向注册中心注册自己

  9. eureka.client.register-with-eureka=false

  10. ## 表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它也不需要去检索其他服务

  11. eureka.client.fetch-registry=false

  12.  

  13. # 指定服务注册中心地址 这里直接指向了本服务

  14. eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

友情提示:由于 eureka.client.service-url在配置类 org.springframework.cloud.netflix.eureka.EurekaClientConfigBean是个map对象,所以呢,使用IDE的提示功能是不会出现的,而且要注意 map对象的值,大小写要一致,和其他对象不一样,这个要注意。

529d344f765ffa03ec4d03fc5a801877619.jpg

所以从源码可以看出,默认不写时,是注册至: DEFAULT_URL中,默认就是 http://localhost:8761/eureka

e1c3945a9932049b7cc70b7ac2e19b05122.jpg

2.启动类,添加注解@EnableEurekaServer。

 
  1. /**

  2. * Eureka服务端

  3. * @author oKong

  4. *

  5. */

  6. @SpringBootApplication

  7. @EnableEurekaServer

  8. @Slf4j

  9. public class EureakServiceApplication {

  10.  

  11.    public static void main(String[] args) throws Exception {

  12.        SpringApplication.run(EureakServiceApplication.class, args);

  13.        log.info("spring-cloud-eureka-service启动!");

  14.    }

  15. }

3.启动应用,访问:http://127.0.0.1:1000/,

ceb6b3e431a7216af9b1deafa30fe6241c6.jpg

目前为止一个单机Eureka服务端就搭建完毕了。是不是很简单,基本就几行代码。从上图也可以看出,目前还没有服务注册上去,所以应用列表是空的。接下来,创建个客户端同时注册到此注册中心下。

创建Eureka客户端

Eureka客户端,其实就是服务的提供方,对外提供服务的应用。

创建个 spring-cloud-eureka-client工程项目。

0.加入pom依赖

 
  1.    <!-- 客户端依赖 -->

  2.    <dependency>

  3.        <groupId>org.springframework.cloud</groupId>

  4.        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

  5.    </dependency>

  6.    <!-- 引入web,提供一个简单的api接口 -->

  7.    <dependency>

  8.        <groupId>org.springframework.boot</groupId>

  9.        <artifactId>spring-boot-starter-web</artifactId>

  10.    </dependency>    

1.配置文件添加注册中心配置。

 
  1. spring.application.name=eureka-client

  2. server.port=2000

  3.  

  4. # 注册中心地址

  5. eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka

  6. # 启用ip配置 这样在注册中心列表中看见的是以ip+端口呈现的

  7. eureka.instance.prefer-ip-address=true

  8. # 实例名称  最后呈现地址:ip:2000

  9. eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}

友情提示:这里有个坑,变量 spring.cloud.client.ipAaddress在F版中应该写成 spring.cloud.client.ip-address。具体原因就是字段名修改了。

org.springframework.cloud.client.HostInfoEnvironmentPostProcessor类:

5679f981c5f1b1196065fcaf31fd9aef6a6.jpg

2.启动类加入注解EnableDiscoveryClient。

 
  1. /**

  2. * 服务提供者示例-eureka客户端

  3. * @author oKong

  4. *

  5. */

  6. @SpringBootApplication

  7. //注意这里也可使用@EnableEurekaClient

  8. //但由于springcloud是灵活的,注册中心支持eureka、consul、zookeeper等

  9. //若写了具体的注册中心注解,则当替换成其他注册中心时,又需要替换成对应的注解了。

  10. //所以 直接使用@EnableDiscoveryClient 启动发现。

  11. //这样在替换注册中心时,只需要替换相关依赖即可。

  12. @EnableDiscoveryClient

  13. @Slf4j

  14. public class EurekaClientApplication {

  15.  

  16.    public static void main(String[] args) throws Exception {

  17.        SpringApplication.run(EurekaClientApplication.class, args);

  18.        log.info("spring-cloud-eureka-client启动!");

  19.    }

  20.  

  21. }

注意:这里也可使用@EnableEurekaClient注解,但一般不这么用,直接使用@EnableDiscoveryClient实现自动发现。因为 SpringCloud本身支持 EurekaConsulzookeeper等实现注册中心功能,若写死了某个注册中心的相关注解,之后替换时,还需要修改注解类。

3.编写一个简单的api接口。

 
  1. /**

  2. * 简单api示例

  3. * @author oKong

  4. *

  5. */

  6. @RestController

  7. public class DemoController {

  8.  

  9.    @GetMapping("/")

  10.    public String index() {

  11.        return "spring-cloud-eureka-client!";

  12.    }

  13. }

4.启动应用,再次访问:http://127.0.0.1:1000/ ,可以看见服务被注册上去了。

1220590cb6df68a8362ae0cb0933adb5661.jpg

Eureka自我保护模式

在开发阶段,很经常会出现以下文字:

ac98d69ad8c5cc59e08ec48db6eea6d2145.jpg

默认情况下,如果 EurekaServer在一定时间内没有接收到某个微服务实例的心跳, EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,这就可能变得非常危险了,因为微服务本身是健康的,此时本不应该注销这个微服务。

EurekaServer通过“自我保护模式”来解决这个问题,当 EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式, EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该 EurekaServer节点会自动退出自我保护模式。

自我保护模式是一种对网络异常的安全保护措施。使用自我保护模式,而让Eureka集群更加的健壮、稳定。

开发阶段可以通过配置: eureka.server.enable-self-preservation=false关闭自我保护模式。

生产阶段,理应以默认值进行配置。

至于具体具体的配置参数,可至官网查看:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#appendixcompendiumofconfiguration_properties

或者直接查看 EurekaClientConfigBeanEurekaInstanceConfigBean类相关默认配置:

5dc55b57296a79cc27a7e5c324716f1f2d1.jpg

至于字段中文说明,大家可查看网站:微服务架构:Eureka参数配置项详解,里面很详细的说明了。

e7109947958aadff8609ec0f26a0c36c0d1.jpg

「你说,英语不好连字段啥意思都不知道,多尴尬,学好英语很重要,(┬_┬)」

参考资料

  1.  

    http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#spring-cloud-eureka-server

     

  2.  

    https://blog.csdn.net/sunhuiliang85/article/details/76222517

     

  3.  

    https://www.areatao.com/article/5b45718d7ab07c574d5888d0

转载于:https://my.oschina.net/demons99/blog/2247051

相关文章:

  • hadoop,spark,Zookeeper,,, 这些名字都是怎么来的呢?
  • Windows下安装phpRedis扩展
  • WPF 定时器DispatcherTimer+GetCursorPos 的使用,动态查看屏幕上任一点坐标
  • java写Spark程序之PairFaltMapFunction
  • 月总结
  • shll基础,原来脚本并不难!
  • 在vue单页应用中使用jquery
  • 高效数据同步工具rsync服务部署详解(上)
  • sql server 通用修改表数据存储过程
  • 创蓝携手墨者安全达成战略合作 推出新一代抗DDoS功击解决方案
  • 【MySql】【转】允许远程登录
  • 七牛云与上海陈天桥脑疾病研究所签署战略合作,多维度助力脑科学研究
  • MySQL字符集设定与查询
  • 【算法】LeetCode算法题-Two Sum
  • 跨库数据表的运算
  • Android Volley源码解析
  • es6
  • git 常用命令
  • HashMap ConcurrentHashMap
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • js
  • js写一个简单的选项卡
  • Sublime text 3 3103 注册码
  • windows下mongoDB的环境配置
  • 人脸识别最新开发经验demo
  • 函数计算新功能-----支持C#函数
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (3)(3.5) 遥测无线电区域条例
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)ABI是什么
  • (转)jdk与jre的区别
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)负载均衡,回话保持,cookie
  • .gitignore文件—git忽略文件
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET命令行(CLI)常用命令
  • ??javascript里的变量问题
  • @Service注解让spring找到你的Service bean
  • [AR]Vumark(下一代条形码)
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [C++]priority_queue的介绍及模拟实现
  • [codevs1288] 埃及分数
  • [Deep Learning] 神经网络基础
  • [Foreman]解决Unable to find internal system admin account
  • [Java]快速入门优先队列(堆)手撕相关面试题
  • [LeetCode] 197. 上升的温度
  • [leetcode] 四数之和 M