热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sheng的学习笔记EurekaRibbon

Eureka-注册中心Eureka简介官方网址:https://spring.io/projects/spring-cloud-netflixEureka介绍 Spring Cloud

Eureka-注册中心

Eureka简介

官方网址:

https://spring.io/projects/spring-cloud-netflix

Eureka介绍

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper)。Zooleeper nacos.

Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

Eureka包含两个组件:Eureka Server和Eureka Client

Eureka Server提供服务注册服务

各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到EurekaClient是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

Eureka基本原理

基本原理

上图是来自eureka的官方架构图,这是基于集群配置的eureka;

- 处于不同节点的eureka通过Replicate进行数据同步

- Application Service为服务提供者

- Application Client为服务消费者

- Make Remote Call完成一次服务调用

服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

当服务注册中心Eureka Server检测到服务提供者因为宕机、网络原因不可用时,则在服务注册中心将服务置为DOWN状态,并把当前服务提供者状态向订阅者发布,订阅过的服务消费者更新本地缓存。

服务提供者在启动后,周期性(默认30秒)向Eureka Server发送心跳,以证明当前服务是可用状态。Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,则认为服务宕机,注销该实例。

eureka搭建

四个子项目作用如下:

①EurekaService:Eureka服务中心子项目,作用是作为Eureka服务程序,管理其他微服务的状态。其他Eureka客户端子项目运行时需在此模块进行注册。

②ServiceOne:Eureka客户端-微服务1,提供了一个业务接口“serviceOne”。

③ServiceTwo:Eureka客户端-微服务2,提供了一个业务接口“serviceTwo”。

④ServiceThree:Eureka客户端-微服务3,提供了两个业务接口:

“serviceThree_toOne”:内部调用ServiceOne的“serviceOne接口”

“serviceThree_toTwo”:内部调用ServiceTwo的“serviceTwo接口”

新建SpringCloud父项目

1.新建基于Maven的项目

作为SpringCloud其他子模块的父项目,new->Project,选择基于Maven的项目,填入GroupId和AtrifactId(项目名称)然后创建。

2.父项目不需要写源码,所以删除项目的src文件夹。

3.配置父项目pom.xml中需增加的内容:


1.82021.0.31.2.47


org.springframework.bootspring-boot-starter-parent2.6.8

org.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pomimportcom.alibabafastjson${fastjson.version}

org.springframework.bootspring-boot-maven-plugin

新建Eureka服务中心模块

Eureka服务中心子项目,作用是作为Eureka服务程序,管理其他微服务的状态。

1.在父项目中,新建子模块项目:new->Module依然选择maven项目。

Eureka服务中心项目名称我们命名为EurekaService。

配置文件

  1. Eureka的pom.xml中新增对Eureka的依赖包和maven打包插件:

org.springframework.cloudspring-cloud-starter-netflix-eureka-server
org.springframework.bootspring-boot-starter-web

配置Eureka服务中心的application.yml配置文件

下面是文字版本的,便于拷贝

server:
port: 8001

eureka:
instance:
hostname: 127.0.0.1
client:
#由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己
register-with-eureka: false
#由于注册中心的职责是维护服务器示例,它不需要去检索服务,所以设置为false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
spring:
application:
name: service-eureka

主类main方法:

创建三个微服务子模块并注册为Eureka客户端

创建三个Eureka客户端子项目

我们创建3个Eureka客户端子项目,命名为ServiceOne、ServiceTwo、ServiceThree。它们的配置都基本一致。

①ServiceOne:在Eureka中注册为客户端,提供一个业务接口:http://127.0.0.1:8001/serviceOne

②ServiceTwo:在Eureka中注册为客户端,提供一个业务接口:http://127.0.0.1:8002/serviceTwo

③ServiceThree:在Eureka中注册为客户端,提供两个业务接口(内部调用ServiceOne和ServiceTwo的接口):

http://127.0.0.1:8003/serviceThree_toOne

http://127.0.0.1:8003/serviceThree_toTwo

配置Eureka客户端子项目的pom.xml

三个子项目pom.xml的依赖包完全一致:




org.springframework.cloud
spring-cloud-starter-netflix-eureka-client


org.springframework.boot
spring-boot-starter-web


com.alibaba
fastjson

配置三个子项目的application.yml

三个子项目的application.yml配置文件基本一样:

  1. ServiceOne的application.yml

  1. ServiceTwo的application.yml

  1. ServiceThree的application.yml

三个子项目的主类main方法

  1. ServiceOne的主类(与ServiceTwo基本一致)

  1. ServiceTwo的主类(与ServiceOne基本一致)

  1. ServiceThree的主类,略有不同,需配置RestTemplate的Bean

三个子项目的Controller控制器

  1. ServiceOne的控制器(与ServiceTwo基本一致)

  1. ServiceTwo的控制器(与ServiceOne基本一致)

  1. ServiceThree的控制器

与前两个略有不同,需注入主类配置的RestTemplate,通过它内部调用微服务ServiceOne和ServiceTwo的业务接口

package com.tjetc.controller;import com.alibaba.fastjson.JSONObject;
import com.netflix.discovery.converters.Auto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestControllerpublic class ServiceThreeController {@Autowiredprivate RestTemplate restTemplate;/*** http请求serviceOne的url并接收返回值* @return*/@RequestMapping("serviceThree_toOne")public JSONObject serviceThreeToOne() {//restTemplate发出get请求String result = restTemplate.getForObject("http:127.0.0.1:8001/serviceOne", String.class);JSONObject jsonObject = new JSONObject();jsonObject.put("code", "200");jsonObject.put("msg", "service three to one, return msg");jsonObject.put("data", result);return jsonObject;}@RequestMapping("serviceThree_toTwo")public JSONObject serviceThreeToTwo() {String result = restTemplate.getForObject("http:127.0.0.1:8002/serviceTwo", String.class);JSONObject jsonObject = new JSONObject();jsonObject.put("code", "200");jsonObject.put("msg", "service three to two, return msg");jsonObject.put("data", result);return jsonObject;}@RequestMapping("serviceThree")public JSONObject serviceThree() {JSONObject jsonObject = new JSONObject();jsonObject.put("code", "200");jsonObject.put("msg", "service three, return msg");return jsonObject;}
}

结果验证

1.按顺序启动各个子项目

先启动EurekaService子项目,它是Eureka服务器,其他子模块都需作为Eureka客户端在它上面进行注册!

再启动ServiceOne、ServiceTwo和ServiceThree,启动后如下图:

2.进入Eureka服务状态页面,查看服务注册情况

在谷歌浏览器中输入:http://127.0.0.1:8000/,进入Eureka服务页面,我们主要查看当前注册情况:

如上图所示,三个Eureka客户端子项目都注册成功。

3.验证ServiceOne的接口

在浏览器地址栏或者PostMan中请求ServiceOne的接口地址http://127.0.0.1:8001/serviceOne,验证请求结果:

5.验证ServiceThree包装的接口

在浏览器地址栏或者PostMan中请求ServiceThree的两个接口地址。

①http://127.0.0.1:8003/serviceThree_toOne,验证请求结果:

如上图所示,其内部成功的调用了ServiceOne提供的接口。

②http://127.0.0.1:8003/serviceThree_toTwo,验证请求结果:

如上图所示,其内部成功的调用了ServiceTwo提供的接口。

Ribbon-负载均衡

Ribbon简介

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。

负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。

常见的负载均衡有软件Nginx,LVS,硬件 F5等。

相应的在中间件,例如:dubbo和SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义。

Ribbon在工作时分成两步:

第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.

第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。

其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。

Ribbon代码编写

模仿ServiceOne子项目“复制”出ServiceOneCopy子项目

在上面eureka项目中,把service1的项目复制一下,取名ServiceOneCopy.ServiceOneCopy的作用是对ServiceOne提供的业务进行分流,因此我们把ServiceOne中的所有内容全部复制到新项目中一份,包括:pom.xml、application.yml、SpringBoot应用主类“ServiceOneApplication”和业务控制器“ServiceOneController”:然后再做接下来的修改。

修改application.yml

ServiceOne中也作了说明:由于在ServiceThree中开启了ribbon负载均衡后,需要通过ServiceOne的“应用名称”而不是IP+端口号访问业务接口,因此我们要把需要负载均衡的业务模块,其应用名称保持一致!

注意,改下端口,改成8004

修改SpringBoot应用主类名称

在idea中直接运行项目时,会按主类的名称作为SpringBoot启动栏目的名称,因此我们需要把主类名称修改一下,我们修改为:“ServiceOneCopyApplication”。

修改业务接口的响应结果

我们要分流ServiceOne的业务方法“serviceOne”,因此方法本身不能做改变(方法名、参数、返回结果格式),但为了验证分流的结果,我们在返回的响应结果中增加了“copy”字样文字:

http://127.0.0.1:8004/serviceOne

http://127.0.0.1:8000/

修改ServiceThree子项目

我们需要在ServiceThree中开启ribbon的负载均衡功能,由于ribbon依赖包已被Eureka引用,因此我们无需引入任何新依赖包,所以不需要修改pom.xml文件。

application.yml文件也不做任何修改。

下面对需要修改的两处进行说明:

  1. 修改SpringBoot应用主类,提供负载均衡能力

我们在“ServiceThreeApplication”主类中,给RestTemplate的Bean方法上添加@LoadBalanced注解,给RestTemplate对象开启ribbon负载均衡能力。

之后RestTemplate发送请求时,就会自动进行请求的分流。

  1. 修改请求其他内部业务接口的调用方式

由于需要对某一业务接口“负载均衡”,那么我们就不能再使用原先的IP+端口号的方式调用了,否则还是会把请求指定到一个部署的服务中。

ribbon的负载均衡是通过使用“应用程序名”来代替IP+端口号,来调用业务接口的。

因此我们需要在控制器中修改调用ServieOne的业务接口方式:

从:http://127.0.0.1:8001/serviceOne

修改为:http://service-one/serviceOne

结果验证

  1. 按顺序启动各个子项目

先启动EurekaService子项目,它是Eureka服务器,其他子模块都需作为Eureka客户端在它上面进行注册!

再启动ServiceOne、ServiceOneCopy、ServiceTwo和ServiceThree,启动后如下图:

  1. 进入Eureka服务状态页面,查看服务注册情况

在谷歌浏览器中输入:http://127.0.0.1:8000/,进入Eureka服务页面,我们主要查看当前注册情况:

如上图所示,名为“service-one”的微服务,在Eureka中注册数量为2,一个是ServiceOne启动的实例、另一个是ServiceOneCopy启动的实例。

  1. 验证ServiceThree的接口,验证负载均衡情况

在浏览器地址栏或者PostMan中重复请求ServiceThree的接口地址:

http://127.0.0.1:8003/serviceThree_toOne

第一次调用:

第二次调用:

如上图所示,其内部成功的调用了ServiceOne提供的接口,并负载均衡分流至了两个模块!

参考文章:

https://blog.csdn.net/weixin_45701868/article/details/125738876


推荐阅读
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
author-avatar
ude816
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有